SP指针和PC指针
SP指针:当前栈地址
PC指针:程序运行地址
FLASH存储位置
在FLASH地址的第一个地址记录着栈顶位置
第二个地址记录着Reset 函数的地址
代码
以下是使用stm32F103C8T6为例
MCU的flash起始地址为0x08000000
flash一个扇区为1KB,在实例中使用4KB,实际情况依据bootloader代码大小调整
设置bootloader程序大小为0x1000
那么app程序大小可使用空间为0x08000000-0x0800FFFF
那么app程序大小可使用空间为0x08001000-0x08010000
#define FLASH_ADRESS 0X8001000
#define FlASH_ROM 0xF000
typedef void(*PCFunction)();
void Jumptoapp(uint32_t adress)
{
PCFunction PC_point=(PCFunction)(*(uint32_t*)(adress+4));
if(((*(uint32_t*)(FLASH_ADRESS))&0x2FFE0000)==0x20000000)
{
__set_MSP(*(__IO uint32_t*)adress);
}
PC_point();
}
void intobootload()
{
/*刷写程序*/
}
int main(void){
uint8_t count=0;
while(1)
{
if(/*刷写握手失败*/)
{
count++;
/*可以添加delay*/
if(/*count值大于握手限制*/)
break;
}
else{
intobootload();
}
}
Jumptoapp(FLASH_ADRESS);
}
Keil 设置
boot程序设置如下
app程序设置如下
记得勾选user memory frome target dialog选项
如有错误感谢指正