跳转至内容
  • 版块
  • 最新
  • 标签
  • 热门
折叠
品牌标识

YunTu Forum

YTMicro.com
  1. 主页
  2. Blogs
  3. BOOT流程及注意事项

BOOT流程及注意事项

已定时 已固定 已锁定 已移动 Blogs
1 帖子 1 发布者 36 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • swustS 离线
    swustS 离线
    swust YunTu
    编写于 最后由 编辑
    #1

    前言

    Bootloader (引导加载程序)是嵌入式系统上电启动后运行的第一段代码。它常驻在 Flash 的最前面(一般从 0x0 地址开始),通常需要被永久保护、绝对不允许被修改。在汽车电子领域,boot loader扮演者非常重要的角色,其作用主要体现在以下方面:

    1. 防止固件被非法篡改,提高ECU的安全性;
    2. 很多场景需要OTA升级,而boot loader提供了更新软件的能力;
    3. 隔离底层硬件和上层业务。
      本文以YTM32B1系列微控制器(基于 ARM Cortex-M0+/M33/M7 内核) 为例,介绍汽车嵌入式 Boot 的流程。

    Boot loader跳转本质

    Boot 跳转 App 的本质不是调用某个函数,而是把 CPU 的启动上下文切换到 App 的向量表,让 App 像刚上电复位后启动一样运行。其中,有两个最关键的东西:MSP 和 Reset_Handler。
    所以 Boot 要做的事情可以概括为:

    1. 确认 App 镜像存在且合法;
    2. 关闭 Boot 自己已经打开的中断和外设影响;
    3. 关闭 SysTick;
    4. 清除 NVIC 使能与挂起;
    5. 把向量表重定位到 App 首地址;
    6. 把 MSP 切换为 App 向量表中的初始栈顶;
    7. 跳转到 App 的 Reset_Handler;

    标准跳转流程

    1. 上电运行Boot
      芯片复位后,CPU 默认从 0x0000_0000 取向量表,因此通常先进入 BootLoader。
      Boot 可以先完成以下事情:
    • 时钟初始化
    • 看门狗处理
    • 升级标志检查
    • 固件校验
    • 通信升级
      如果无需升级,只需要运行App,直接执行跳转。
    1. 跳转前的收尾工作
    • 关闭全局中断
      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();
    
    • 关闭所有外设
    1. 重定位向量表
    SCB->VTOR = app_addr;
    __DSB();
    __ISB();
    
    1. 设置 MSP 并跳转复位入口
    __set_MSP(app_msp);
    __DSB();
    __ISB();
    app_entry();
    

    其中,

    app_msp = *(volatile uint32_t *)addr,app_entry = (pFunction)app_reset,
    

    关键注意事项

    1. Boot和App空间一定不能重叠,划分地址时需要注意;
    2. 跳转前检查栈顶地址是否合法;
    3. 下载App需要修改Flash起始地址;
    4. 进入 App 后,应该按正常冷启动流程重新初始化。

    代码参考

    Uds Fbl demo合集
    https://cloud.ytm32.cn/s/vBECk?path=%2F03_Fbl demo

    常见问题总结

    https://forum.ytmicro.com/topic/18/le-bootloader问题汇总?_=1758613536259

    1 条回复 最后回复
    0

  • 云途开发生态介绍

    快速上手云途开发生态

  • 云途论坛规则/Yuntu Forum Rules

    发帖前请查看

  • YT CONFIG TOOL调查问卷

    帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...

  • can
    24
    demo
    22
    lin stack
    13
    uds
    13
    md14
    6
    yt-link
    6
    fbl
    5
    adc模块
    4
    Online Users
    • 登录

    • 登录或注册以进行搜索。
    • 第一个帖子
      最后一个帖子
    0
    • 版块
    • 最新
    • 标签
    • 热门