bootloader篇:- g9 }2 l/ C F7 o- V& A5 ]( b* ^
简要说明0 V' _% K& z3 }0 j/ y# R9 Q
这里没有什么特殊的要求,
' y7 ]2 t: C. b" h* x7 J1 t一般含有:解析接收到的数据(可能是ymodem等等)、擦写app区域的flash,跳转等: Z) C; h+ V! O4 G+ J0 h+ ]) V
一般会保存在0x0800 0000起始的一段地址中(上电后直接运行),
b- V* O2 u2 Z# j; O: x其中解析和擦写flash掠过. ]- p! j9 K( b
" U0 P. k/ X0 D跳转代码如下:- __disable_irq();
1 Q+ m* D* |* G# |1 i$ @" _1 n - /* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */: s; C% ], X" j" v. _
- if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000)
) O- ?8 H0 ]# e; N - {4 H, m0 B* ?9 E0 \& q- W
- /* Jump to user application */
1 X7 c6 z x- n' ^5 m3 y: ~5 H - JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);
9 D6 R0 ^1 H$ Z! y0 J- D - JumpToApplication = (pFunction) JumpAddress;
% b! J% K0 {1 q5 D9 ~8 I - /* Initialize user application's Stack Pointer */
1 U8 b7 c9 v W9 L7 f! L - __set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS);% |3 z8 p4 M# g9 t# k
- JumpToApplication();
/ {; r+ Q% g b6 _* R - }1 i! t8 m' P* `2 q* V0 m' I
复制代码
* U. r* @+ D: C" G! d上文中APPLICATION_ADDRESS是APP的起始地址,跳转之前关闭总中断,防止跳转时出错
# Z. s! C% B* ?5 g. s* L要注意,在APP里不要忘记打开总中断。( q7 W. c* c2 S7 v
8 f3 A. T6 P1 m" C$ ]! Q3 UAPP篇 D% a- M) A: v5 n( O
以MDK为例2 t0 x/ N- ?) n# j
5 O1 ^3 c8 m4 R
修改FLASH地址
_( X' c" a# w3 n; H/ Z8 {
8 A' ?. a! W7 s1 a
1 } d, k+ d7 x9 [" F
0 I1 s' d9 b+ |; I6 i代码上修改中断向量表偏移0 x1 Q" Q6 v/ ]7 `% p
文件system_stm32g0xx.c中' p7 N6 [' B; H
- #define VECT_TAB_OFFSET 0x5000U /*!< Vector Table base offset field.5 D% o/ Z( W$ `" h+ g! b
- This value must be a multiple of 0x100. */
复制代码 4 D) h# D9 o4 E* g
此处改成实际偏移大小4 A6 ]; e5 _* A+ n$ I0 V
( U5 f A4 z, H
还有就是BOOT篇中说的,要开启全局中断哦
) H: M( Y% O8 s/ y; t8 R+ c1 w9 `————————————————' ?" d6 G V1 Y8 j$ I2 ~
版权声明:Logan Li
: P2 X/ r( q( g# t2 \5 n2 U7 m/ q, i4 K
|