STM32 SPI Flash DFU
这次讲的是将程序、图片或其他文件下载到SPI Flash中。我使用的是W25X16的SPI Flash,他共有2MB空间,2个Block,512ge Sector,8096个Page。由于SPI Flash不能直接跑程序,我们从接口就知道了。
接下去我们就来讲讲怎么编写SPI flash的升级功能。这次的工程是基于之前的Internal Flash修改而来的。修改的部分主要在USB_User组里:
hw_config.c、usb_istr.c、usb_prop.c、usb_pwr.c这介个文件没有什么还修改的。usb_desc.c文件需要修改下接口字符串描述符,由于我们的SPI Flash空间2M,所以我们将SPI Flash的2M空间全部设置成可读可写可擦除。
接下去,添加我们的W25X16 SPI Flash的驱动代码spi_flash.c,这个代码可以网上下载。接下去将上个工程里的flash—_if.c文件修改成spi_if.c,并修改里面的函数: /******************************************************************************* * Function Name : SPI_If_Init * Description : Initializes the Media on the STM32 * Input : None * Output : None * Return : None *******************************************************************************/ uint16_t SPI_If_Init(void) SPI_Flash_Init(); return MAL_OK; } * Function Name : SPI_If_Erase * Description : Erase sector SPI_If_Erase(uint32_t SectorAddress printf("正在擦除SPI Flash...rn"); SPI_Flash_Erase_Chip(); // SPI_Flash_Erase_Sector(SectorAddress); "擦除成功!rn"* Function Name : SPI_If_Write * Description : Write sectors SPI_If_WriteDataLength idx pages; "SPI_IFWrite写入数据长度为%drn" pages =(((DataLength&0xFF00))>>8); if0xFF)/* Not a 256 aligned data */ for( idx ;<((+0x100++)// idx = DataLength; idx < ((DataLength & 0xFF00) + 0x100) ; idx++ MAL_Bufferidx} 81} idx ++) "正在向0x%x地址写数据rn" SPI_Flash_Write(&MAL_Buffer*256],102)">SectorAddress+=* Function Name : SPI_If_Read * Description : Read sectors * Return : buffer address pointer *SPI_If_Read"正在读取地址0x%x处开始的%d个数据rn" SPI_Flash_Readuint16_t)}然后要修改的是dfu_mal.c这个文件。修改成如下就可以了: * Function Name : MAL_Init * Description : STM32初始化的媒体初始化 MAL_Init();/* SPI Flash */ * Function Name : MAL_Erase * Description : 擦除扇区 MAL_Erase{ switch MAL_MASK//参看地址 case SPI_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 SPI_If_Read//调用如扇区函数 * Function Name : MAL_GetStatus * Description : 获取状态 * Return : MAL_OK MAL_GetStatusCmdbuffer{//更具地址查找定时表的对应的选项 x 260x03/* 0x000000000 --> 0 */ /* 0x640000000 --> 1 */ /* 0x080000000 --> 2 */ y Cmd0x01 SET_POLLING_TIMINGTimingTablex][y]);/* x: 擦除/写 定时 */ /* y: Media */ }最后的话,就是我们的main函数了,这里的main函数当然没有程序跳转了,我在这里用到了4个按键,
WAKEUP按键(PA0)按下表示向spi flash的0地址写入一组数据
TAMPER按键(PC13)按下表示读取0地址开始的数据
USER1按键(PA8)按下表示擦写0地址开始的那个扇区数据
USER2按键(PD3)按下表示向spi flash的0地址写入另一组数据
这样的话,就可以试试检测spi flash 读写是否正确了。
这个工程需要注意的是 *.dfu文件的制作,因为spi flash是外界的存储器,所以与单片机存储地址独立编址,即从0x00000000地址开始到0x001fffffff结束,所以在制作.dfu的时候,千万要设置地址在这个范围内。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |