目的
9 M/ w# r, y& ]/ a( `7 ASTM32G是意法半导体这两年新推出的系列芯片,相比原先的F系列的芯片有很多提升点,将来必将取代F系列芯片的地位。对于新芯片的应用来说能够正确下载与运行程序是比较重要的一点,这篇文章将对 STM32G0 系列芯片的启动配置与程序下载做个简单的说明。
( R6 t) u0 z+ f5 C, W0 E1 K9 a1 I3 j0 D; P% X; z% V3 o
0 M$ ^5 Q# p3 v- R. P& h启动配置
6 r* i/ S) \, ~0 _- L, I/ _6 q& }STM32G0系列芯片的启动配置相关内容在官方文档《AN5096:Getting started with STM32G0 Series hardware development》第三章中有详细的描述:
' {" z& J! ~ G7 u( A/ \启动配置相关内容其实是不多的,下面将对这部分内容做个简单的说明。' u; h5 E! V& w* y7 Y- Y" c [
3 ^# w9 F( R1 [) a7 B$ J: D8 k5 u4 {9 ]! H1 v' O! K
STM32系列芯片程序启动方式分为下面三种:
- ~" S0 ?! n( X6 K1 V: M \- E) o2 V, B+ S3 f7 }. v9 v( x
, V( _2 A( G! E0 w; D% k
Main Flash memory 从主闪存启动,想要运行我们自己的程序就要选择这种方式;6 _, Z; a1 V* s8 Y5 F: @% h ^* l
System memory 从系统存储区启动,想要通过串口下载程序就要选择这种方式;
$ p4 M9 |9 E. S0 jEmbbeded SRAM 从内存启动;% E* j1 \6 J `6 H( R
STM32G0系列芯片通过选项字节(option byte)中的 BOOT_LOCK、nBOOT1、nBOOT_SEL、nBOOT0这几位加上外部的 BOOT0 管脚的电平来确定启动方式。当 nBOOT_SEL 为 0 时, BOOT0 的值来源于外部的 BOOT0 管脚的电平,低电平为 0 ,高电平为 1 ;当 nBOOT_SEL 为 1 时, BOOT0 的值来源于 nBOOT0 的值。. j, g* i( g6 ?1 q4 n& a
, r6 J+ `+ E! N/ H: o2 L% f7 x; {, s2 u
芯片启动时会检查闪存地址0x080000000(即用户程序起始地址)处的数据,如果该数据为0xFFFFFFFF则表示用户程序为空,此时不管上面的那些设置程序会从 System memory 启动。1 t3 z n) r: {0 a8 o
, M0 t' w' j- \/ R" E5 Q$ ^, N5 i8 ]1 u2 z2 L
芯片在出厂后只要没有经过程序下载等操作启动时总是会从 System memory 启动。' w4 ]8 W) U: {( y7 B' T
. Q( X6 A' m# ~$ K$ O8 `7 z6 u
程序下载
( v4 }$ \( q, T5 Y& J! uSTM32系列系统程序下载通常通过串口进行,而使用串口下载程序重要的是要让芯片从 System memory 启动。
' f" ~8 g3 \$ H; E; G
/ |" T) U8 l$ O& _! ?' N9 j* H5 B0 d# N- S: x( A: w
从上一章节内容可以知道芯片在初次烧写时就是从 System memory 启动的,你可以正常使用串口进行连接烧写,不需要关心外部 BOOT0 管脚的电平,如果连接不上就拉低下芯片 NRST 引脚复位下芯片试试。(如果还是连接不上就检查下芯片供电、线路连接、串口模块、串口驱动等试试。)" X! i$ A+ `& P: h
: `( X; E, m5 Y4 ]% L( v' p
4 T: y6 h* _- `# S" ^# h2 d" K5 P在初次连接芯片烧写程序前特别需要注意的一点是配置选项字节(option byte)。默认情况下 nBOOT_SEL 和 nBOOT0 均为 1 ,也就是当你在这种情况下下载程序后下次芯片上电时将从 Main Flash memory 启动(不管外部BOOT0引脚上的电平是多少)。如果你下载的程序中没有操作对 nBOOT_SEL 和 nBOOT0 进行操作的话你再也无法通过串口重新下载程序或是修改选项字节了。8 u" Q- K* Z: W7 c+ g! }
补救办法有,那就是通过ST-LINK连接芯片进行程序擦写或是修改选项字节。(修改完成后可能需要芯片断电然后重新上电才能通过串口连接)
3 w2 D9 Z a* x* J6 Y如果更严重点,程序中把ST-LINK连接需要的 SWDIO 和 SWCLK 引脚用作它用了,ST-LINK也连接不上怎么办?解决方法也有,断开这两个引脚上别的电路连接,然后将芯片的 NRST 引脚保持下拉,这时候 STM32CubeProgrammer 上选择ST-LINK点击Connect,然后断开 NRST 的下拉,芯片会在启动的一瞬间被ST-LINK连接上。
& A9 C. `; D! C
6 _8 r8 E! d- b1 F% s1 g
) F* w0 ]. v* V* g6 o通过程序修改 nBOOT_SEL, @" _; Q6 i2 Q8 n, }1 S" C
使用HAL库进行开发的话可以使用下面程序判断nBOOT_SEL数值并进行修改,注意修改option byte并写入后会重启芯片:2 f# l% V# _8 J# D1 R4 f
- void Flash_OB_Handle(void) {
* p7 h% h" c |* D7 U* o. I* [3 | - FLASH_OBProgramInitTypeDef optionsbytesstruct;4 k- _1 a' q; }8 F" [& f
- bool UPDATE = false;
8 }8 Z( x b9 } - 9 @7 |/ J1 G) _) ~3 |0 U. C
- HAL_FLASHEx_OBGetConfig(&optionsbytesstruct);
" v1 c$ @8 ?4 F+ w6 I1 J - uint32_t userconfig = optionsbytesstruct.USERConfig;
: K) u: I1 o- d2 @3 O
7 m; c) M. {! s3 b9 w$ q9 T- if((userconfig & FLASH_OPTR_nBOOT_SEL_Msk) != OB_BOOT0_FROM_PIN) {( z* X3 J3 E- j
- userconfig &= ~FLASH_OPTR_nBOOT_SEL_Msk;9 q' S9 R t8 c$ o8 {+ i
- userconfig |= OB_BOOT0_FROM_PIN;# F7 Z1 @* W, m) I/ b$ o( U% d+ c. c
- UPDATE = true;# E# q3 e; X4 w; [6 ?" l" k
- }2 @' Z/ {+ r4 R# s
- / L" ?9 \: w* e: ~& t7 k8 V
- if(UPDATE) {* g1 K% t$ q7 G+ y) P/ t. j
- optionsbytesstruct.USERConfig = userconfig;9 L) a0 S7 p! W
- HAL_FLASH_Unlock();
1 C% G* ~) Z& f4 H1 j - HAL_FLASH_OB_Unlock();) W1 S/ K+ |7 H4 j% v0 c
- HAL_FLASHEx_OBProgram(&optionsbytesstruct);' l1 @: c9 y0 a6 O5 \) V3 R9 u
- HAL_FLASH_OB_Launch();
4 t8 k$ M% P8 Q4 ^) @! M - HAL_FLASH_OB_Lock();# |8 D, Q4 Q. k0 P8 @/ |
- HAL_FLASH_Lock();
$ w/ F# V' u8 e* n - }* U! g; o+ b2 P3 q5 `
- }* ]7 O! \. Y. _- A& ]
复制代码 总结
: m0 k& C C4 T/ H0 z# x% K6 f3 i了解上面内容后在STM32G0系列芯片上下载与运行程序应该就没什么问题了,配合STM32Cube等就可以愉快的使用新系列的芯片了。
* z6 \& ]' U k! |+ v( q; V
- M/ n j) \+ W; ]
. g- g1 E; u3 E% A- s- u$ ^ |