Cortex-M0 通过Bootloader实现中断向量表重映射

AI-摘要
切换
Huggingface
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
Cortex-M0 通过Bootloader实现中断向量表重映射
KayerCortex-M0 通过Bootloader实现中断向量表重映射
1. 原理
Cortex-M0 内核由于没有 VTOR(Vector Table Offset Register),这是它与 Cortex-M3/M4 等内核的重要区别之一。Cortex-M0 的中断向量表固定在复位地址(通常是 0x00000000),无法通过寄存器直接重映射。
芯片提供了三种不同的启动方式:
- 从 Flash 程序存储区启动
- 从 SRAM 启动
- 从系统存储区启动
因此,在 Cortex-M0 上实现 Bootloader 的中断向量表重映射,需要通过硬件映射或代码跳转的方式间接实现。
2. 实现方法
2.1 硬件映射
启动模式选择后,如果要跳转到APP运行,在跳转之前Bootloader可以通过特定的寄存器来修改存储器访问方式。可以将APP的中断向量表重定位到 SRAM 中:
- 将APP的中断向量表从对应的 Flash 分区复制到 SRAM 的基地址 0x20000000。
- SRAM 重映射到 0x00000000 地址。
- 一旦发生中断,内核将从重定位到 SRAM 中的向量表获取中断处理函数的起始地址,跳转到
Flash 中的中断处理处理函数。
1 | // 跳转到APP |
2.2 代码跳转
如果芯片没有硬件映射功能(如部分低端 Cortex-M0 芯片),可通过在 Bootloader 中保留向量表,并将 APP 程序的中断向量 转发,Bootloader 的向量表固定在 0x00000000,其中除了复位向量外,其他中断向量均指向一个 跳转函数。跳转函数读取 APP 程序向量表中对应的中断服务程序(ISR)地址,并跳转到该地址执行。
- 定义 Bootloader 向量表,除复位向量外,其他中断均指向 VectorRedirect 函数。
- VectorRedirect 函数根据中断号,计算 APP 程序向量表中对应的 ISR 地址,并跳转。
- 跳转到 APP 程序前,记录 APP 程序起始地址(供 VectorRedirect 使用)。
1 | // 全局变量: APP 程序起始地址(供中断跳转使用) |
3. 注意事项
- 中断响应延迟:
方案二通过 Bootloader 转发中断,会增加少量延迟,对实时性要求高的场景需谨慎使用。 - 栈指针管理:
跳转前必须用 __set_MSP 初始化 APP 程序的栈顶指针(Cortex-M0 仅支持主栈 MSP)。 - 芯片差异:
方案一依赖芯片硬件支持(如 STM32 的 SYSCFG),需参考具体芯片手册;方案二是通用方案,适用于所有 Cortex-M0 芯片。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果




