上电启动:
启动流程:
STM32官方规定,上电后要读取栈首地址和中断向量表
The Cortex-M3 can only boot from address 0x0 from reset(解释为什么CPU从0x00000000启动)
The boot-up sequence for M3 is different to traditional ARM cores, in that the first fetch from address 0x0 is the initial value of the SP, the second value is reset vector, i.e. the starting address of program code.
所以0x0000 0000(这个重映射地址)储存的内容必须是栈的首地址
0x0000 0004 (这个重映射地址)存储的内容必须是复位函数的地址
所以我们的bootloader需要做的事情就很清晰了:
创建两个工程,一个工程从0x0800 0000开始 编写Bootloader函数,在mian内部使用
一个工程从0x080 xxxx(根据上一个项目的大小得知起始地址),mian内while进行循环打印测试。
程序:
#define AppAddr APP第一个四字节的地址——
只要通过keil下载的,开始地址就是栈的首地址(复位函数同理)

1、设置主堆栈指针地址:
__set_MSP(*(uint32_t *)AppAddr;
2、启动复位函数
typedef void (*Function)(void);
Function = *(volatile uint32_t *) AppAddr + 4;
Function();//程序将已函数的形式执行
然后Bootloader就跳转过去了APP地址,进行执行APP程序。
2、APP应该做什么:
APP此时应该把中断向量表迁移过来,不然发生中断会跑去Bootloader地址寻址,容易出现fault