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

STM32 SPI Flash DFU

发布时间:2020-12-15 17:47:34 所属栏目:百科 来源:网络整理
导读:这次讲的是将程序、图片或其他文件下载到SPI Flash中。我使用的是W25X16的SPI Flash,他共有2MB空间,2个Block,512ge Sector,8096个Page。由于SPI Flash不能直接跑程序,我们从接口就知道了。 接下去我们就来讲讲怎么编写SPI flash的升级功能。这次的工程是
这次讲的是将程序、图片或其他文件下载到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空间全部设置成可读可写可擦除。

/*接口字符串描述符*/ uint8_t DFU_StringInterface0[DFU_SIZ_STRING_INTERFACE0] = { DFU_SIZ_STRING_INTERFACE0, 0x03 //Interface 1: "@ SPI Flash: W25X16 /0x00000000/1*2048kg '@'0 'S''P''I'' ''F''l''a''s' /*18*/ 'h'':''W''2''5''X''1''6'/*20*/ '/''0''x'/*22*/ '*''4''8''K''g'0};

接下去,添加我们的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 读写是否正确了。

DeviceState; DeviceStatus[6]; u8 WRITE_Buffer[]="神舟III号 SPI 读写访问程序"//spi flash写入数据缓存 u8 WRITE_Buffer1"神舟I号 SPI 读写访问程序"u8 READ_Buffer[sizeofWRITE_Buffer)];//spi flash读出数据缓存 /******************************************************** 函数:main() 描述:程序入口地址 参数:无 返回:无 ********************************************************/ int main BSP_Init" |===============================================|rn"" STM32 DFU 程序开始 rn""|===============================================|rn" u32 i iSPI_Flash_ReadID//读取spi flash的芯片ID,一定要读,否则读写会出错 "ID:%xrn"i/* Enter DFU mode */ DeviceState STATE_dfuERROR//程序指向到这句话,说明DFU跳转不成功 STATUS_ERRFIRMWARE4 USB_Configuration//初始化USB while() ifKEY1_STATE()==//按键1按下,则向spi flash写入数据 "开始写入W25X16 SPI FLASH芯片!rn" SPI_Flash_Erase_Sector)); "写入完成!rn"KEY2_STATE//按键2按下,读出spi flash的数据 "开始从W25X16 SPI FLASH芯片中读取数据!rn"READ_Buffer"读取完成,读书的数据为:rn%srn"KEY3_STATE//按键3按下,擦除整块spi flash数据 u8 i"正在擦除W25X16 SPI FLASH芯片!rn"); // SPI_Flash_Erase_Chip(); "擦除完毕!rn"for=< READ_Buffer]=KEY4_STATEWRITE_Buffer1} }


这个工程需要注意的是 *.dfu文件的制作,因为spi flash是外界的存储器,所以与单片机存储地址独立编址,即从0x00000000地址开始到0x001fffffff结束,所以在制作.dfu的时候,千万要设置地址在这个范围内。

(编辑:李大同)

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

    推荐文章
      热点阅读