乐于分享
好东西不私藏

Bootloader + App 双程序场景下具体设置步骤

Bootloader + App 双程序场景下具体设置步骤

别忘了关注+点赞哦,精彩内容呈现

Bootloader+App双程序场景下,IROM1起始地址和VTOR向量表偏移的可落地、一步一操作的具体设置步骤,我会结合实际工程配置(以Keil MDK为例),把每一步都讲清楚,确保能直接照着操作。

前提约定

先明确一个通用的地址划分(根据自己的芯片Flash大小调整):

• Bootloader地址范围:0x08000000 ~ 0x0800FFFF64KB,扇区0~3

• App地址范围:0x08010000 ~ 0x0807FFFF(剩余Flash,比如384KB

• 核心要求:AppIROM1起始地址 = VTOR偏移地址 = 0x08010000(需满足Cortex-M内核0x200整数倍的对齐要求)

一、Bootloader工程的配置

Bootloader是芯片上电后第一个运行的程序,向量表默认在0x08000000,无需额外配置:

1. 打开Bootloader工程,点击魔法棒图标(Options for Target→ 切换到「Target」标签;

2. 确认IROM1配置:Start=0x08000000Size=0x1000064KB,对应0x08000000~0x0800FFFF);

3. 无需设置VTORBootloader的向量表就在默认地址,设置反而会出错);

4. 保存配置,编译Bootloader工程即可。

二、App工程的核心配置

步骤1:修改App工程的IROM1起始地址(Keil链接器配置)

这一步是告诉编译器:App的代码要存到Flash0x08010000开始的位置,避免和Bootloader重叠。

1. 打开App工程,点击魔法棒图标Target」标签;

2. 找到「IROM1 (Flash)」区域:

○ 把「Start」值从默认的0x08000000改为0x08010000

○ 把「Size」值改为剩余可用Flash大小(比如总Flash512KBBootloader64KB,所以Size=0x70000,即448KB);

○ IRAM1RAM)保持默认即可(比如Start=0x20000000Size=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()之前);

• 地址必须是0x200512字节)或0x8002048字节)的整数倍(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」:是IROM1Size设小了,需调大。

三、特殊场景:App起始地址非0x08010000的情况

如果你的Bootloader65KB0x08000000~0x080103FF),App起始地址是0x08010400

1. IROM1Start改为0x08010400Size对应减少(比如0x6FC00);

2. VTOR也设为0x08010400(需确认是0x200倍数:0x08010400 ÷ 0x200 = 0x40082,是整数,满足要求);

3. 代码中VTOR设置语句改为:SCB->VTOR = 0x08010400;

总结

1. Bootloader工程IROM1默认(0x08000000),无需设VTOR

2. App工程核心两步

○ IROM1StartApp实际起始地址(链接器层面,决定代码存储位置);

○ main最开头设VTOR=App起始地址(运行时层面,决定中断向量位置);

3. 关键避坑:VTOR必须早于任何中断初始化(如HAL_Init),且地址满足0x200对齐。

———-End———-
接着搞BLDC,IR2110SPBF 半桥驱动芯片工作原理深度解析
静电克星:揭秘GDT、MOV和TVS的超能力!
共模干扰和差模干扰,看完终于明白了
PCB Layout的设计要点,强烈推荐学习
DCDC升压芯片SY7065A,电感啸叫的原因分析及解决方法
本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Bootloader + App 双程序场景下具体设置步骤

评论 抢沙发

3 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