加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

STM32 Nor Flash DFU

发布时间:2020-12-15 17:47:35 所属栏目:百科 来源:网络整理
导读:这次要讲讲怎么实现Nor Flash的升级。 Nor Flash的DFU工程还是基于之前的flash DFU的工程上修改而来。工程的目录如下: ? 我使用的Nor Flash芯片是M29W128F, 该芯片共有128Mb的空间,通过FSMC挂接在BANK0。 正好在UBS的官方程序里也有使用芯片的例子,所以
这次要讲讲怎么实现Nor Flash的升级。
Nor Flash的DFU工程还是基于之前的flash DFU的工程上修改而来。工程的目录如下:

?
我使用的Nor Flash芯片是M29W128F, 该芯片共有128Mb的空间,通过FSMC挂接在BANK0。 正好在UBS的官方程序里也有使用芯片的例子,所以也就是说管方的Nor Flash的驱动代码是使用 M29W128F这款芯片的。所以我们需要从拷贝fsmc_nor.c和fsmc_nor,h这两个文件添加到我们的USB_User这个组中。还要讲我们之前的flash_if文件修改为nor_if名。这样工程的文件就算齐了,下面就讲讲怎么修改个文件。
首先hw_config、usb_istr、usb_prop、usb_pwr这些个文件不需要修改。最新需要修该的文件是usb_desc.c这个文件的接口描述符,上面说过了,我们使用的Nor Flash芯片是M29W128,总空间为128Mb,即16MB。我设置这些空间都可读可写可擦除,并以64K为单位,所以接口描述符如下:

/*接口字符串描述符*/ uint8_t DFU_StringInterface0[DFU_SIZ_STRING_INTERFACE0] = { DFU_SIZ_STRING_INTERFACE0, 0x03 //Interface 0: "@ NOR Flash: M29W128F /0x64000000/256*064Kg" '@'0'N''O''R'' ''F''l''a''s' /*18*/ 'h'':''M''2''9''W''1''8'/*24*/ '/''0''x''6''4'/*22*/ '5''*''K''g'0/*20*/ };

接下去需要修改的是nor_if.c这个文件,这个文件是介于驱动和MAL层之间的桥梁。这个文件主要是进一步封装一下nor flash的底层驱动程序。这款需要定义NOR_If_Init()、NOR_If_Erase()、NOR_If_Write()、NOR_If_Read()这4个函数,都是调用驱动代码的相关函数:
/******************************************************************************* * Function Name : NOR_If_Init * Description : Initializes the Media on the STM32 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t NOR_If_Init(void) FSMC_NOR_Init(); return MAL_OK; } * Function Name : NOR_If_Erase * Description : Erase sector NOR_If_Erase(uint32_t Address printf("正在擦除Nor Flashrn"); /* Erase the destination memory */ FSMC_NOR_EraseBlockAddress&0x00FFFFFF);"擦除成功rn"* Function Name : NOR_If_Write * Description : Write sectors NOR_If_WriteDataLengthif((DataLength1)==/* Not an aligned data */ +=; MAL_Buffer[-=0xFF} "向0x%x地址处写入%d个字节rn" FSMC_NOR_WriteBuffer*)MAL_Buffer&),0)">>>* Function Name : NOR_If_Read * Description : Read sectors * Return : buffer address pointer *NOR_If_Read"在0x%x地址处读出%d个字节数据rn"uint8_t*)(); }

再接下去就是dfu_mal.c媒体接入层的函数了。这个文件也只定义了5个函数:MAL_Init()、MAL_Erase()、MAL_Write()、MAL_Read()、MAL_GetStatus(),这些函数基本上是调用nor_if.c中定义的相关函数:

(*pMAL_Init); pMAL_EraseSectorAddresspMAL_Write*(*pMAL_ReadwTransferSize];/* RAM Buffer for Downloaded Data */ NOR_IDTypeDef NOR_ID; extern ONE_DESCRIPTOR DFU_String_Descriptor[7]; staticconstTimingTable3][2{/* 扇区擦写时间,扇区编程时间*/ SPI_FLASH_SECTOR_ERASE_TIME SPI_FLASH_SECTOR_WRITE_TIME },0)">/* SPI Flash */ M29W128F_SECTOR_ERASE_TIME M29W128F_SECTOR_WRITE_TIME /* NOR Flash M29W128F */ INTERN_FLASH_SECTOR_ERASE_TIME INTERN_FLASH_SECTOR_WRITE_TIME /* Internal Flash */ }; * Function Name : MAL_Init * Description : STM32初始化的媒体初始化 MAL_Init(); FSMC_NOR_ReadID(&NOR_ID" Nor Flash ID:0x%x 0x%xrn".Manufacturer_CodeDevice_Code1 FSMC_NOR_ReturnToReadMode* Function Name : MAL_Erase * Description : 擦除扇区 MAL_Erase{ switchSectorAddress MAL_MASK//参看地址 case NOR_FLASH_BASE: pMAL_Erase break;default MAL_FAIL pMAL_Erase//指向擦除函数 * Function Name : MAL_Write * Description : 写扇区 MAL_Write //查看地址 pMAL_Write pMAL_Write);//调用写扇区函数 * Function Name : MAL_Read * Description : 度扇区 * Return : Buffer pointer MAL_Read pMAL_Read NOR_If_Read//调用如扇区函数 * Function Name : MAL_GetStatus * Description : 获取状态 * Return : MAL_OK MAL_GetStatusCmdbuffer//更具地址查找定时表的对应的选项 x 260x03/* 0x000000000 --> 0 SPI Flash*/ /* 0x640000000 --> 1 Nor Flash*/ /* 0x080000000 --> 2 Internal Flash*/ y Cmd0x01 SET_POLLING_TIMINGx][y]);/* x: 擦除/写 定时 */ /* y: Media */ }

最后,我们在main中定义一些测试Nor Flash的一些代码, 按键1按下擦写0x64000000地址开始的那个扇区数据; 按键2按下表示向spi flash的0地址写入一组数据; 按键3按下表示表示向spi flash的0地址写入另一组数据; 按键4按下表示读取0地址开始的数据:

u16 TxBuffer08]={0x00000x00020x00040x000800x00100x00200x00400x0080}; TxBuffer10x01000x02000x04000x080000x10000x20000x40000x8000RxBuffer];

int main u8 i= BSP_Init" |===============================================|rn"" STM32 DFU 程序开始 rn""|===============================================|rn"/* Enter DFU mode */ DeviceState STATE_dfuERROR//程序指向到这句话,说明DFU跳转不成功 DeviceStatus STATUS_ERRFIRMWARE4DeviceState USB_Configuration//初始化USB while() if(!KEY1_STATE()) ()); "正在擦除Nor Flash!rn""擦除成功!rn"KEY2_STATE i"正在擦除,请稍等...rn""擦除完毕,正在写入!""向Nor Flash写入的数据为:rn"(i--) "0x%x "]); "rn数据写入完毕!rn"KEY3_STATE} KEY4_STATE"正在读取数据...rn" FSMC_NOR_ReadBuffer"读出来的数据为:rn""rn数据读取完毕!rn"}} }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读