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

【经验分享】STM32L011&STM32F091 空片检测进行System Bootloader 编程注意事项

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:44
前言, F# P. U$ V& z( ?; g- {
部分 STM32 是具有空片检测功能的,以便直接进入 System Memory 中执行 Bootloader,方便通过某些个外设来直接进行编程。比如 STM32L011xx、STM32L021xx、STM32F04x 和 STM32F09x。有看过《STM32F091 空片使用 System Bootloader下载代码》和《STM32L011x 和 STM32L021x 启动模式注意事项》的都知道这个功能。/ h' C( w  n, c$ E1 Q9 o; Z

7 \9 C- j: X4 r/ j2 _2 V问题7 q7 w$ w8 U# j8 f. I9 ^
某客户在其产品的设计中,使用了 STM32L011D4P6。客户工程师反映 STM32L011 为空片的时候,空片检测功能不存在,无法使用串口升级程序进行升级。3 p# H1 _) T( D8 |) @8 p  d+ C
! k# K! ^' D1 v6 d3 A, q

, [! z' o5 U" M4 ^" `调研
5 \6 V) W* L: }  h1.了解问题
  J0 f/ `" L  K4 D6 I" y" n9 g拿到客户的用户板,使用串口工具连接 STM32L011D4P6 的 USART2(PA9 和 PA10),使用 Flash Loader Demonstrator对 STM32L011D4P6 进行连接。界面如下:
# k. F; A9 S/ p+ d& w* U
3 v/ J5 G' F2 i& ~5 c# U4 d  f ' v: e- o+ A# D
6 R% F8 V# B( {3 U/ n8 ]& L8 Z& |
当点击按钮“Next”进行连接的时候,此时弹出对话框:
( W" `5 U3 W7 H4 k: o5 j
5 W; b7 L% H. q" G7 F) L _{D)~D3$RDKJ2~2RSIJD@(5.png
4 z* S, e% v  y& e, |/ D/ k: ]$ {' l2 E, f7 R. y* {5 u
无法连接。* i0 r: z8 @; Y: j$ F0 |1 k

; w" v9 E* p' o6 X  y$ J使用 STM32 ST-LINK Utility 对芯片进行连接,并点击菜单“Target → Blank Check”进行空片测试,确认芯片是擦除过的。
) \! _& a$ b( @$ a; a0 g/ ~4 v' N) q7 [1 g8 A; }) z+ N& p
FCU64QF2@_[EVGRWUCAB~N1.png
$ y6 v8 g* R0 ?* @% _! g2 o7 K9 E& C
客户认为,空片情况下应该可以进入 System Memory 而使用 Bootloader 进行串口烧写的,为什么就连接不上呢?& E% g, r; A  i: p% Q! _5 @

  s- q3 N+ ^* O, K/ |
0 H1 B" h/ \  G  M0 v. @; |2.问题分析, R$ c# ^% |% U
仔细查看客户的板子,发现客户的 BOOT0 脚是拉到低电平的,看起来应该是不会有问题啊。于是,继续在 STM32 ST-LINK Utility 中点击菜单“Target → Option Bytes…”来查看一下 STM32L011D4P6 的选项字节,得到如下结果:- Y6 A' p/ J5 k0 B2 Y

1 A! y8 s& F9 d YF6)Y[%(T)$]Q_V3ZZVYARM.png ! Z. C1 M$ Z0 Y& m

" q: h4 i" W  B" ?8 ~可以看到,客户在选项字节中配置:nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1,来达到使用选项字节而不使用 BOOT0脚来达到从 Flash program memory 启动的。也就是说,BOOT0 脚是没有被使用的。客户认为这个选项字节配置和使用BOOT0 脚拉低电平来从 Flash program memory 启动是一样的。% U$ J3 {; ~$ [: b( z7 |1 P

! r' C' i5 i3 }. [6 l7 q6 ]此时,再来看一下参考手册 RM0037 是如何描述空检测的:' k: o4 A8 z5 T6 y' l" F4 q

+ r2 @* E& U- x4 ~/ u! s )%HDYD9X@SL]012RU]G33HF.png ! h9 Q6 B( F( C2 g  J

  P9 n8 L  S5 v; m& i" T) L  T从这段话中,我们知道“Empty Check”是内部有一个查空标志,可用于使用 Bootloader 对未编程过的芯片进行简单编程。当这个标志位被置“1”的时候,此芯片被认为是空的,系统将从 System memory 中启动 Bootloader,以允许用户进行代码下载,而不是从 Flash program memory 启动。此标志位只在载入 Option bytes 时更新:当地址 0x8000 0000 读出的内容为0x0000 0000 时,此标志位置“1”,否则为“0”。这意味着当烧写完一个空片后需要在系统复位后执行代码的话,是必须要重新上电或者在 FLASH_CR 寄存器中置位 OBL_LAUNCH。6 f9 ~, N, `; D# n! c
5 E( V& U: i+ ?5 h* r
此处,我们需要注意到这一句话:“This flag is used when BOOT0 pin is configured to select Flash program memory as target boot area.”注意了,这里写的是 BOOT0 脚!不是选项字节中的 nBOOT0。所以,在选项字节配置为 nBOOT_SEL =1, nBOOT0 = 1,nBOOT1 = 1 的情况下,虽然也是空片,却是不能进入 System memory 中的 Bootloader 的,也就导致无法在这个情况下使用 Bootloader 进行下载代码!3 D" c. ~! V8 \( P; U6 ^# N( p. q
! w7 a/ G& E# \0 `" o0 }! \& U' H
来看一下 STM32F091 的,参考手册 RM0091 的“Empty Check”也有这么一句话:“This flag is used when BOOT0 pin isdefining Main Flash memory as target boot space.”这里说的也是 BOOT0 脚!对 STM32F091 进行测试,也是一样的情况。
+ M  V, t; B$ A- c4 H7 @
2 k- S# r0 m2 |  H! B( c3.问题解决

; [$ z0 s' P& c2 ]( ]% H使用 STM32 ST-LINK Utility 将 STM32L011D4P6 选项字节中的 nBOOT_SEL 位清掉,更新成功后复位,再使用 Flash Loader Demonstrator 进行连接,证实已经可以正常连接,虽然此时的 BOOT0 脚拉的是低电平。
3 R* D* P/ W) J+ L6 Q- u; w
0 {7 \% b3 U# f8 i0 g5 y* _结论% \. J% W" u4 W7 F: q3 u
在使用空片检测进入 System Memory 中使用 Bootloader 进行代码下载的时候,条件是启动配置使用的是 BOOT0 脚为低电平选择从 Flash program memory 启动的情况下,而不是使用选项字节“nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1”选择从 Flash program memory 启动的情况下。3 X4 I1 n$ D. }2 ]  P% A8 D$ J

# ~4 \8 G# `. N9 `9 m; {9 `处理

- [1 x! ^/ s2 G1 o在使用空片检测进入 System Memory 中使用 Bootloader 进行代码下载的时候,应该避免此选项字节情况的发生。特别是不使用 JTAG/SWD 接口的情况下,更要小心。( Y, o3 z( {, T; \" E: q0 Y* N$ Z$ ^
2 B* k! g& O. o: }/ Z& {

4 n0 E5 V/ |* l; {/ G
赞 收藏 评论0 发布时间:2022-2-20 14:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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