前阵子,老大说串口升级协议都已经写好了,你们按着协议标准来做就行了,之前的项目都要加上升级功能,最近项目做的差不多了,琢磨着把这功能加上吧,参考这位大牛的博客:片机ISP、IAP和ICP几种烧录方式的区别http://www.eeworld.com.cn/mcu/2014/0819/article_15976.html ,I
然后开始看那部分的代码,就是串口发升级指令,设备接收到指令之后,进入到升级模式,用了内部的某个协议,来组包发包,这个放下不表。
大致原理就是 单片机flash 分两个部分一个是LDROM一个是APROM,APROM就是编写应用app.bin存放的地方,LDROM类似引导程序update.bin存放的地方,我没仔细去研究,回头研究清楚了,这部分再改,升级功能做法是将串口升级的部分程序烧写到LDROM中,将写的应用程序烧写到APROM中,应用程序监听串口,串口收到升级指令之后,做如下操作
void updateprepare(void) { uint32_t APROM_SIZE,Flag,SetBaudRate; SYS_UnlockReg(); FMC_Open(); FMC_ENABLE_AP_UPDATE(); APROM_SIZE = GetApromSize(); Flag = APROM_TO_LDROM; FMC_Write(APROM_SIZE-8,Flag); Flag = 0; Flag = FMC_Read(APROM_SIZE-8); if((Flag & APROM_TO_LDROM_MSK) != APROM_TO_LDROM){ return; } FMC_DISABLE_AP_UPDATE(); FMC_Close(); SYS_LockReg(); }
类似使能升级,然后获取大小,将一个标志写到最后(64K最后),然后再把标准读出来,(验证能否读写?),然后RESETCHIP,单片机重启就会自动跳转到升级程序,update.bin中去,电脑把要升级的app.bin发送到串口中去,update.bin就会接收这个文件然后写到APROM中去,
中间卡住了一段时间,就是升级程序要求生成的ap.bin大小是64K,可实际的的大小只有17K的样子,搞不清楚怎么实现的,看了下代码是在startup_NUC029xAN.s中最后添加了
AREA |.ARM.__AT_0xfffc|, CODE, READONLY DCD 0x55aa5aa5
这两行代码,设定变量或数组到指定的位置,就是在0xfffc后定义一个变量为0x55aa5aa5,然后再编译去发现不能生成app.bin,却生成了app.bin文件夹,里面有两个文件一个是ER$$.ARM.__AT_0xfffc,一个是ER_RO,完全不知道是怎么回事,在网上搜了一下才知道http://bbs.csdn.net/topics/390240567,需要修改编译方式按照前面网页上的说法 “
fromelf --bincombined --bincombined_base=0x00003000 --output .DebugSAP-2L-JUM.bin .DebugSAP-2L-JUM.axf “
"上述定义会生成三个bin 文件,分别是RO_CODE, RO_DATA, RW_DATA.
如果使用 --m32combined 或 --i32combined 选项转换包含多个加载区的 ELF 映像,则 fromelf 会创建一个名为 destination 的输出目录,并为输入映像中的所有加载区生成一个二进制输出文件,然后将该输出文件放置在 destination 目录中。"
使用--bincombined 选项就可以生成一个64K的app.bin文件了,至此问题解决了