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

【经验分享】STM32L011 对空片进行代码烧录后程序运行问题

[复制链接]
STMCU小助手 发布时间:2022-2-28 20:18
前言1 G# u- c- A  c. J" {4 R! C
客户发现使用 ST Link Utility 对已檫除的 STM32L011 烧录程序后,用户的应用程序 UART 功能运行不正确,下面就对此问题展开分析。6 e; y4 Z) F6 u7 X. Y$ h: Z8 _
. F  }3 w  [" P5 U  x( b  e* v
一、问题的复现
5 d: S! U! [  E测试环境搭建:
" i4 t5 W# D& o  l* T
PC 端软件: STM32 ST_LINK Utility8 \6 N* u2 i, U
下载工具: ST-Link) e6 ]3 z+ ?9 v4 \, j
软件代码: STM32Cube_FW_L0_V1.9.0\Projects\STM32L073RZnucleo\Examples_LL\USART\USART_Communication_Rx_IT
9 j" J/ l. o' n* J) q5 \* Z3 n# y5 z/ ~* s$ e( J
问题复现步骤:
4 b1 U( @; L* OStep1 获得空片:先对 flash 进行整体檫除 – >掉电操作 -> 等待 10~20ms -> 上电
% w+ Y& \. [& T" O: C1 OStep2 配置 ST-Link Utility 并进行烧录: 使用 STM32 ST_LINK Utility PC 端软件下载 L011 的代码(bin/hex), 具体代码可以使用” STM32Cube_FW_L0_V1.9.0\Projects\STM32L073RZ-Nucleo\Examples_LL\USART\USART_Communication_Rx_IT”$ t6 l! o  ^4 i0 W4 F
STM32 ST_LINK Utility 具体配置如下:
% y; }) I8 g% O. M' Z$ {. d& G& K6 K/ Q9 ?* ^0 i5 G& M. F
K2RT$_F}4TC}TLBLZR(DXVT.png - v) p: ?  K9 R

