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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:! {1 f' j$ x2 l) e1 p! D  B

7 v# Y8 O4 g7 m3 q, ~1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。6 e. ?4 b+ z% B* ~1 h( o

, c8 ]/ x" m8 H9 _- |2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。
) g) s3 [( }4 D3 Z5 ~! ~. e' V' U& q# a, B
3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。3 j" {4 T! |  |0 k, j& ^
) n0 ^6 m. o: S# S9 Z! Q
先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:% [# M7 q& i; {; T$ O9 W% k6 r+ W1 W
5 B6 p# K% Z! N* y# ^& U/ c6 C
芯片的启动配置设置如下:# G8 R8 [" `9 `( a
) J0 V! u3 b- y8 n* v' v
20201112110425968.png

0 [, T! }! k' E% o7 @- Y+ P1 \, |, |
* Q- m! v, I# l0 r* A0 ~如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。. L4 R1 t; Q- T7 V2 Z# A  {
7 i3 R7 ^+ g& t  R" {9 p
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。
& s" r7 I* L& q. i6 T* S8 h7 O6 q
4 ~2 f3 v) N1 {2 t* {! X! ^于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。
% S3 R+ _# Z, G1 i2 Q
0 h$ U. c9 N( a5 T) }2 J但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。
% A0 j0 n0 Y& d/ ^
& d5 K. \7 }) r1 I$ _nboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:* g# Y9 Y* N' U& Q- [( \( O/ M; l
, S# A; w/ y; J  k
20201112112032550.png
" |8 n$ y' C: z5 B3 W0 L1 K) v

! {5 c3 r8 w9 Q4 w, ]4 g; p: s问题1说明白了,下面解释问题2:
6 @) L  |# {4 H; g: d
" F7 c( Q7 s! C5 C- _! G( t+ @为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:
4 \6 `. W/ M, B* {+ |1 c& @! U7 k5 H5 o9 W& n0 I9 \% K
芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;
. }0 X( b8 }/ ]# h3 U/ K) y  M1 w+ Z( Y( T/ L7 q5 c
芯片使用手册原文如下:1 E  H* c# e9 ~

0 v" j) T6 }9 m
20201112112407867.png

/ C. g" k; C. s8 ~7 R4 b3 e7 S
% |4 {: ]& c  J  u) _2 X翻译:
$ r4 p$ W8 {4 G, P3 I5 ]# ^( E2 s
7 A' P' u0 g& c) J$ I内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。! U' C. x) M6 y6 g$ P3 M$ M

( r( E  D; L% b该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。
0 j6 {3 H. ~/ @; \( T3 y# i( W( K' ~% H# W& r* x" B5 \& J7 k
如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。
9 F) }  l/ s1 u; J5 N* i7 o, K. `: J, q. H4 z0 P$ u
通过上面的翻译我们也就明白问题3的原因了:
4 v: c( K+ }; ?5 q" X
$ r+ h7 N. m0 E( ]: u: Y3 z因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。' q) N0 j  O$ L  k

+ i. H5 l( K4 k4 E. Y( C0 m在首次断电重启后,后面的swd烧写就可随意reset了。5 X! H! `$ \1 `
  g+ R6 O& A0 c- _3 s8 D
上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:) G( @' o; I$ v5 h/ Z

4 e7 V( A/ J' }方法1:使用STM32CubeProgrammer更改。
, k* ]: X: y& t% |, R2 I* f6 y4 G+ Q
; b- b; w% V$ v* T1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;
# A$ [+ e% @' i$ l7 l  i4 @) }* U1 R5 e1 @; x3 e
202011121442406.png

* c' x: H$ b( L; C* i+ \3 b' C  b* @- L- b! t1 J# h# f& F
2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;
, T- R( j' j4 `' J( P+ S+ ~: `- p1 u5 @& N. S4 ~1 ^  |
20201112144451335.png

: A% u- s: r9 a9 R7 z: Z, g& z7 n# o, x
3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。5 R6 a. c4 w/ ^

( A& i5 r( w4 z+ J0 V1 T
20201112144632947.png

& [2 n6 G' A- p, w: t9 z/ S$ B/ e5 Z' s" o$ P1 h, n8 ^
方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)
0 _4 A8 n5 F* i6 }. a: h% W- K! U& Z+ ~
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:
4 O6 r/ B9 ]; b4 ?4 M/ H3 r/ \, p& [/ g# g1 Y; F
20201112150726870.png
2 c7 ^# \2 P1 O7 C

5 K+ f2 w, v" |" }! g: zSt的hal库也提供了修改的库函数. A9 q- }/ c' j- H0 G7 S

2 i, P4 a! }# ?
20201112150726891.png

! v  ]3 G" ~" C9 e1 Y/ @8 g  _6 t/ W% q
! a: l: V: U5 L" Y
赞 收藏 评论0 发布时间:2021-11-8 01:02

举报

0个回答

所属标签

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