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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:
+ \% W+ y9 y2 U( h# o* ^6 r# R' ^8 A+ p8 R+ K& y) y5 W
1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。* c& V2 F3 g0 w0 {

8 a; s: f$ v; N# o2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。
6 y) d, s5 K; R6 M! S9 |
6 C+ K  P' w7 d) X, {3 f7 d5 c% }3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。
$ R8 C2 g2 y1 f) N' i, n
3 ^: J9 ]; r! a4 P$ [$ C先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:
8 o) C- d4 P. h( }
* {' P( K7 d) e# I2 F芯片的启动配置设置如下:5 ^( u4 Y( E0 P% r  }

# ^! s+ `4 U- `' j( F8 E
20201112110425968.png
9 U) ?! O$ s5 u
$ _$ S, I4 F# Y$ \5 s$ K0 b* i: Y
如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。
( L) a% @; ]' n0 K7 T, j) A; g0 W- M, g
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。
% s+ z1 a, e7 V# m# r$ X, q8 ]. d& H5 q
于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。! ?6 H3 V# v( ^3 P

" x  j& x* q5 `5 o1 y' R9 [但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。  g! r6 K0 r1 u* y8 }

. x8 |4 H8 i: ]- n2 `( cnboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:
5 n8 P. \6 Z& Z( I
; j$ \! H2 I( L( R
20201112112032550.png
4 e: s5 z; _0 w3 }9 g5 q

+ Y2 K7 Y" h7 B# n- }2 y* H问题1说明白了,下面解释问题2:
; n6 q9 T8 A3 @. p# G6 @! b5 T3 u, _. x* N' E! j
为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:
, i$ V" z: N* G6 b
4 y' y+ ~  F- k+ G$ S芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;5 \9 s( D. p1 Q  F
$ V8 U$ W# j6 ~; [0 o& I6 H
芯片使用手册原文如下:
4 b, X% f; H8 h& r; V
$ D$ j3 |( V. z# F& z1 L, X6 i  S
20201112112407867.png
4 b3 A0 Q8 x2 q4 p& l% ^
7 I" Z9 Y! X# F% n
翻译:
$ ~* C  F& m8 I3 n. u0 I: A( e) D3 m* Y, @" J
内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。; P( l2 n$ ?' o
6 u0 h& r6 A3 E& M% k- z
该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。' p9 N' B- Y9 d+ X7 J) A
8 g% p' z; @) G6 d# ?! J) ?, F
如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。7 |, e7 g9 N) l& |' R
& [; f- V8 ?7 _
通过上面的翻译我们也就明白问题3的原因了:
4 J; U/ d( k- W" P" M
4 f8 b* N: s3 Y2 ~% A0 h因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。' g/ j% U% g: G" t* V+ b

) g+ u) T3 A( h& l( P在首次断电重启后,后面的swd烧写就可随意reset了。
! j3 O6 v1 n% {' ?2 u! Z, G
5 X/ A4 _% x$ G7 w+ l% g3 }上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:
, Q# Q6 z8 U# ]3 |' f  Z3 k. b( Z9 M# b1 \9 E" S& e0 K9 e% v8 P) b
方法1:使用STM32CubeProgrammer更改。
% F9 e  g1 e: c8 t. e/ t1 Y5 @6 r. R
1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;9 W, k) ~; a+ v* K

' y. A* H8 Y+ I0 A4 @
202011121442406.png

/ n5 O, m* k9 z7 Y3 _8 g
' K( B4 }: V2 D- S% F: ^, _2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;5 p/ U9 n# W: W! l7 M+ w  E

% M2 q( t8 q1 R( C# k
20201112144451335.png

, I( m; H! T0 a- r( G+ ]8 n
; S2 J; u7 ]$ ?0 p+ ^# u6 o0 V; Y) L3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。
  H: E) ~+ w0 t+ A2 x$ a
/ |, G( x; {% A
20201112144632947.png
& X" ]2 ^& W2 E9 R2 j' r1 o8 j
0 F" X$ }+ E2 L( \% w" r
方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)
% y! j  ^; \8 ?: i! ?! r% Z+ U& m" ~
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:
# c  ^; d, ~* v/ _0 K! d3 x# U4 {0 H4 x: N3 s1 s
20201112150726870.png
2 e# C& Q; y$ m1 e2 f! g4 R

% ?0 X% u, a6 oSt的hal库也提供了修改的库函数: t9 @9 i1 b# `5 H
) m: E% u" `/ z' J: p4 \+ p  W) W& K
20201112150726891.png

( N" N" ^2 J/ {/ W) Z1 t- b9 X1 ]- m5 v* i! m6 r9 n  Y

- E/ g+ ?& \  B3 w
收藏 评论0 发布时间:2021-11-8 01:02

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版