问题1:JumpAddress 地址为什么指向 APPLICATION_ADDRESS + 4 ; MSP 主堆栈指针为什么指向 APPLICATION_ADDRESS ;问题2:为什么需要做以下判断
# j4 \9 V( y" N+ [- E8 T- if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) {
$ Z3 u0 r2 Z% t) _ - }
复制代码
: H& o, S3 K' t问题1分析:
# T/ A; ]7 c# \' y从startup_stm32f4xx.s 中的启动代码可以看出:程序开始第一条指令地址为 CSTACK,第二条指令地址为复位指令% `& k# l' M9 C; h8 w' v) c# _
- EXTERN iar_program_start EXTERN SystemInit2 o7 G2 U# | b9 I9 s" N
- PUBLIC vector_table3 b# D, Y) T( R; m/ j
, S! q- P1 p, Q' |. @6 G# M/ m, v- DATA
, V- e! x5 G6 q* ?# W6 I - vector_table
2 G( c' A0 X! w# [! |4 k6 j) U - <font color="#ff0000">DCD sfe(CSTACK) ; APPLICATION_ADDRESS</font>. i+ ?9 N9 ~+ r/ L9 [; J+ X
- <font color="#0000ff">DCD Reset_Handler ; Reset Handler ; APPLICATION_ADDRESS + 4</font>$ U' c8 G8 ^8 {& v
- ' _" v5 O8 Y! e) j
- DCD NMI_Handler ; NMI Handler
5 N% q) I, b' u! ^: l - 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 - DCD 0 ; Reserved
( O9 E2 o! ]& [/ @1 U - DCD 0 ; Reserved* O) d. g& v/ f& {9 \+ u
- DCD 0 ; Reserved
J$ z) G: ^& L2 } - DCD SVC_Handler ; SVCall Handler
: g- N$ h$ C D! Q( S( D! J - DCD DebugMon_Handler ; Debug Monitor Handler
8 ]! i L# ^$ a! G - DCD 0 ; Re served
0 X& k4 V1 i, B5 @& P3 i3 n - DCD PendSV_Handler ; PendSV Handler
% S# I% Z v* r - DCD SysTick_Handler ; SysTick Handler
2 N, o, u1 V' u7 U0 z - 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)
|