你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】Stm32g031芯片无法进入bootloader的及首次烧写完程序reset无法运行原因分析

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:
% x9 S8 t. V8 F9 o9 N
. K- |6 r2 @" ~* Z) E* s7 N1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。
; M9 [/ i" X3 f- S  X9 M- Z. w8 d" W
2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。2 E7 I5 q5 R! Q: O
. c, @! T$ `( h; x3 C
3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。+ h; K: V& ]& ~4 z7 x3 Z7 Z

+ E+ G. ?# Z  b7 |% p  P+ [1 }先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:5 \( T" y: a4 y0 f2 T$ U

: p4 A+ l2 N, X' O6 x0 e  `, c* X芯片的启动配置设置如下:
7 _* Y3 `& m: q5 V( L+ E6 ~* L9 ]' K8 Z: I, r
20201112110425968.png
+ k: q2 f1 K4 T2 n% _; Y% k7 d! X

. M  F3 G6 x% ]! N如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。
4 Q9 k. [. e7 m% f. z) E) S9 c: N( a6 K8 F6 {; i6 F; l
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。
% l! F0 L, O% g1 x1 f* U# g
$ w# e! u: {  k' h于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。
0 O) I' G  \% T4 O( s3 k9 x. o% k1 ]* I: Y( c6 a
但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。9 o9 d7 j+ d6 q* t, z

& e# Z$ ~& g: q: f! Lnboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:
% \, B" p; E6 U% K3 _, i7 D
1 E1 _" v8 z" X; x: d6 x9 C
20201112112032550.png

& O! }5 c9 x/ c% ^8 v, \9 }" ?/ w9 w. i  d" `1 h  k
问题1说明白了,下面解释问题2:  F- V' s. o" z- o
5 F9 j) H: ~# _. k; [1 K
为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:+ C4 ?4 G) R9 A. D
" g1 t* m2 x& Q; l: X9 p
芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;) |' t, ?) p- _( j2 P" n
# [+ X/ m/ y% E9 ~) \. S: x: v8 @
芯片使用手册原文如下:
* p8 k7 H" R+ W) ^- W
& R3 e- C& ~5 C
20201112112407867.png

2 |# z% U2 N: p' N: l
6 O* ]- R* v! u+ o翻译:3 D' U+ W7 r+ E. k+ `

- V- a8 L8 ]$ M' K内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。
9 y  N' y: V: `) c' J) |4 |% y% |( }3 h3 \3 i  s2 R, I7 t) }
该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。
; ?* Q% R0 C5 x9 o& X  U4 ^# U6 W
) Q' @$ V; j! d" q4 \( E8 i如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。* W# l) w9 x) R4 H3 Z

- B% P( K* p% R4 O7 i8 h/ Y通过上面的翻译我们也就明白问题3的原因了:  Y, k* @5 W; \: Q; v' E' q
. k2 E) O) G+ `" ?; m
因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。
0 |3 O5 G5 C7 C/ b( V/ {# ^/ w. c$ O! J
在首次断电重启后,后面的swd烧写就可随意reset了。
) T* N% E# M4 K: n- Y
% Z; L0 U3 p8 g( u: r上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:% W% e9 a5 w  b$ J; \! t: y

! g  U. }) f% q* K$ B" j方法1:使用STM32CubeProgrammer更改。
4 S# f6 ^3 J- V3 x7 j
) B# I$ E; i$ b1 {  M& E) o1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;% X0 W/ l! Z) |; P  `
3 z5 s, m+ p8 |6 e$ E
202011121442406.png

$ ]0 q: V0 q" r7 `  `2 B) R( O$ C- z6 S
2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;
. I: W$ ?2 x1 R; h3 r4 Y- p/ ]3 V% ~9 Y
20201112144451335.png

2 m; R0 ^9 K6 t0 E* |
+ k0 W- [# Y, M+ B, o7 w3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。
/ K1 z1 U2 ]; ~/ ]- g. L# D
# A* [3 G. Q3 R, }7 V
20201112144632947.png
# H2 z6 R9 A4 R, a
- m. W9 X+ `9 b% n: o
方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)8 {! G/ G3 Y. O2 ]
5 c5 s3 j8 O: _+ Q- `3 _' D9 j
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:# p2 l: y6 S* d; }
9 I* U7 d, @" {- E
20201112150726870.png
6 K9 ~( P6 h0 A6 z9 t: v" N
0 j  t. A+ ~$ W6 S; ^4 R8 e
St的hal库也提供了修改的库函数
; p4 |8 V' w8 u
$ e5 J( x) B1 U
20201112150726891.png

. K" f% u& v. I! P; d/ ~. w. @, P/ I
+ _) H, L$ Y7 p8 ~
赞 收藏 评论0 发布时间:2021-11-8 01:02

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版