STM32 MCU IAP 例程跳转到 APP 代码
简要分析
问题:
有客户在初次使用 STM32 MCU IAP 的例程的,可能会对跳转到 APP 部分的函数的实现产生疑问 :
问题 1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ;
MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS;
问题 2:为什么需要做以下判断 :
if (((*( IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
}
此 Tips 对于这两个个问题做简要分析.进行所以说主要代码如下 :
/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */ if
(((*( IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
{
/* Jump to user application */
JumpAddress = *( IO uint32_t*) (APPLICATION_ADDRESS + 4); Jump_To_Application =
(pFunction) JumpAddress;
/* Initialize user application's Stack Pointer */
set_MSP(*( IO uint32_t*) APPLICATION_ADDRESS); Jump_To_Application();
}
调研:
问题 1 分析 :
从 startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令,
参考代码中的红色部分(黄色为注释);
EXTERN __iar_program_start
EXTERN SystemInit
PUBLIC __vector_table
DATA
__vector_table
DCD sfe(CSTACK) ; APPLICATION_ADDRESS
DCD Reset_Handler ; Reset Handler ; APPLICATION_ADDRESS + 4
DCD NMI_Handler ; NMI Handler