你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32 MCU IAP 例程跳转到 APP 代码简要分析

[复制链接]
STMCU小助手 发布时间:2022-2-18 20:36
问题:
有客户在初次使用 STM32 MCU IAP 的例程的,可能会对跳转到 APP 部分的函数的实现产生疑问 :
问题 1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ;
MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS ;
问题 2:为什么需要做以下判断 :
  1. if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  2. {
  3. }
复制代码

此 Tips 对于这两个个问题做简要分析.进行所以说主要代码如下 :

  1. /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */
  2. if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
  3. {
  4. /* Jump to user application */
  5. JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
  6. Jump_To_Application = (pFunction) JumpAddress;
  7. /* Initialize user application's Stack Pointer */
  8. __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);
  9. Jump_To_Application();
  10. }
复制代码

调研:
问题 1 分析 :
从 startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令 ,参考代码中的红色部分(蓝色为注释);

  1. EXTERN __iar_program_start
  2. EXTERN SystemInit
  3. PUBLIC __vector_table
  4. DATA
  5. __vector_table
  6. DCD sfe(CSTACK) ; APPLICATION_ADDRESS
  7. DCD Reset_Handler ; Reset Handler ; APPLICATION_ADDRESS + 4
  8. DCD NMI_Handler ; NMI Handler
  9. DCD HardFault_Handler ; Hard Fault Handler
  10. DCD MemManage_Handler ; MPU Fault Handler
  11. DCD BusFault_Handler ; Bus Fault Handler
  12. DCD UsageFault_Handler ; Usage Fault Handler
  13. DCD 0 ; Reserved
  14. DCD 0 ; Reserved
  15. DCD 0 ; Reserved
  16. DCD 0 ; Reserved
  17. DCD SVC_Handler ; SVCall Handler
  18. DCD DebugMon_Handler ; Debug Monitor Handler
  19. DCD 0 ; Reserved
  20. DCD PendSV_Handler ; PendSV Handler
  21. DCD SysTick_Handler ; SysTick Handler
复制代码

当程序启动时首先要执行复位程序,因此 JumpAddress 地址指向复位指令地址(即APPLICATION_ADDRESS + 4) ;
MSP 对应的是主堆栈指针,指向 CSTACK 地址(即 APPLICATION_ADDRESS).

问题 2 分析 :

ApplicationAddress 存放的是程序的主堆栈地址,CSTACK 堆栈地址指向 RAM,而 RAM 的起始地址是 0x20000000;
因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff 区间中,这个区间的大小为 128K.
例程中使用芯片 RAM=128K,因此做上面的判断;如果芯片 RAM 比 128K 大的话,可以在此判断语句做调整.


结论 :

以上分析可以看出,程序跳转部分的设计与 APP 启动代码和芯片 RAM 的大小有关系;移植和调试时需加以注意.


收藏 评论0 发布时间:2022-2-18 20:36

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版