唠叨两句,IAP功能应该是嵌入式开发中最常用的功能,而且这玩意开发完后可以后期无限复用,之前接触的IAP功能都是基于串口功能开发的,但是在比较安全的场景下,比如说在汽车里,一般都是通过UDS诊断服务进行相应的ECU刷写工作,作为普通的产品开发,也没必要用到那么复杂的逻辑,毕竟满足功能是最主要的,反正我们也不用进行汽车安全等级测试,所以我们这次稍微借鉴一下车里的通信方式,采用 CAN 通信的模式进行IAP升级,废话说了这么多,开干!

一、准备工作

ARM板:STM32F405RGT6,FLASH–1024KB,基本上能满足各种功能开发需求
LINUX:**X86架构(i3系统)及ARM架构(Xavier NX)**均测试通过,主要能在系统内正常调用CAN设备即可

二、IAP系统开发

2.1 IAP简介

IAP简单来说,就是通过软件实现在线电擦除和编程的方法。IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将程序从一个存储体转向另一个。通过调整程序的起始地址,可以启动不同的系统程序。

2.2 IAP下位机开发

2.2.1 刷写文件选择

在一般的嵌入式开发中,除了通过IDE下载程序,一般使用HEX、BIN、S19文件进行刷写,HEX文件主要通过FlyMCU程序进行刷写,这是一个特别常用的功能,IAP中的Bootloader程序倒是可以用这种方式刷写,不过我们的关注点主要在APP程序上,APP程序在IAP功能中一般使用BIN文件或S19文件进行刷写,在安全性上来说,S19文件更为安全,但是,我们使用Keil开发,在这种情况下,BIN文件是一个较为方便的选择, 因为通过Keil可以直接生成BIN文件,这为我们刷写APP提供了极大的便利。

2.2.2 Bootloader程序框架

本系统STM32F405RGT6Flash分布
Flash
Bootloader程序应该算是IAP的核心,主要实现的功能包括通信接口的初始化、FLASH的操作、通信协议的制定及程序完善,说句题外话,正点原子上有很多可以借鉴的开发例程,哪怕例程功能距离你的开发功能有很大的差距,也可以从中找到相应的解决办法。

先说一下设计思路,Bootloader程序初始化首先检测内部FLASH程序标志位区域,根据标志位的不同进入Bootloader程序或APP程序,然后就是设置系统中断优先级分组,时钟初始化,CAN通信接口初始化,如果需要串口进行辅助开发,可以顺便初始化串口,不过一般CAN也可以实现这点功能。

2.2.3 Bootloader程序开发

2.2.3.1 Bootloader Keil设置

KEIL Target设置
target
Bootloader程序预留64K,KEIL Target设置如上图所示。

Bootloader程序下载地址范围
setting
依次点击Utilities —Setting,修改Bootloader程序下载地址范围如上图所示。

2.2.3.2 APP Keil设置

KEIL Target设置
在这里插入图片描述
APP程序预留448K,KEIL Target设置如上图所示。

中断向量表的重设
在这里插入图片描述
.bin文件生成
通过MDK自带的格式转换工具fromelf.exe,来实现.axf文件到.bin文件的转换。
fromelf.exe转换工具的语法格式为:fromelf [options] input_file。
通过在MDK点击Options for TargetUser选项卡,在After Build/Rebuild栏,勾选Run #1,并写入:C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe –bin -o …\OBJ*.bin …\OBJ*.axf
MDK安装目录与程序名称请根据自己实际情况修改。

2.2.4 Bootloader通信协议

其实系统来说,这种功能的开发是使用查询式通信进行开发,也就是一路ID查询,另一路ID反馈,包括文件的传输也应该使用这种方式,可惜呢技术不到家,我采用了三种ID来实现该功能,首先两路ID Bcast_Add_ID + CMD_ACK_ID 实现IAP功能的查询及反馈,还有一路ID Boot_Add_ID 用来单独传输文件。其中Bcast_Add_ID + CMD_ACK_ID 使用一路can-fifo,Boot_Add_ID 使用另一路CAN-fifo用来接收文件,避免通信出错,接收文件的方法借鉴了原子哥的Uart接收bin文件的方法,我就不多啰嗦了。
IAP的查询式通信借鉴了汽车UDS的诊断服务,使用20/21/22/23等服务实现不同的功能。
例:20服务—01功能
Bcast_Add_ID Tx:20 01 02 00 02 00 00 00 (设定版本)
CMD_ACK_ID Rx:60 20 01 00 00 00 00 00 (设定成功返回)
CMD_ACK_ID Rx:80 20 01 00 00 00 00 00 (设定错误返回)

2.2.5 APP程序开发

APP程序开发中,除了前面介绍的重设中断向量外,一定要注意中断的有效性, 刚开始开发时大意的以为printf输出不同的参考值就以为开发完成了,结果中断全部失效。
在通信中断里设置APP程序跳转时不要直接使用IAP跳转程序,最好设置一个标志位,在主循环中根据标志位的不同进行程序跳转,而对于直接重启Bootloader程序,既可以使用标志位跳转,也可以使用NVIC_SystemReset() 函数进行跳转。

2.3 IAP上位机开发

IAP上位机其实只是简单开发实现功能,IDE使用的VSCode。

bin--------------生成可执行文件
build-----------执行cmake … & make
include--------头文件
src-------------cpp文件
setting--------config文件
update--------升级bin文件
框架
开发时主要注意下bin文件以及cfg文件的读取,其他的就是正常处理CAN通信功能。

can_start.sh
sh

2.4 IAP系统功能测试

上位机测试:
上位机
CAN Test数据查看
can

三、总结总结总结总

本系统安全性存在隐患,如介意请勿参考,文件的传输可以使用YModem协议,如果感兴趣可以自己查找资料开发,总之,就这样吧~
黎明就在眼前

Logo

更多推荐