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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:
1 u, L. r! D3 e4 t% I  j* X
4 W1 G+ b" s* x: k0 P1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。
9 }# r/ a4 Q) R5 w, S2 i  b* E& U. b0 |$ d& w5 D
2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。
9 c# ]4 G  L2 W+ ]" T- B7 @
$ a( C2 U9 m  \3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。" N/ @' `- R* k- t) Z

  m! E" _" h: E  k先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:
6 h" i/ d+ v, b& v$ b  W' D
: V, v0 L- I% l6 Q芯片的启动配置设置如下:: J4 m- ]1 J9 X. F

3 E! |4 D# `& X/ s+ s
20201112110425968.png

7 q* q/ I7 r6 a2 ^1 c" M( g' v" f) s( k0 }+ i0 O  j: `' m
如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。
& T+ ~9 V$ `. r! p2 n+ E& Z# s4 [. ?- k
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。
2 Y/ ~5 x/ j; I9 ^! L1 R+ [! j
  W7 ]$ y6 V8 L* s, x于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。1 D, ~/ Y& E5 i; \

: m7 o. ?* ]3 c' ]" t) p! n7 B但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。, H, Q- i& o6 ~. g
" W% f& t/ u! F4 r0 |5 C
nboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:- H2 {! F1 `/ s* l+ L

  i/ ^3 Q+ E+ @2 V  ?- W: u" p
20201112112032550.png

: Y4 K9 M- p, K3 g  h7 z, A
% c4 a% w2 _+ `! e7 P. ]5 {- f问题1说明白了,下面解释问题2:
5 M! S1 C/ [  R5 o$ ?0 y/ E- I
% \- o" u% F5 C" Y( Q: j: o为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:% s5 |7 [! `  j2 ~( e$ @# L

3 g7 k: C' }, d2 ]2 `芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;& f6 r; Z0 E2 A9 `; y. P
4 d$ C' k3 X+ K6 p* H
芯片使用手册原文如下:
" r4 ?- E; `! Q" a" a6 ~
/ s2 ]  Y# d( T) a
20201112112407867.png
$ A$ A' L& r. [* G- |0 {% u9 x

/ }9 w* A8 C6 _- O7 B翻译:
& l. P/ P/ j( q+ l0 o; [2 |8 i/ u& o" v& }: _! c7 ^3 Q3 p1 Y
内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。; Y2 ^  t3 Z  T1 V0 \* J0 J/ \

. u8 V; @. H' ?1 M该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。' a/ l+ `, Z# Q1 D( L* s& ~

* u# t2 K2 j8 s! x& g如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。
- v. g( z9 Z% D" E
( F/ W  l, R0 X1 f% w通过上面的翻译我们也就明白问题3的原因了:8 ^% b0 [7 @. g1 R9 m

) a7 q4 m3 }$ P6 T9 E5 S: i因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。2 L6 O9 W: \0 S- O+ a' n/ H

; z5 J" A5 G6 `- F! Y2 P9 P在首次断电重启后,后面的swd烧写就可随意reset了。
. v" [& {) R/ _4 D1 z% s* `. q5 C/ _# n) t( U8 n9 K
上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:
& h1 @' J4 {! P/ M
0 E% U  k1 r% M$ |% _+ Z; m% ~方法1:使用STM32CubeProgrammer更改。
( K- }: o* j  a' P' h; @% {
# N4 F( S1 ~! u" m$ t* k: u/ Q1 a/ ]1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;
0 }" \: n, y: h3 A: @  @+ o
4 Y! X) p. W  O4 z
202011121442406.png

0 a3 A4 R* |6 h% U: t
3 w5 Q9 O4 m# ~9 f% z2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;
/ F1 Q9 J3 m2 n" T( R0 P: o! n  ]+ k. X' {
20201112144451335.png

  k. r1 I5 h& I& U6 I( k) H
! U& Y" B! ^9 g0 L- Z! Q' P3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。
% v# x" J0 u: @& h0 p: r
  m" q1 g+ @1 @* [  ?- q/ p
20201112144632947.png
" p) q( S& h' i9 C

/ _) N0 b/ T. X' ~# Q: b方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)
1 u0 n7 j) k& }. e: j1 _; n* p/ g1 O" V( H- K$ |4 p' _0 K
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:
' M4 `, p9 X  c. e" T* R* o3 t% R6 f& P' F1 r
20201112150726870.png
8 ^( }$ B; j$ r* s1 p& C8 D# s
: z& u; w" `% A) Q7 `
St的hal库也提供了修改的库函数/ K) Q. M! ^+ F; s9 y7 C+ N) A
% L. S0 ]( q$ \: ?" L
20201112150726891.png

4 |9 N& Q, w; Y$ y  A
% M. O4 [* e5 |  {1 A6 {1 Z# Z, R" N9 d, X' i2 K! s" }
收藏 评论0 发布时间:2021-11-8 01:02

举报

0个回答

所属标签

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