问题1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ; MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS ;问题2:为什么需要做以下判断
% A5 N- [0 A! w( h( W& F- if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) { & N3 A0 F. i6 u$ T; `
- }
复制代码
3 V4 `& X( |. ]3 i! Y/ G问题1分析:
# ~+ A6 A' g2 X/ B+ ~7 X1 j# [; f从startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令
Y. N" ^. B' O d5 d& |7 U- EXTERN iar_program_start EXTERN SystemInit
; t2 [; Q0 d8 N* t2 I - PUBLIC vector_table
8 B1 w: _! G0 G' x& h3 H - 7 A# G* E8 ^3 p5 C8 J
- DATA& |4 Z/ I; Q, y' w
- vector_table' W, w U7 Q; N
- <font color="#ff0000">DCD sfe(CSTACK) ; APPLICATION_ADDRESS</font>* k+ m: v4 I: M6 ^" u* D" p
- <font color="#0000ff">DCD Reset_Handler ; Reset Handler ; APPLICATION_ADDRESS + 4</font>) q- _, S1 Z0 V* k+ X; B7 [& x
- # E* ?- V ]1 O# X4 X8 L" H
- DCD NMI_Handler ; NMI Handler
4 Z7 r1 I1 E. F0 ` - 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
) s) F" ?7 j: b5 I9 M3 G* B1 U - DCD 0 ; Reserved
( x2 F+ ^$ y* Q8 c - DCD 0 ; Reserved
% Z+ t$ o1 j, J+ P - DCD 0 ; Reserved( M$ `: @, v8 f" t
- DCD SVC_Handler ; SVCall Handler2 D: r) M2 g4 j$ b3 S' n6 \; K
- DCD DebugMon_Handler ; Debug Monitor Handler$ Y6 T2 {5 ]. j7 s: g% Y3 B
- DCD 0 ; Re served5 Q+ x6 C. K2 r# n& a
- DCD PendSV_Handler ; PendSV Handler
' {5 M: P+ O6 C - DCD SysTick_Handler ; SysTick Handler8 b3 a8 Q( e D
/ H0 b, G" X! R0 ]6 _7 f
复制代码 当程序启动时首先要执行复位程序,因此 JumpAddress 地址指向复位指令地址(即APPLICATION_ADDRESS + 4) ; MSP 对应的是主堆栈指针,指向 CSTACK 地址(即 APPLICATION_ADDRESS).
* I1 O: f9 v, v( j/ ~
. @- E2 W/ U6 B; `. g: @- v& p: g: E
问题2分析:ApplicationAddress 存放的是程序的主堆栈地址,CSTACK 堆栈地址指向 RAM,而 RAM 的 起始地址是 0x20000000; 因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff 区间 中,这个区间的大小为 128K.9 C4 U8 r9 ~7 R# V5 {
4 K- C. Q( q- B# }
STM32 MCU IAPä¾ç¨è·³è½¬å°APP代ç ç®è¦åæ.pdf
(38.67 KB, 下载次数: 22)
|