SPI_FLASH实现bootloader

       bootloader的实用性非常吸引我,本来想采用Fat文件系统做bin文件的存储,奈何硬件设备大小不够,只好裸奔。

  bin文件通过串口烧录,这里没有什么难点,就是采用串口中断接收文件,不过进行数据存储的时候要注意flash分配格式,本次采用的W25Q16每页内存大小为256byte,共有2M存储空间。所以要保证连续存储的情况下,必须分段存储,每当接收到256byte时存储一次,转下下一个地址进行存储,比方说第一次选用的起始地址为0x00,第二次选用的地址则为0x100,每次递增0x100个长度。 

SPI_FLASH实现bootloader_第1张图片
存储格式如上图所示。
        数据存储至spiflash后,接下来就是读取操作了,同理分页读取。不过得即时将读取到的数据写入至rom中,写入rom的api借口所定义的是一个uint_32的字符类型,从spiflash中读取的数据仅仅是uint_8类型字符,做一个字符转换,将4个uint_8字符集合至一个uint_32中,转换过程中要注意大端小端,不过stm32是小端模式,低地址对应低字节。

2014.9.24 Bootloader终于完成了。

总结一下,有几点需要注意的地方。

        1、串口接收:

        关于串口中断接收的问题,其实困扰了挺久的,刚开始我在串口接收的时候检测数据,每当数据达到256byte时候,开始向flash写入数据,结果导致一个非常严重的问题,串口丢帧丢的厉害。后来想开了,通过定义一个uint_32数组和一个uint_8数据来进行存储数据,将串口的接收的数据存储的数据保存在uint_8数组中,每当接收超过4个byte时,将原来uint_8数组中的数保存至uint_32数组中,通过移位操作来实现。

        2、bin文件烧写

        这个地方也困扰了很久,使用的是STM32ZE芯片,我知道它烧写的时候是小端模式,但是没想到的是,通常这是在烧写16位数的时候,当我使用32位数据烧写的时候,问题就来了,加入数据分布是“Rx_Buffer[0]”,“Rx_Buffer[1]”,“Rx_Buffer[2]”,“Rx_Buffer[3]”,这四个八位的数构成一个32位数,那我们组合成将要烧写的数时,就得这样组合:buffer_com0[addr_com] = (Rx_Buffer[0])+(Rx_Buffer[1]<<8)+(Rx_Buffer[2]<<16)+(Rx_Buffer[3]<<24);也就是说第四位数所在的位置其实是烧写的低地址,也就是uint_32数开始烧写的位置,这个可以通过反向读地址可以查看、读写命令为:data=(*(__IO uint32_t*) addr);//addr为所要读写的flash地址


你可能感兴趣的:(Stm32)