STM32L011&STM32F091 空片检测进行 System Bootloader 编程注意事项 + [& h/ }4 m0 t& D/ g* H3 D 前言 部分STM32 是具有空片检测功能的,以便直接进入System Memory 中执行Bootloader,方便通过某些个外设来直接进行编1 c- e, ]* T+ I/ }0 v6 i. B 程。比如STM32L011xx、STM32L021xx、STM32F04x 和STM32F09x。有看过《STM32F091 空片使用System Bootloader 下载代码》和《STM32L011x 和STM32L021x 启动模式注意事项》的都知道这个功能。 % {4 I8 U* w/ {, i3 L+ d 问题/ j8 n8 S! ?/ f5 C. S 某客户在其产品的设计中,使用了STM32L011D4P6。客户工程师反映STM32L011 为空片的时候,空片检测功能不存在, 无法使用串口升级程序进行升级。8 L0 V0 X8 V7 o3 L1 ^ 调研 1.了解问题 拿到客户的用户板,使用串口工具连接STM32L011D4P6 的USART2(PA9 和PA10),使用Flash Loader Demonstrator" ] {9 \! ?, g8 I r* ` 对STM32L011D4P6 进行连接。界面如下: 当点击按钮“Next”进行连接的时候,此时弹出对话框: 无法连接。. _- l( g a+ k! F- E; k 1 d6 g2 [7 V6 v s$ x 使用STM32 ST-LINK Utility 对芯片进行连接,并点击菜单“Target → Blank Check”进行空片测试,确认芯片是擦除过的。! C" m$ `' d; B- \! t- g, H, o 客户认为,空片情况下应该可以进入System Memory 而使用Bootloader 进行串口烧写的,为什么就连接不上呢? 5 w+ t8 [& s! A2 {: o! n* h* ^7 | 2.问题分析 仔细查看客户的板子,发现客户的BOOT0 脚是拉到低电平的,看起来应该是不会有问题啊。于是,继续在STM32 ST-LINK Utility 中点击菜单“Target → Option Bytes…”来查看一下STM32L011D4P6 的选项字节,得到如下结果:! w* Z9 O1 n' M$ k 可以看到,客户在选项字节中配置:nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1,来达到使用选项字节而不使用BOOT0" e I% R# [4 |: v: t% ` 脚来达到从Flash program memory 启动的。也就是说,BOOT0 脚是没有被使用的。客户认为这个选项字节配置和使用 BOOT0 脚拉低电平来从Flash program memory 启动是一样的。% |5 i3 E( T9 ]* N0 a 2 `% k! G. b+ D) m 此时,再来看一下参考手册RM0037 是如何描述空检测的: 从这段话中,我们知道“Empty Check”是内部有一个查空标志,可用于使用Bootloader 对未编程过的芯片进行简单编程。& X* A9 ^ I% N$ a 当这个标志位被置“1”的时候,此芯片被认为是空的,系统将从System memory 中启动Bootloader,以允许用户进行代码( N7 X" N! l& x3 s5 [4 K9 R 下载,而不是从Flash program memory 启动。此标志位只在载入Option bytes 时更新:当地址0x8000 0000 读出的内容为 0x0000 0000 时,此标志位置“1”,否则为“0”。这意味着当烧写完一个空片后需要在系统复位后执行代码的话,是必须4 U! ]" `7 I* W" f' Y7 Y1 l 要重新上电或者在FLASH_CR 寄存器中置位OBL_LAUNCH。' h, y/ a. d; v( ] 此处,我们需要注意到这一句话:“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 进行下载代码!" N5 W ~3 a) K8 g& o; O/ ~ 0 r' X+ t7 K* m4 n4 T& k 来看一下STM32F091 的,参考手册RM0091 的“Empty Check”也有这么一句话:“This flag is used when BOOT0 pin is g! B v& G) A defining Main Flash memory as target boot space.”这里说的也是BOOT0 脚!对STM32F091 进行测试,也是一样的情况。 3.问题解决 使用STM32 ST-LINK Utility 将STM32L011D4P6 选项字节中的nBOOT_SEL 位清掉,更新成功后复位,再使用Flash5 P+ `6 d) `5 a6 ^ Loader Demonstrator 进行连接,证实已经可以正常连接,虽然此时的BOOT0 脚拉的是低电平。 ( _ \2 t7 V- R3 k. r 结论 在使用空片检测进入System Memory 中使用Bootloader 进行代码下载的时候,条件是启动配置使用的是BOOT0 脚为低电平: B7 T7 X3 q& e1 }, \7 ] 选择从Flash program memory 启动的情况下,而不是使用选项字节“nBOOT_SEL = 1, nBOOT0 = 1,nBOOT1 = 1”选择 从Flash program memory 启动的情况下。 / m6 M7 ^/ k* \7 ]1 w0 o 处理9 v# u' @4 ?; E: o+ L" i/ k 在使用空片检测进入System Memory 中使用Bootloader 进行代码下载的时候,应该避免此选项字节情况的发生。特别是不 使用JTAG/SWD 接口的情况下,更要小心。; t! [ r0 n. e* q $ ?+ g6 i$ I' [# L 1 V- p: g8 I! {) c4 W! A% B* F 点击下载文档 查看更多实战经验( G. F% h! b7 T* P" H |
讲解的很详细 |
STM32固件库分享,超全系列整理
三创电子(Tcreate)-STM32F030核心板代码
STM32F0 ADC(DMA中断)多通道,注释超详细
FreeRTOS在STM32F030上的移植
基于STM32移植而引发的疑问经验分享
分享STM32F051中文参考手册(重制书签版)
游名:STM32F0+Trinamic智能步进驱动芯片TMC5160(最高20A)参考原...
基于STM32L051使用CubeMX生成工程文件ST系列芯片通用经验分享
基于STM32L051开始添加需要的代码经验分享
STM32L051测试I2C协议设备的添加经验分享