0 l8 @4 D  b5 T. g; M+ C  t _`]MWVL(JB52
5PEIDAZA.png : M5 L' U! Z$ E8 @" ?

; V+ _- H/ l* J; d6 ] [5)GYNVAGC3KVNMGO8Y7M(W.png 7 y. a9 @7 K# l3 N& E' b/ p! {$ _' B

7 {8 c9 m7 {, ]/ c LB)]KR$NE}KNB@9FXQ_2E.png 7 G  a& O7 n2 O; n! p- J4 p$ L
& y- E# N( I- o- u8 z
Step3 运行代码并复现问题: 下载完成后不要断电或是执行硬件复位操作,然后观察 UART 代码的执行,发现运行不正常。
' e) k+ o% N+ _: \4 {5 GStep4 对 STM32F011 进行重新上电过程: 断电 -> 上电 -> 程序运行后 UART 功能正常。' s0 b" O% K4 u( W
Step5:然后在 Step4 程序运行正常的情况下执行 Step2 的烧录代码动作,再到 step3 (不断电或是执行硬件复位操作)下UART 代码执行正常。
+ O1 d/ w0 A- T4 Z2 U& {$ E( N0 M! J: [% Z  @
然后我们又进行了如下测试:# }7 e( M- |9 ~1 @" f: c# H# s- p
在 STM32L051C8Tx / STM32L071C8Tx 上执行 step1 到 step3 的动作:8 S" n; I* s/ W: ?
1. ST-Link + ST-LINK Utility + ST LL code+ L011 --- UART 存在问题0 i( p( I; N9 u4 Q% R( E7 F
2. ST-Link + Keil + ST LL code + L011 --- UART 存在问题
! p' ~: \4 O1 d$ x9 @3. ST-Link + ST-LINK Utility + ST LL code +L051 --- UART 没问题
- n, V, @+ ?. }; w! s5 ]4. ST-Link + keil + ST LL code + L051 --- UART 没问题
, [7 N9 O  `/ I: s/ U4 C) [5. ST-Link + ST-LINK Utility + ST LL code + L071 --- UART 没问题
5 j* \3 V3 S; z4 L8 [6. ST-Link + keil + ST LL code + L071 --- UART 没问题
' U0 H& T. k% b. y3 {
; U- p- ~% ~: i5 v  z9 D2 G   二、原因分析3 `' Y4 G* f, U1 u/ G, X9 V) ^) J
   以上问题产生的原因是由于 STM32L011 (L0 家族)的 "Empty check" 机制引起的,在对空片编程时,empty check 标志位会被置位,程序会从 bootloader 代码开始执行。这个在 STM32L011 参考手册中有提及 RM0377 (page 55):
: G9 B0 X& s* ^$ w" K7 b
1 b9 W: ]1 i; I---
2 `9 c) F! f7 Q$ w; z1 \% e4 ~& N
/ D! W0 Y, H) Q4 _- fEmpty check (category 1 devices only)
) s, d. s. L7 a; L) ROn category 1 devices, an internal empty check flag is implemented to allow easy
) v' W0 {/ ]' W# ?+ b! }3 Jprogramming of virgin devices by the bootloader. This flag is used when BOOT0 pin is/ P! i9 l- t% \" r0 P! {
configured to select Flash program memory as target boot area. When this flag is set, the
% N7 ~7 f/ h9 p2 ~device is considered as unprogrammed and the system memory (bootloader) is selected as* u- Q: t8 }) g& @
boot area instead of the Flash program memory to allow the application to program the
8 a# n$ x3 b/ r" _5 \Flash memory.+ b- X. F) A2 }! T
The empty check flag is updated only when the option bytes are loaded: it is set when the
7 x7 k! U6 {# {. B& t! a: ~content of address 0x8000 0000 is read as 0x0000 0000 and cleared otherwise. As a result,
4 r+ e# D$ O( p0 [5 ~( t! nonly a power-on reset or setting OBL_LAUNCH bit in FLASH_CR register can clear this flag
7 _' ?5 j5 E8 d# `9 z7 Kafter programming a virgin device to execute user code after system reset.
% ~. \7 v' p/ A--------------------------------------------------------------------------3 V( S1 f& y$ u6 y' O" @& s3 ?

3 |5 h2 K8 i( ~; q: q当 MCU flash 被檫除,之后又执行了断电上电过程,“empty check”标志会被置位(IC 为空),这种情况下内部 bootloader 代码将被执行。“empty check”标志是在装载 option bytes 时置位的,option bytes 在 power-on 和 OBL_LAUNCH 复位时会进行装载。在客户的应用中 ST-Link Utility 对 IC 进行编程结束时复位了 IC,但“empty check”标志仍然是置位的。因此在“emptycheck”置位的情况下即使客户应用代码存在,但仍会运行 bootloader 代码。如果要刷新“empty check”标志只能通过断电上电过程或是执行 OBL_LAUNCH 复位命令。ST-Link Utility 在编程后没有执行 OBL_LAUNCH 复位命令,因此客户的应用程序不会被执行。2 q! f4 E8 u9 S  s9 l& }; B
  _+ W0 Q7 \6 j5 |( e' Z9 g
解决的办法是:
$ N! u$ V6 `0 C6 V, F' D可以使用 PC debug 工具 IAR 或是 Kei 进行代码的下载,这些工具通常会对 IC 的 flash 进行编程后执行 OBL_LAUNCH 复位命令。
" v9 _/ r3 w( _/ g可以使用"STM32CubeProgrammer"进行代码的下载,此工具也会对 MCU 的 flash 进行编程后会执行 OBL_LAUNCH 复位命令。, _. |0 t# f% P; `% w3 G

" E& u- w$ K( n" ]0 h! L7 y) m4 q& z9 p: d# f" ], F
三、结论
+ a$ X& {2 r- D- ~$ Q& k在产品的量产烧录过程中,在对烧录工具不了解的情况下最好增加产品的断电环节。; g3 e: C1 E2 I& J0 |

* d: @4 {+ R% w7 d
5 a; K3 ]2 Q5 U' l
4 Q, T# S9 O( r. z' }* f' P6 @% _
收藏 评论0 发布时间:2022-2-28 20:18

举报

0个回答

所属标签

相似分享

官网相关资源

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