环境:
STM32F103C8T6,keil5
Flash分配:
Boot地址:0x08000000,大小:16K
App地址:0x08004000, 大小:48K
IAP跳转程序
if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
Serial_PutString("Start program execution......\r\n\n");
__set_PRIMASK(1); /*关闭全局中断,APP程序中带有RTOS时,这个很重要*/
/* 关闭滴答时钟,复位*/
SysTick->CTRL = 0;
SysTick->LOAD = 0;
SysTick->VAL = 0;
HAL_SuspendTick(); // 挂起滴答定时器
/* 设置所以时钟默认状态 */
HAL_RCC_DeInit();
/* 关闭所有中断,清除中断挂起标志 */
for (i = 0; i < 8; i++)
{
NVIC->ICER[i]=0xFFFFFFFF;
NVIC->ICPR[i]=0xFFFFFFFF;
}
/* execute the new program */
JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
__set_PSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
/* Jump to user application */
JumpToApplication = (pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); /* 设置主堆栈指针 */
/* 在 RTOS 工程,这条语句很重要,设置为特权级模式,使用 MSP 指针 */
__set_CONTROL(0);
JumpToApplication();
}
APP程序
APP程序按照正常的用户程序编写,编写完成之后修改中断偏移量,修改keil中地址。
4.1 修改中断偏移量
修改前:

修改后:

4.2修keil中的地址:
修改前:

修改后:

总结
(1)APP程序在裸机运行的情况下,Bootloader程序在跳转应用程序之前不关闭中断,跳转后应用程序可以正常运行。
(2)APP程序在FreeRTOS运行的情况下,Bootloader程序在跳转应用程序之前必须关闭中断,否则跳转后应用程序会跑飞。