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

STM32 MCU IAP例程跳转到APP代码简要分析

[复制链接]
博根 发布时间:2015-1-5 16:16
问题1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ; MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS ;问题2:为什么需要做以下判断
# j4 \9 V( y" N+ [- E8 T
  1. if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) {
    $ Z3 u0 r2 Z% t) _
  2. }
复制代码

: H& o, S3 K' t问题1分析:
# T/ A; ]7 c# \' y从startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令% `& k# l' M9 C; h8 w' v) c# _
  1. EXTERN      iar_program_start EXTERN SystemInit2 o7 G2 U# |  b9 I9 s" N
  2. PUBLIC     vector_table3 b# D, Y) T( R; m/ j

  3. , S! q- P1 p, Q' |. @6 G# M/ m, v
  4. DATA
    , V- e! x5 G6 q* ?# W6 I
  5.     vector_table
    2 G( c' A0 X! w# [! |4 k6 j) U
  6. <font color="#ff0000">DCD        sfe(CSTACK)        ; APPLICATION_ADDRESS</font>. i+ ?9 N9 ~+ r/ L9 [; J+ X
  7. <font color="#0000ff">DCD        Reset_Handler        ; Reset Handler   ; APPLICATION_ADDRESS + 4</font>$ U' c8 G8 ^8 {& v
  8. ' _" v5 O8 Y! e) j
  9. DCD        NMI_Handler        ; NMI Handler
    5 N% q) I, b' u! ^: l
  10. DCD        HardFault_Handler        ; Hard Fault Handler DCD        MemManage_Handler                ; MPU Fault Handler DCD        BusFault_Handler        ; Bus Fault Handler DCD        UsageFault_Handler        ; Usage Fault Handler DCD        0        ; Reserved
    ! q4 Z" Q) E5 f7 I7 O* z( O# A3 J  v
  11. DCD        0        ; Reserved
    ( O9 E2 o! ]& [/ @1 U
  12. DCD        0        ; Reserved* O) d. g& v/ f& {9 \+ u
  13. DCD        0        ; Reserved
      J$ z) G: ^& L2 }
  14. DCD        SVC_Handler        ; SVCall Handler
    : g- N$ h$ C  D! Q( S( D! J
  15. DCD        DebugMon_Handler        ; Debug Monitor Handler
    8 ]! i  L# ^$ a! G
  16. DCD        0        ; Re        served
    0 X& k4 V1 i, B5 @& P3 i3 n
  17. DCD        PendSV_Handler        ; PendSV Handler
    % S# I% Z  v* r
  18. DCD        SysTick_Handler        ; SysTick Handler
    2 N, o, u1 V' u7 U0 z
  19. 1 ^3 j3 g1 [4 w2 r/ q' Y) O2 \2 X
复制代码
当程序启动时首先要执行复位程序,因此  JumpAddress  地址指向复位指令地址(即APPLICATION_ADDRESS + 4) ; MSP 对应的是主堆栈指针,指向 CSTACK 地址(即 APPLICATION_ADDRESS).% d8 F; ?3 r! t( f1 ]. _0 a# O/ W

9 N3 z4 C& l; ?
8 ~* b* |3 f$ i% ^7 v- v问题2分析:ApplicationAddress 存放的是程序的主堆栈地址,CSTACK 堆栈地址指向 RAM,而 RAM 的 起始地址是  0x20000000; 因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff    区间 中,这个区间的大小为  128K.' _) g0 F8 t: b, c- E5 A, M

* J6 q9 O2 P9 {2 C# W/ s STM32 MCU IAP例程跳转到APP代码简要分析.pdf (38.67 KB, 下载次数: 22)
赞 收藏 评论0 发布时间:2015-1-5 16:16

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版