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

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

[复制链接]
STMCU小助手 发布时间:2021-11-8 01:02
遇到的问题如下:$ w" s$ t  r$ U  g0 M0 @! r% s
- J: _  t7 d$ \
1.boot0管脚拉高或拉低都不能从系统存储区(system flash)启动(即进入bootloader状态)。
4 n; l$ B7 K- S% s2 ^
  B9 S. U6 }5 l0 |- u$ ~2.新的Stm32g031芯片能够使用ISP烧写程序,但写完程序后就没法再次烧写了,芯片无法进入bootloader状态,只能进入main flash中,运行之前烧写的程序。; A3 a9 O6 I6 H  D: N* n5 C% I  I- z
  g, }. z/ f6 i* A
3.芯片第一次使用swd模式烧写完后设置了reset也无法进入程序区,即使按reset键也无法进入,必须得断电重启才能运行烧写的程序。) H+ v6 L( V0 K/ F! k4 c7 L

8 V8 X% D! c6 ?6 t先解答问题1:因为Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用,所以不会进入bootloader状态。原因如下:7 O) D0 u; k5 z4 p  {$ {

8 E  |, J4 R% V, |芯片的启动配置设置如下:
) G5 i2 \7 s+ }3 A6 T8 v5 N/ h5 F
4 N5 a* K# y! ^- |. e1 q! y2 |5 U. r
20201112110425968.png
0 H( \/ ?# ?2 \( ^
- u* N) O  m7 J( C
如上表所致,芯片的启动配置由boot_lock bit、nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。
+ r" n- q6 U( L4 d2 L/ @, t2 n  p# ^* n) n
boot_lock bit是强制从main flash区启动的配置位,默认是0,即没有强制从main flash区启动。) I9 _7 G' N( [/ a

