背景

在bootloader中,需要将A区的程序起始地址从0x0800000修改为指定地址。

方法

基于STM32F407,B区大小是40kb,A区程序的起始地址是0x0800A000;

需要修改的地方只有两处

1.keil->魔法棒->Target

​619

这里只需要修改红色框里面第一个参数,即从0x8000000修改为0x800A000,后面的Size不需要修改,保持默认就行;

2.修改中断向量表的偏移地址


在该文件中搜索VECT_TAB_OFFSET


这部分的代码可能不同型号的芯片会不一样,这里官方的文件默认向量表的偏移地址就是0,所以这部分是被注释掉变成灰色了;
USER_VECT_TAB_ADDRESS是官方留给开发者的宏,如果定义该宏,则表示可以自己修改向量表的偏移地址;
所以我们这里需要把/#define USER_VECT_TAB_ADDRESS /这行,解注释;

这里的#define VECT_TAB_OFFSET 0x0000A000U
是我已经修改过的了,原本的值是0x00000000U,因为我们A区的起始地址是0x0800A000,
所以这里的VECT_TAB_OFFSET需要修改为0x0000A000U;

到这里就已经完成了程序起始地址的修改,接下来编译烧录,程序就被放在0x0800A000起始的内存空间了;

验证

.sct文件-keil编译器自动生成的内存分配表


编译后,在这里可以看到程序起始地址已经修改为了0x0800A000;

.map-地址映射表


RESET是一个 段名,存放:复位中断向量、中断向量表
作用:芯片上电第一步就执行这里的代码
这里可以说明第一步执行的指令地址是0x0800A000;

keil调试模式下查看程序起始地址,第一步指令是在做什么


在汇编窗口右键,选择图中选项,

0x0800A000和0x0800A002这两行指令是将0x2000和0x5AC8整合为一个16位值,即0x20005AC8,然后硬件自动将该值加载到MSP寄存器中,
0x0800A004和0x0800A006这两行指令是将0x0800A19D加载到PC寄存器中,开始执行程序

为什么看前面这四行指令


在.s文件(启动文件)中可以60行往下的称为中断向量表,而前面两个就是栈顶指针和复位中断函数
当cpu执行Reset)Handler指令后,就代表程序的开启,后面会一直执行到主循环
而上面解释的两条指令就是将0x20005AC8设置为初始的栈顶指针;
然后跳转到0x0800A19D中开启运行程序。
在bootloader中,也是将0x0800A004地址赋值给pc寄存器,在B区中的程序会跳转到该地址开启运行A区程序

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