BOOT流程及注意事项
-
前言
Bootloader (引导加载程序)是嵌入式系统上电启动后运行的第一段代码。它常驻在 Flash 的最前面(一般从 0x0 地址开始),通常需要被永久保护、绝对不允许被修改。在汽车电子领域,boot loader扮演者非常重要的角色,其作用主要体现在以下方面:
- 防止固件被非法篡改,提高ECU的安全性;
- 很多场景需要OTA升级,而boot loader提供了更新软件的能力;
- 隔离底层硬件和上层业务。
本文以YTM32B1系列微控制器(基于 ARM Cortex-M0+/M33/M7 内核) 为例,介绍汽车嵌入式 Boot 的流程。
Boot loader跳转本质
Boot 跳转 App 的本质不是调用某个函数,而是把 CPU 的启动上下文切换到 App 的向量表,让 App 像刚上电复位后启动一样运行。其中,有两个最关键的东西:MSP 和 Reset_Handler。
所以 Boot 要做的事情可以概括为:- 确认 App 镜像存在且合法;
- 关闭 Boot 自己已经打开的中断和外设影响;
- 关闭 SysTick;
- 清除 NVIC 使能与挂起;
- 把向量表重定位到 App 首地址;
- 把 MSP 切换为 App 向量表中的初始栈顶;
- 跳转到 App 的 Reset_Handler;
标准跳转流程
- 上电运行Boot
芯片复位后,CPU 默认从 0x0000_0000 取向量表,因此通常先进入 BootLoader。
Boot 可以先完成以下事情:
- 时钟初始化
- 看门狗处理
- 升级标志检查
- 固件校验
- 通信升级
如果无需升级,只需要运行App,直接执行跳转。
- 跳转前的收尾工作
- 关闭全局中断
SDK调用INT_SYS_DisableIRQGlobal(),MCAL可在特权模式下调用SuspendAllInterrupts()来关闭全局中断。
ps:调用"Sys_GoToSupervisor()"进入特权模式。 - 关闭Systick
SysTick->CTRL = 0U; SysTick->LOAD = 0U; SysTick->VAL = 0U;- 关闭所有 NVIC 中断使能
NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)); NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));NVIC属于的寄存器是异步寄存器,有写缓冲延迟,而Cortex-M是流水线架构,需要加上如下两句
__DSB();(数据同步屏障) __ISB();(指令同步屏障)在不清楚当前开启了哪些中断或开启的中断较多时,可以使用循环将所有bit都清一遍,对于Cortex-M0+内核:
NVIC->ICER[0] = 0xFFFFFFFFUL; __DSB(); __ISB();Cortex-M33内核:
for (uint8_t i = 0; i < 15U; i++) { NVIC->ICER[i] = 0xFFFFFFFFUL; } __DSB(); __ISB();- 清掉所有 NVIC 挂起位
NVIC->ICPR[0] = 0xFFFFFFFFUL; __DSB(); __ISB(); for (uint8_t i = 0; i < 15U; i++) { NVIC->ICPR[i] = 0xFFFFFFFFUL; } __DSB(); __ISB();- 关闭所有外设
- 重定位向量表
SCB->VTOR = app_addr; __DSB(); __ISB();- 设置 MSP 并跳转复位入口
__set_MSP(app_msp); __DSB(); __ISB(); app_entry();其中,
app_msp = *(volatile uint32_t *)addr,app_entry = (pFunction)app_reset,关键注意事项
- Boot和App空间一定不能重叠,划分地址时需要注意;
- 跳转前检查栈顶地址是否合法;
- 下载App需要修改Flash起始地址;
- 进入 App 后,应该按正常冷启动流程重新初始化。
代码参考
Uds Fbl demo合集
https://cloud.ytm32.cn/s/vBECk?path=%2F03_Fbl demo常见问题总结
https://forum.ytmicro.com/topic/18/le-bootloader问题汇总?_=1758613536259
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...