+ T* u. Z+ y% R( g1 k. y- R0 J' h* T& |于是启动方式由nboot1 bit、nboot0 pin、nboot_sel bit、nboot0 bit决定。当nboot_sel bit为0时启动方式由nboot1 bit、nboot0 pin决定,即此时用户可以通过boot0管脚进行启动方式的设置,可以使用ISP下载方式。
  s9 ~. Z6 \% Y* @* P' E3 q7 E$ h' g- {# _7 k0 l
但是很不幸的是Stm32g031芯片默认nboot_sel bit为1,即下载方式由nboot1 bit、nboot0 bit决定的,而nboot1 bit、nboot0 bit的默认值都为1,从而导致Stm32g031芯片默认是从main flash区启动的,且默认boot0 pin 不起作用。# y6 ^0 @4 q* Y* z

0 ]& ]9 F- c! Z% X; Q$ F3 @# A+ anboot1 bit、nboot_sel bit、nboot0 bit所在寄存器地址及初始值如下:( W. ~6 H3 K( b: @. U$ }. E( q/ b: Q$ W
1 M( m6 Q5 g3 v. q& i& c7 v
20201112112032550.png

% ?% o4 I8 V: y5 K! L4 b1 |( Z& e! I- s
问题1说明白了,下面解释问题2:
7 z( `* N( z2 Y$ o, }5 g% u% m3 q  u, L+ ~% f0 s; _
为何新的Stm32g031芯片可以使用ISP烧写,但也只能写一次,第二次不行了呢。原因如下:0 `3 B. K; o0 ~  t
& s# v3 g3 S1 T
芯片刚开始启动会检查main flash区有没有代码,要是0x08000000没有代码,就进入bootloader状态,要是有代码就从main flash区运行;6 l* @) X- o  `( `, j/ m4 C$ ~; L; \
. u4 `( Z/ t1 ~6 ~
芯片使用手册原文如下:
( _+ c9 C, {( R9 I, M- B% ]9 I( {5 E+ J& A3 z7 H: h1 z1 `' P
20201112112407867.png
' z2 w3 i" l4 c& A! C2 y; P( A$ r
0 E5 c9 `' k9 B( L+ m" A
翻译:
6 \5 i8 T- J$ I% u9 I3 `3 h% s9 d  `+ W1 [. d3 U& o
内部空检查标志(FLASH访问控制寄存器的EMPTY位(FLASH ACT))的实现是为了允许引导加载程序轻松地对原始设备进行编程。当BOOT0引脚将主闪存定义为目标引导区时,使用此标志。 设置该标志后,该设备将被视为空设备,并且选择了系统内存(引导加载程序)而不是主闪存作为引导区域,以允许用户对闪存进行编程。
. E1 T1 j; _- V; G4 N; V; W6 I  Y2 [
该标志仅在Option字节加载期间更新:当地址0x0800 0000的内容读取为0xFFFF FFFF时置1,否则将其清除。 这意味着在对原始设备进行编程以在系统复位后执行用户代码之后,需要进行电源复位或将FLASH_CR寄存器中的OBL_LAUNCH位置1以清除该标志。 EMPTY位也可以直接由软件写入。
) {/ A6 R- ~% f0 v5 A( b, M. l* ]  u; b/ R/ o+ @
如果是第一次对设备进行编程,但未重新加载选项字节,则在系统复位后,设备仍将选择系统内存作为引导区。
8 R2 V7 g7 l4 @! {8 l/ h) e% e' J0 n8 `1 e# Q4 D- V+ f
通过上面的翻译我们也就明白问题3的原因了:
# w# d1 ?# w& T  G  [" j
+ W9 v& A0 T: B; S/ W因为芯片首次运行进行了空位检查,此时的empty 标志位(即OBL_LAUNCH)已经置位了1,当使用swd烧写完程序后,无论是软件reset还是芯片的reset管脚复位,都无法把empty标志为清0,芯片会在每次的reset后都进入bootloader状态,而不会进入main flash区。只有断电重启,empty flag才会变成0,此时芯片才会进入main flash区运行。
: l; y5 u$ M* ^) b" |. I& W
1 R% X! o& I- k( x2 A& s. `! c+ x; }在首次断电重启后,后面的swd烧写就可随意reset了。6 M8 ^$ D0 T, g7 T9 p

2 E+ g: x5 n3 T# D上面3个问题已经研究清楚了,那么如何更改芯片默认的启动方式呢,根据上面的分析,我们应该更改0x1fff 7800处寄存器的nboot_sel bit为0即可使用芯片的boot0管脚来决定芯片如何启动。更改方法如下:8 x& F3 ?7 ]! J$ B6 d* |5 B

: u0 [0 k' N8 S2 z) O& _2 h方法1:使用STM32CubeProgrammer更改。# R) Z" Y0 @6 w. x9 @$ k

* |1 y; G2 S! F1 v& q1:使用STM32CubeProgrammer成功连接芯片点击主界面read,如下图;6 v, G& P# Z7 T$ S

& M  k6 H: B) Y
202011121442406.png
! T& J7 k( q$ ~/ V. I$ d
7 ?3 e/ j. H/ K$ H! l* r
2.读取成功后点击OB选项,然后选择User Configuration,会看的0x1fff 7800处所有bit的配置值;1 ]1 ]. l8 N; f

. k1 ^4 N% R1 L& O4 a
20201112144451335.png
8 _" g5 S7 ?9 u% X

2 x! s6 G0 Z& U1 V$ _( X1 `3 将nboot_sel后面的勾选去掉,点击apply,配置完成(此时可能会弹出读取失败啥的,就不用管了)。断电复位,此时芯片的启动方式就由boot0引脚决定了。要是想进bootloader模式就得上拉boot0了。
8 I/ U. o7 _+ f) W% a
/ E; ?$ s- A1 L( @
20201112144632947.png

1 w6 T( f) {3 U9 {0 P9 c6 U, I
& }- @9 x7 F! q; L# Y1 q方法2:在应用程序里改(理论上可以,但我改失败了,芯片成了砖!!!,至今不知道如何挽救)/ V7 _* M/ d6 U# i
6 k4 U- K# U* t9 ?
为何理论可以改呢?因为芯片手册里对0x1fff7800寄存器起名了,且为rw状态:
$ a  P+ i5 N; X# f% d* \* E6 `5 l- p1 U$ v0 S
20201112150726870.png
, v4 ]. ~, [. ?6 ]1 w! E

' Z& `" P$ D8 n8 ]3 v1 D& rSt的hal库也提供了修改的库函数
# x' m/ Q) t3 f! H
2 L( {( S' H5 [
20201112150726891.png
  H4 e5 Q5 @! |# K- J% @& K" I- m
; y# G) r0 ~# A+ K, g

% C- x5 X+ l# a( P6 M
赞 收藏 评论0 发布时间:2021-11-8 01:02

举报

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