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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:
: Q, ]8 e" q5 [& c6 L+ V+ a/ k  a7 S6 ~
6 p  K4 Y2 o' j4 v" ~; d; t1 L1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。  W! L4 x5 |9 r* h2 R) G  S
4 T! N7 @- J* q: e. m3 T/ h* e) p% X
2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。8 \. S9 y" r0 I* Y9 n  T

8 P6 ^2 c. v- s  J9 Z3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。5 {% p# _" ^" _

8 w# d$ e3 F9 r) ]6 Q9 @9 T( u; }$ \: p先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:2 }) L4 i, S7 S  }% v/ N7 p" z

0 j+ M( S2 @' i, P+ Q芯片的启动配置设置如下:
) G/ O, Z1 ^- L6 h- M7 ], ~: O0 v+ {% K9 m5 n! w5 t
20201112110425968.png
8 A/ m/ E) O0 {
/ C9 Z8 z- ?# x! l  J2 i
如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。
+ q$ B1 q5 {  [! D3 X6 W2 M6 w3 b- w7 _; ~
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。' z7 V# r8 R! Y! p* Y% L8 g
' D7 M$ Q% A0 A# `' O. h* h
于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。
9 r% h. y$ E. E* _! a1 b3 O" D
" N1 Z, k& L# A但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。8 a# W* ~; j" b% z

7 E+ j" U  W1 Y  snboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:, Y" |. [+ H7 _" o0 a
3 {- g  T  g( S- h, n0 n8 d( e
20201112112032550.png
, v4 H8 F* H+ b* t9 H

  @/ k3 ~2 G+ @& o5 Z9 G) R问题1说明白了,下面解释问题2:; ]  `4 j/ v+ w: p

) q% U5 I0 ]8 K, u; N5 c+ c+ q为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:8 o3 S1 T7 P* L" u; m1 B* F
" H/ y8 ~  i$ G) ]! P. K9 {1 Q
芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;
4 p. z9 e* \% m$ V0 Q1 s& `7 k% r# P6 y# {- O
芯片使用手册原文如下:2 O4 l, U7 A) h6 I
9 A# J. B% o  `0 w
20201112112407867.png
3 p  i$ b+ X8 ^, Y1 G7 @
+ H7 p. f9 G( l) u0 F2 v$ H
翻译:  V$ }% P. E4 f5 B# f
0 _; `0 \, W' H( j' P/ e! c
内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。
1 X4 w; C4 q" @3 N, L$ ~4 ]& M: K9 k! W$ B) w. m5 q
该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。
( n6 B# u3 E2 s. V7 ~
# _' q7 O, ]2 [. ~- }; U如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。0 i) v2 B& j; r0 [- u& a

- g+ {$ D6 I0 I8 J$ W) O通过上面的翻译我们也就明白问题3的原因了:2 W. g8 b0 ?4 M3 b- I

( X, i: B& u8 s8 D( \0 X- g因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。
6 x9 r) S* z) b' Z/ V
5 ?/ o' j! z1 Z3 H在首次断电重启后,后面的swd烧写就可随意reset了。
" t- u' W/ ?- y
) r" Y. s+ i9 `  m上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:" v" S! g0 z* g2 I& C
; c$ H3 e( m$ V% }* I! y
方法1:使用STM32CubeProgrammer更改。
# P& l7 z$ F4 O4 n. n3 N! [0 _' h8 o  Y1 G7 Y: _9 ~  H$ Y3 u
1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;6 Q3 {6 B& P2 W2 z, a, ~' U& E

: k+ w9 ^. W' Y  o. d
202011121442406.png

1 K: |" v/ {# [0 |/ Q$ _: U+ |/ w' k7 X' a2 E- T3 X
2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;
/ @1 A, a7 S7 G, Z" t
9 p1 i& K& c% l4 C4 ]
20201112144451335.png

6 m! p' a9 K! W/ h5 q5 E# P. {* C, t' s* Y% `
3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。
$ z- @' F  Z) P4 S9 q, c0 s. f5 B' b- v$ H
20201112144632947.png

' e+ b( K3 O% ]: A+ x: `9 q
! g9 @3 l0 N: O: j' \/ v: H4 [方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)
+ P$ ?- y8 v, T0 L& L: O' \* s8 y5 c' ]* ^. c* n( C! k1 r3 X/ V
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:! N: @! T. H. u# v( C
. z  ?# x8 u# Z0 B) b- E
20201112150726870.png

9 ~; e  W6 z* R
( f/ U' [! H" q  ASt的hal库也提供了修改的库函数
$ b7 S' i7 f' @" d" e. `. D; ]
20201112150726891.png

1 \% x: B% t2 w6 g' f% r7 o8 r" l/ E

' Z$ g7 j3 w: d* K! _8 D4 j0 }7 T
收藏 评论0 发布时间:2021-11-8 01:02

举报

0个回答

所属标签

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