一 相关配置
- .bootloader和应用程序代码划分
-
应用程序中断向量表
二 bootloader
bootloader具体功能不详述,最主要的是跳转到应用程序。主要有2点:
1. 跳转前,将应用程序的栈顶指针保存到MSP寄存器,应用程序的栈顶指针为地址0x08004000所对应的内容
2. 跳转到应用程序的复位向量(0x08004004)
下面是bootloader流程完成后,最后调用的跳转函数
#define APP_ADDR 0x08004000
typedef void (*func_app)(void);
volatile func_app func;//func需定义为全局变量
void run_app()
{
unsigned long app_addr = APP_ADDR;
//跳转前关闭bootloader打开的中断,防止中断使能而应用程序没有相应的中断处理函数
NVIC_DisableIRQ(USART1_IRQn);
__disable_irq();
unsigned long stack_pointer = *(unsigned long*)app_addr;
//栈顶地址是否合法(假定sram大小为64k,栈顶指针不会超过0xffff)
//举例,应用程序栈顶指针 = 0x20006958
if((stack_pointer & 0x2fff0000) == 0x20000000)
{
func = (func_app)(*(volatile unsigned long*)(app_addr + 4));
__set_MSP(stack_pointer);//将应用程序的栈顶指针保存到寄存器,需放在跳转前最后一步!
func();
}
}
三 应用程序
- 设置应用程序的起始地址为0x08004000,Keil设置
- 设置中断向量表
main函数最开始的地方加入:
SCB->VTOR = 0x08004000;//设置中断向量表
四 程序下载
将bootloader下载到0x08000000起始的flash区间
将app下载到0x08004000起始的flash区间
使用Keil的话,在bootloader和应用程序的工程,分别 “Flash->Download”(F8)即可