(添加了CRC和重发)分享一个自己写的IAP程序,基于mini,欢迎拍砖

2019-07-21 01:42发布

 添加了CRC 和重复功能,帖子太长了,传到楼下出啦
  注意使用的是keil5.11a


    自己根据开发指南写的一个IAP程序。在mini板上成功跑一个app。因为RB是128K的flash,所以将rom分割为 27K 1K 100K。其中27K 用来存储IAP。1K 用来存储一些信息,目前暂未使用到。100K就是app用的啦。

    IAP程序的大致流程是这样的,上电后,在5s内(实际测试发现大于5s,暂时不管这个误差),轮询串口是否发送:updata;(update这个可以随意,保证:;中间有6个字母就好)。如果超时没有收到:update;那么程序跳转到app,如果没有app,或者app出错,红灯常亮。如果收到:update;那么进入烧写程序。这时候,串口转为中断方式接收数据。
    
    烧录形式是这样的。按照1K,1K大小烧录,需要对bin文件进行分割。开辟了一个串口缓存,大小为1K+8。发送格式是这样子的,

    data_len_L  data_len_H  data(no more than 1K)   index_L index_H CRC

    index_L index_H CRC(4B)这六位暂时没用到,填充00,data_len为要写入数据长度,最大不会超过1K。

    目前IAP编译后才7K,还可以加入更多功能,预计加入STM32的CRC。app的bin文件需要自己分割,可以使用winHex,然后使用XCOM V2.0来发送,,我准备写个上位机用来传输bin,这样就不用自己分割bin了。


    欢迎各位,给建议,好丰富这个IAP。

    另外,app的做法,请参考开发指南。


——————————————————————————————————————————————————————————————————————————————
刚刚画好的上位机UI,样子很挫,始终想不出好的界面样子


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
弄了几天,终于把上位机弄好了。qt写的。测试可以用。
写完最大的感受就是,让C++单身了。完全还是安装面向过程的方法写的。不多说,附图,附源码。


伪扁平化设计


另外,使用新版本的keil编译老版本出现一个报错,双击跳转到stm32F1xx.h,可能是重复定义


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
寒寒
1楼-- · 2019-07-23 12:32
回复【19楼】suoyiman:
---------------------------------
哪个,上位机,可以到这里下    https://github.com/hanfengcan/IAP_Load
寒寒
2楼-- · 2019-07-23 15:59
 精彩回答 2  元偷偷看……
寒寒
3楼-- · 2019-07-23 19:50
继续捣鼓了一下,添加了CRC校验和重发功能,jtag调试的时候,强制修改串口buf某个值,来使crc不一致,可以实现重发。
CRC:使用STM32自带的CRC。因为是硬件CRC,所以和网上普遍的 RAR之类的CRC是不一样的。找了很久在百科上找到一份,copy了下来用。不过这个crc在大小端上有出入。幸好M3有个rev指令,将int的高地字节互转。才搞定了两边计算结果的CRC值。

[mw_shl_code=c,true]uint8_t CRC_GetVal(uint32_t *pdata, uint16_t len , uint32_t CRC_Val) { uint32_t temp; len -= 1; CRC_ResetDR(); //复位CRC,否则会将上次结果作为初值计算 while(len) { temp = __rev(*pdata); //在一个32位reg中翻转字节顺序 CRC->DR = temp; *pdata++; len--; } if(CRC_Val != CRC->DR)return 0; return 1; }[/mw_shl_code] 这里使用时,传入的是char类型,利用指针,从而不用手动将4字节转换为int。但是要注意大小端问题。
重发功能只是在计算CRC前,强制修改了buf里面的某个值,测试可以用。



关于上位机,已同步到github上面,地址看一楼。

代码越写越乱了。需要的朋友,将就着用吧。
lijunlinv
4楼-- · 2019-07-23 21:03
想使用GPRS 远程升级,不知道楼主有好的办法吗或者工程案例?
寒寒
5楼-- · 2019-07-24 02:29
回复【23楼】lijunlinv:
---------------------------------
可以将固件先转存到外扩的flash上,然后在使用IAP。固件通过GPRS传送。外扩flash保存上一次成功升级的固件,和本次传送固件。如果本次升级失败,可以刷回上一次固件
lijunlinv
6楼-- · 2019-07-24 03:44
 精彩回答 2  元偷偷看……

一周热门 更多>