BoootLoad在线升级分为两个部分:Boot、APP
Boot
Boot为单片机复位启动以后运行的部分,这里面可以选择后续程序的跳转,以及升级文件的接收。
Boot中的要点就是程序跳转
void CAN_BOOT_JumpToApplication(__IO uint32_t Addr)
{
pFunction Jump_To_Application;
__IO uint32_t JumpAddress;
/* Test if user code is programmed starting from address "ApplicationAddress" */
if (((*(__IO uint32_t*)Addr) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
__ASM("CPSID I");
JumpAddress = *(__IO uint32_t*) (Addr + 4);
Jump_To_Application = (pFunction) JumpAddress;
__set_PRIMASK(1);//关闭所有中断
CAN_ITConfig(CAN1,CAN_IT_FMP0, DISABLE);
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*)Addr);
Jump_To_Application();
}
}
通过上面的文章可以了解到CortexM3从启动的首地址从放的是栈顶指针,*(__IO uint32_t*)Addr
是去APP的栈顶指针,然后判断栈是不是在RAM中,JumpAddress = *(__IO uint32_t*) (Addr + 4);
存放的就是复位向量的地址,当通过__set_MSP(*(__IO uint32_t*)Addr);
把主栈指针指向APP的栈后,在使用Jump_To_Application();
把PC指针指向APP的复位向量。
APP
app中需要注意的主要有两点:编译设置和中断向量便宜
编译设置
分别设置flash的起始地址和大小
编译后使用keil自带程序生成bin升级文件
设置下载的flash地址
中断向量表重映射
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); //重映射中断向量表APP_START_ADDRESS