发表于: 2016-1-21 15:50:51 | 显示全部楼层

最近在帮同事整一个bootloader程序跟着后面边看边学,然后试着改点东西,感觉也学到不少东西,那个bootloader工程基本已经完工啦,具体内容可以参考参考这个文档:

https://community.freescale.com/docs/DOC-328168

Kinetis官方社区的,所以用英文写的咯。。。简单点说,就是在485总线上利用一个类似于modbus通信协议实现多机同步烧写,PC作主,由GUI控制,GUI先解析应用程序的FLASH文件,目前支持S19、HEX和bin,然后把数据打包成数据帧发送给从机,每个从机都会有一个编号,当然主机发送的数据帧也含有编号信息,这样就可以更新相应编号的从机应用程序了。

100001081865.png

感兴趣的话去啃原文吧。当然这个bootloader协议做得比较简单啦,如果有需要的话可以参考这个定制自己的。这个Bootloader的设计亮点主要是在bootloader与APP的交互上。APP在编译时在RAM空间的最末端预留了8个字节,如果需要在APP中跳到bootloader的话,向该RAM区间写特定的值然后软复位,进入bootloader以后bootloader同样检测这个RAM区域的值,如果检测到相应值就进入bootloader程序。当然也有其他进入bootloader模式的条件。额,小广告打完了,下面进入正题,当然也是小菜。。。这里主要用FRDM-K64基于上面的协议做了一个脱机烧写工具,主要是考虑到要大批量更新程序时,搬个笔记本到处跑也不太方便,所以用一块小板子暂时代替下PC机的功能,可以把.bin文件放到mini SD卡中,把K64接到485总线上,通过UART口把文件烧到目标器件中。当然这个做得比那个GUI功能还要简单,也是参考参考。如果有需求的话可以照着这个继续开发,因为如果要做脱机烧写工具的话那数据加密是必须考虑的一个环节。


IDE:IAR 7.40

硬件平台:FRDM-K64 、FRDM-kl26z

软件开发包:Kinetis SDK1.3.0


这里做了一下K64做主,kl26做从的实验,两者通过UART直接接口通信。K64使用UART1,复用PTC3PTC4 ,KL26使用UART0,复用PTE20PTE21,通过FRDM-K64的虚拟串口,可以在PC机上看到K64主机的串口打印信息,当然这些也并不是必须的,只是方便调试的时候用,实际使用时可以通过板子上的RGB三色灯来简单的判定目前程序的工作状态。这里定义:

SW3:开始烧写

SW2:开始校验

蓝灯常亮:初始化成功

蓝灯闪烁:正在烧写程序或正在校验

绿灯常亮:烧写成功或校验成功

红灯常亮:烧写故障或校验出错

程序流程用状态图表示如下:

5100000011-6358691940978100003508730.png


调试中遇到了一个问题就是在串口发送的时候,当想要发送的字节个数大于0x40个后,程序就跑飞了,一直在串口中断里面不出来,仔细研究了一下,发现是堆栈溢出的问题,建议的话如果使用KSDK开发的话,如果遇到些莫名其妙的问题,可以查一查堆栈的使用情况,如图:

0004522449.png

灰色部分是堆栈使用情况,绿色是目前指针所在位置,此栈分配了0x800的空间,使用率83%,而KSDK给的ICF文件默认的堆栈分配空间为0x400,所以如果不注意如果碰到堆栈溢出的话,就很有可能出现一些未知的错误。

打印logo如下:

5100000011-445.png

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 47 | 回复: 68



手机版|

GMT+8, 2024-11-8 03:44 , Processed in 0.056527 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表