赞
踩
bootloader的实用性非常吸引我,本来想采用Fat文件系统做bin文件的存储,奈何硬件设备大小不够,只好裸奔。
bin文件通过串口烧录,这里没有什么难点,就是采用串口中断接收文件,不过进行数据存储的时候要注意flash分配格式,本次采用的W25Q16每页内存大小为256byte,共有2M存储空间。所以要保证连续存储的情况下,必须分段存储,每当接收到256byte时存储一次,转下下一个地址进行存储,比方说第一次选用的起始地址为0x00,第二次选用的地址则为0x100,每次递增0x100个长度。
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地址
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。