前言
Boot很大的一个作用是用来跳转至APP,在汽车行业中,控制器Boot开发跳转至APP之前会检验程序有效性是否存在(一般为固定的4个字节的地址),此外信息安全还会要求安全启动,都是在Boot跳转之前做文章。我们目前使用到的仅仅是Boot在某个状态持续10秒,如果10秒之内没有收到升级内容,就会自动跳转至APP,APP会发送一个串口数据给到上位机,来检测是否跳转成功。
一、Boot和APP的内存分区
本文Boot地址是0x8000000~0x8004FFF共计0x5000个字节大小;APP起始地址是0x8005000。在Keil中通过下面可以修改起始地址和大小:
Boot和APP按照上面的配置号好以后,生成hex文件,会看到hex的起始地址与配置相对应。如何生成hex请把Keil的下面配置打开:
二、Boot跳转APP验证
1. Boot跳转代码
Boot在一个默认的IDLE状态持续10秒,如果没有收到串口报文,跳转至APP,跳转代码如下:
case SERVICE_IDLE:
BootJumpToAppTmr_u16++;//Idle状态,计数器不断累加,10ms任务,当计数器大于1000时执行跳转
if(BootJumpToAppTmr_u16 >= 1000)
{
//jump to app
Jump_To_Application();
}
break;
#define APP_ENTRY_ADDR (0x08005000) // 应用程序的入口地址
typedef void (*BootToApp)(void);
BootToApp jump2app;
// 跳转到应用程序的函数
void Jump_To_Application(void)
{
jump2app = (BootToApp) * (volatile uint32_t *)(APP_ENTRY_ADDR + 4);
__set_MSP(*(volatile uint32_t *)APP_ENTRY_ADDR);
NVIC->ICER[0] = 0xFFFFFFFF; // 禁用所有中断
NVIC->ICPR[0] = 0xFFFFFFFF; // 清除所有中断挂起位
jump2app();
}
2.下载hex
使用下载工具将生成的hex文件下载至单片机中,我这里使用的STM官网下载的STM32 ST LINK Utility,此工具可以下载hex,也可以查看Flash地址的值是否写入以及写入的是否正确。
APP和Boot的hex文件如下:
首先使用ST LINK Utility先擦除整个FLASH区域。
先下载Boot的hex:
再下载APP的hex:
3.跳转验证
以上步骤执行完,Boot等待10秒会自动跳转至APP。可以在APP里面自己建一个跑马灯来验证是否进入APP,我这里也有跑马灯,只是演示不是很方便,就用串口报文来验证了。
4.如何使用一个hex来验证
烧写两步有点繁琐,能不能使用一个hex来进行验证呢?当然可以,其实这里就涉及到一个控制器开发生产的刷写问题了。控制器开发至生产阶段,为了简化步骤会将APP和Boot同时烧写进单片机。这里就涉及到一个Merge的概念了,我们将上面的两个hex合并到一个hex,然后将合并的hex烧写进单片机,看看是否也能验证跳转成功。
使用hexview打开Boot的hex文件,点击File里面的Merge,然后选择APP的hex文件,跳出的选项选择默认,点击OK。提示原来的hex文件改变了,此时不要选择Save,否则会覆盖掉原来的hex文件,选择重新保存一个hex文件。
使用ST LINK重新执行先擦除整个Chip,然后再刷写刚才merge的hex文件。同样上位机也接收到APP发送来的串口报文。这里就不演示了。
Tips:上面的Merge过程可以使用bat脚本来实现
总结
以上就是今天分享的内容,验证了Boot跳转至APP的有效性,这个步骤特别重要,否则Boot就没有什么作用了。有任何问题可以与我随时交流。