Bootloader + App 双程序场景下具体设置步骤
在Bootloader+App双程序场景下,IROM1起始地址和VTOR向量表偏移的可落地、一步一操作的具体设置步骤,我会结合实际工程配置(以Keil MDK为例),把每一步都讲清楚,确保能直接照着操作。
前提约定
先明确一个通用的地址划分(根据自己的芯片Flash大小调整):
• Bootloader地址范围:0x08000000 ~ 0x0800FFFF(64KB,扇区0~3)
• App地址范围:0x08010000 ~ 0x0807FFFF(剩余Flash,比如384KB)
• 核心要求:App的IROM1起始地址 = VTOR偏移地址 = 0x08010000(需满足Cortex-M内核0x200整数倍的对齐要求)
一、Bootloader工程的配置
Bootloader是芯片上电后第一个运行的程序,向量表默认在0x08000000,无需额外配置:
1. 打开Bootloader工程,点击魔法棒图标(Options for Target)→ 切换到「Target」标签;
2. 确认IROM1配置:Start=0x08000000,Size=0x10000(64KB,对应0x08000000~0x0800FFFF);
3. 无需设置VTOR(Bootloader的向量表就在默认地址,设置反而会出错);
4. 保存配置,编译Bootloader工程即可。
二、App工程的核心配置
步骤1:修改App工程的IROM1起始地址(Keil链接器配置)
这一步是告诉编译器:App的代码要存到Flash的0x08010000开始的位置,避免和Bootloader重叠。
1. 打开App工程,点击魔法棒图标→「Target」标签;
2. 找到「IROM1 (Flash)」区域:
○ 把「Start」值从默认的0x08000000改为0x08010000;
○ 把「Size」值改为剩余可用Flash大小(比如总Flash是512KB,Bootloader占64KB,所以Size=0x70000,即448KB);
○ IRAM1(RAM)保持默认即可(比如Start=0x20000000,Size=0x10000);
��示例配置截图参考:
|
Plain TextIROM1: Start=0x08010000, Size=0x70000IRAM1: Start=0x20000000, Size=0x10000 |
3. 点击「OK」保存配置,此时编译App工程,链接器会把代码链接到0x08010000开始的地址。
步骤2:在App代码中设置VTOR向量表偏移(运行时配置)
这一步是告诉CPU:中断向量表不在默认的0x08000000,而是在App的起始地址0x08010000,确保中断能正常响应。
关键要求:
• VTOR必须在main函数最开头、任何中断使能前设置(比如HAL_Init()之前);
• 地址必须是0x200(512字节)或0x800(2048字节)的整数倍(Cortex-M内核要求,0x08010000满足)。
具体代码实现:
|
C#include “stm32f4xx_hal.h” // 对应你的芯片系列,比如f1/l4则改头文件#include “core_cm4.h” // Cortex-M4内核头文件(M3用core_cm3.h)int main(void){/********************* 第一步:设置VTOR向量表偏移 *********************/// 1. 解锁VTOR寄存器(部分内核需要,比如STM32F1可省略,F4/L4建议加)SCB->VTOR = 0x08010000; // 核心:设置为App的起始地址// 验证:如果需要确认是否设置成功,可加这句(调试用)// uint32_t vtor_val = SCB->VTOR; // 读取后应为0x08010000/********************* 第二步:常规初始化(必须在VTOR之后) *********************/HAL_Init(); // HAL库初始化(含SysTick中断,必须在VTOR后)SystemClock_Config(); // 系统时钟配置MX_GPIO_Init(); // 外设初始化(比如GPIO、串口等)// … 其他业务代码/********************* 主循环 *********************/while (1){// App的业务逻辑}} |
步骤3:验证配置是否正确
1. 编译App工程,查看编译输出:确认「Program Size」的Code+RO Data+RW Data总和不超过IROM1设置的Size;
2. 下载Bootloader到芯片,再下载App;
3. 上电运行:如果App能正常跑、中断(比如串口、定时器)能响应,说明配置正确;
○ 若App卡死:大概率是VTOR设置太晚(比如在HAL_Init之后),或IROM1地址设错;
○ 若链接报错「space not enough」:是IROM1的Size设小了,需调大。
三、特殊场景:App起始地址非0x08010000的情况
如果你的Bootloader占65KB(0x08000000~0x080103FF),App起始地址是0x08010400:
1. IROM1的Start改为0x08010400,Size对应减少(比如0x6FC00);
2. VTOR也设为0x08010400(需确认是0x200倍数:0x08010400 ÷ 0x200 = 0x40082,是整数,满足要求);
3. 代码中VTOR设置语句改为:SCB->VTOR = 0x08010400;。
总结
1. Bootloader工程:IROM1默认(0x08000000),无需设VTOR;
2. App工程核心两步:
○ 改IROM1的Start为App实际起始地址(链接器层面,决定代码存储位置);
○ 在main最开头设VTOR=App起始地址(运行时层面,决定中断向量位置);
3. 关键避坑:VTOR必须早于任何中断初始化(如HAL_Init),且地址满足0x200对齐。
夜雨聆风
