问题1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ; MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS ;问题2:为什么需要做以下判断7 ]* Z. L: S) |, G
- if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) {
5 ?# x9 f4 S# K1 f - }
复制代码 6 l6 d5 l9 ~! _
问题1分析:% B- C& h6 Y c. X3 Y+ r) Q
从startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令
/ | h6 c/ g; ^* {/ g- EXTERN iar_program_start EXTERN SystemInit
3 V- Q& O c" P/ s: Q p5 j7 r2 U( K - PUBLIC vector_table2 M( _! Q& q. A
- 4 Y: m3 y# q% k* i3 F+ t
- DATA
9 o" z9 I$ w( G& u) }/ {4 X - vector_table8 x0 Y0 ~7 @# G
- <font color="#ff0000">DCD sfe(CSTACK) ; APPLICATION_ADDRESS</font>5 m" a3 x! A1 @$ O# U/ f- [7 `
- <font color="#0000ff">DCD Reset_Handler ; Reset Handler ; APPLICATION_ADDRESS + 4</font>! Q/ Q& d- D3 }: D+ a) R$ j- x' `
- 6 R! s7 S8 Q" y
- DCD NMI_Handler ; NMI Handler
2 E+ p. d' L& }9 Q0 C - 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
; Q7 p# b" S. {- V2 I - DCD 0 ; Reserved
) v- I u+ w1 N1 e& I+ N4 } - DCD 0 ; Reserved
9 {0 s- V$ K) r. Y7 s - DCD 0 ; Reserved, V: p% ]# Z: Z$ X2 ?5 ~ }
- DCD SVC_Handler ; SVCall Handler3 j1 j3 t1 N5 _9 |+ A: _
- DCD DebugMon_Handler ; Debug Monitor Handler: |( u: H4 \9 N! G. S
- DCD 0 ; Re served0 r% B3 W& H( A1 e; Y7 s9 J# P- k& B
- DCD PendSV_Handler ; PendSV Handler
. y, [% p4 o6 v4 M9 M! [- G - DCD SysTick_Handler ; SysTick Handler+ @2 D5 x4 {7 l! \7 y( }" u, t! D
: ^9 @& C8 f0 y; t! a6 e+ l6 j; H
复制代码 当程序启动时首先要执行复位程序,因此 JumpAddress 地址指向复位指令地址(即APPLICATION_ADDRESS + 4) ; MSP 对应的是主堆栈指针,指向 CSTACK 地址(即 APPLICATION_ADDRESS). u+ s/ e J; g6 ?
7 N$ \* o$ A9 z5 d+ F. d
( j% x* y8 I- z. q! _6 K4 T k! S问题2分析:ApplicationAddress 存放的是程序的主堆栈地址,CSTACK 堆栈地址指向 RAM,而 RAM 的 起始地址是 0x20000000; 因此上面的判断语句执行:判断用户代码的堆栈地址是否落在:0x20000000~0x2001ffff 区间 中,这个区间的大小为 128K.
) e) g& C4 W7 _* e, R# n/ l8 e0 }' _4 Z1 w3 J
STM32 MCU IAPä¾ç¨è·³è½¬å°APP代ç ç®è¦åæ.pdf
(38.67 KB, 下载次数: 22)
|