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

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

[复制链接]
STMCU小助手 发布时间:2022-2-20 14:44
前言
% W! E* y+ L% l4 c* e5 k部分 STM32 是具有空片检测功能的,以便直接进入 System Memory 中执行 Bootloader,方便通过某些个外设来直接进行编程。比如 STM32L011xx、STM32L021xx、STM32F04x 和 STM32F09x。有看过《STM32F091 空片使用 System Bootloader下载代码》和《STM32L011x 和 STM32L021x 启动模式注意事项》的都知道这个功能。  ?# m4 J# a0 f& P- k' N3 i8 q/ ]+ T9 d

4 {" K; v. }7 X" M; U- W问题; T! T& I; d( R/ k" h4 I
某客户在其产品的设计中,使用了 STM32L011D4P6。客户工程师反映 STM32L011 为空片的时候,空片检测功能不存在,无法使用串口升级程序进行升级。
+ g, Q& T( v2 I) K( B4 N0 t( P* I# x  r6 f5 T9 m" d# e
1 W2 f$ z. h7 P, u
调研
: T  A' I. f* a4 A6 G! t1.了解问题
- @/ u2 [& W$ I9 _拿到客户的用户板,使用串口工具连接 STM32L011D4P6 的 USART2(PA9 和 PA10),使用 Flash Loader Demonstrator对 STM32L011D4P6 进行连接。界面如下:
4 @3 {. F8 z$ ^5 O  H: D, \7 C; m7 E1 I3 {, P
0 t. d1 P9 B8 Q2 R2 z' x% ]
2 S& I$ G$ K" t9 ]3 r, |* Y
当点击按钮“Next”进行连接的时候,此时弹出对话框:
8 `8 A6 k# e7 ^, G) O# n/ v  }9 B) v0 z9 F8 D+ i
_{D)~D3$RDKJ2~2RSIJD@(5.png
% s- L- Z3 Z2 H' r
1 y' x' Z+ W; ~' J) M) {8 S, _" `  J无法连接。
8 H4 E1 F% d) H$ F' f, {
% J, j; i$ X0 ]& L; k使用 STM32 ST-LINK Utility 对芯片进行连接,并点击菜单“Target → Blank Check”进行空片测试,确认芯片是擦除过的。
! i& i. B7 @; ~7 u6 `; |3 X
0 J  I8 v4 n* Q1 z  X FCU64QF2@_[EVGRWUCAB~N1.png / ?. L/ b5 l+ Z/ Q4 i- L/ S1 e) J
. L# J6 o! ?( U: R
客户认为,空片情况下应该可以进入 System Memory 而使用 Bootloader 进行串口烧写的,为什么就连接不上呢?7 v6 L5 W4 I0 Q" L0 m. j: k
" D# ^! Q9 ^" ^& z4 X

/ s7 t) [% F2 ^1 G2.问题分析7 V% T7 @8 L1 n0 v: H
仔细查看客户的板子,发现客户的 BOOT0 脚是拉到低电平的,看起来应该是不会有问题啊。于是,继续在 STM32 ST-LINK Utility 中点击菜单“Target → Option Bytes…”来查看一下 STM32L011D4P6 的选项字节,得到如下结果:. d6 @' b8 E, ^" p7 `& J
6 S% V' Z3 [3 h+ u4 L1 d* y0 `
YF6)Y[%(T)$]Q_V3ZZVYARM.png
) P# X. ]' g: x: B4 f: N0 h/ ?3 C
可以看到,客户在选项字节中配置:nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1,来达到使用选项字节而不使用 BOOT0脚来达到从 Flash program memory 启动的。也就是说,BOOT0 脚是没有被使用的。客户认为这个选项字节配置和使用BOOT0 脚拉低电平来从 Flash program memory 启动是一样的。
7 |2 N! W% l* F6 _- c- M9 \3 i' q- z* ~* @: Z! I
此时,再来看一下参考手册 RM0037 是如何描述空检测的:' [9 T' v% t" V

- U4 T5 j/ J& J! v) ? )%HDYD9X@SL]012RU]G33HF.png
0 Z) R& y( |- D9 |
+ p- z8 X& L4 s# w3 }从这段话中,我们知道“Empty Check”是内部有一个查空标志,可用于使用 Bootloader 对未编程过的芯片进行简单编程。当这个标志位被置“1”的时候,此芯片被认为是空的,系统将从 System memory 中启动 Bootloader,以允许用户进行代码下载,而不是从 Flash program memory 启动。此标志位只在载入 Option bytes 时更新:当地址 0x8000 0000 读出的内容为0x0000 0000 时,此标志位置“1”,否则为“0”。这意味着当烧写完一个空片后需要在系统复位后执行代码的话,是必须要重新上电或者在 FLASH_CR 寄存器中置位 OBL_LAUNCH。9 I7 o+ L5 o9 E& w( B* e5 [

/ h+ m" |! l# f1 Q, p此处,我们需要注意到这一句话:“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 进行下载代码!
9 N- G0 H: r% Z& @5 l' U
3 v* T) d( `6 n来看一下 STM32F091 的,参考手册 RM0091 的“Empty Check”也有这么一句话:“This flag is used when BOOT0 pin isdefining Main Flash memory as target boot space.”这里说的也是 BOOT0 脚!对 STM32F091 进行测试,也是一样的情况。
8 R6 E2 G: U$ F' i" A
# k; Y  t& H, l8 S0 U# D) U3.问题解决

' p' g+ E4 Q4 z/ g, |1 z使用 STM32 ST-LINK Utility 将 STM32L011D4P6 选项字节中的 nBOOT_SEL 位清掉,更新成功后复位,再使用 Flash Loader Demonstrator 进行连接,证实已经可以正常连接,虽然此时的 BOOT0 脚拉的是低电平。
" T2 m) C) O% B) C1 d  [  M6 P8 t/ B0 x: R) ~
结论2 T6 `) H7 |+ h& ~8 D: l
在使用空片检测进入 System Memory 中使用 Bootloader 进行代码下载的时候,条件是启动配置使用的是 BOOT0 脚为低电平选择从 Flash program memory 启动的情况下,而不是使用选项字节“nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1”选择从 Flash program memory 启动的情况下。
* I" p9 c- U4 r3 x) S, z2 P; S/ B7 e, \1 a% D& S6 z8 L
处理

7 S. i' C# V+ W0 l+ x在使用空片检测进入 System Memory 中使用 Bootloader 进行代码下载的时候,应该避免此选项字节情况的发生。特别是不使用 JTAG/SWD 接口的情况下,更要小心。
# `! i. o7 |  [" S. L; D" F* q$ ~' b( |( O" z$ x7 @" q

, w5 l. t6 _, b" K3 H
收藏 评论0 发布时间:2022-2-20 14:44

举报

0个回答

所属标签

相似分享

官网相关资源

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