
1. 引言 从 STM32F0 部分型号开始,比如 STM32F04x 和 STM32F09x,STM32 越来越多的型号具有了空片检测(Empty Check)功能。以前,STM32 的启动由 BOOT0 和 BOOT1来决定,在引入了空片检测功能之后,则在 BOOT0=0 的情况下,还需要分两种情况:一是内部已经存在代码,则从用户存储区启动;二是如果是空片,则从系统存储区启动,执行内部 Bootloader。它带来什么好处呢?客户如果是空片上板,无需对 BOOT0 引脚进行跳线,就可以直接使用内部 Bootloader 进行串口或其他通讯口进行代码烧录了,可以说非常地方便。但是,这同时为 GPIO 的设计带来一个非常大的风险,在电路设计时需要引起注意,做好相应的措施。 2. 问题 2.1. 问题起源 某客户在其产品的设计中,使用 STM32G0B1RET6。有一天,客户工程师在测试电流的时候,无意间发现一个情况,说“有个比较奇怪的情况,STM32G0B1 没有烧录代码的情况下,会比有烧录代码的情况下电流多了几十毫安。”按我们以往的认知,在没有烧录代码的情况下,没有任何操作,不该会出现这种情况啊。那么这是什么情况呢? 2.2. 问题分析 测量 STM32G0B1 在没有烧录代码下的 GPIO 在悬空下的电平,可以发现有部分GPIO 呈现为高电平,比如 PA2/PA3 和 PA9/PA10。而客户在 PA9 上接了一个外部驱动电路,由高电平驱动,所以 PA9 的高电平,带动了该部分电路的工作,导致了电流的增加。 从参考手册 RM0444 的 GPIO 一章,我们知道 STM32G0 的 GPIO 在上电后应该为模拟状态,所以这些呈现高电平的 GPIO 显得有点奇怪。 突然想起 STM32F091 等型号早就已经有的空片检测功能,就继续查看 STM32G0 的参考手册 RM0444 的 “Memory and bus architecture”一章,果然,发现 STM32G0 系列同样拥有空片检测功能。也就是说,STM32G0B1 在没有烧录代码的情况下,它是要到系统存储区去执行内部 Bootloader 的。 此时,需要打开应用笔记 AN2606《STM32 微控制器系统存储器自举模式》了解一下STM32G0B1 在系统 Bootloader 下 GPIO 的状态。 由于之前已经检测到 PA2/PA3 和 PA9/PA10 为高电平,而这两个引脚对刚好是Bootloader 中所用到 USART1 和 USART2 对应的 GPIO 引脚。于是,检查其在Bootloader 中的配置状态,请参考图 1。 ![]() 从图 1 中可以了解到 PA2/PA3/PA9/PA10 均配置为复用推挽结构,带上拉电阻。其中 PA10/PA3为输入口,PA2/PA9 为输出口。 使用一个 1kΩ 的电阻来测量 PA9/PA10 的端口状态,来确定其高电平的来源。系统 VDD 的电压为 3.22V。 测量之前,需要了解一下 GPIO 的结构,如图 2。 ![]() 从图 2 中可以得知,当作为输出时,端口上呈现的高电平来自 P-MOS 上的 VDDIOX;当作为输入时,端口上呈现的高电平来自上拉电阻上的 VDDIOX。下面来验证测试一下。 先对输出口 PA9 进行测量,使用 1kΩ 电阻串入 PA9 与 VSS 之间,并串上电流表,测得电流为 3.22mA。由 U=I·R 公式,刚刚好,总电阻 R = U / I = 3.22V ÷ 3.22mA = 1kΩ。也就是说,PA9 的高电平由推挽结构中的 P-MOS 连接的 VDDIOX提供,内部没有电阻。 再来对输入口 PA10 进行测量,使用 1kΩ 电阻串入 PA10 与 VSS 之间,并串上电流表,测得电流为 85.4uA。总电阻 R = U / I = 3.22V ÷ 85.4uA = 37.7kΩ,大于在外部串接的 1kΩ 电阻。也就是说,PA10 的高电平来自上拉电阻所连接的 VDDIOX,而且内部上拉电阻 RPU = 37.7kΩ - 1kΩ = 36.7kΩ。 多加一步再次确认输入口 PA10 的情况,这次不使用 1kΩ 电阻,而是直接将 PA10 串上电流表连接到 VSS,得到电流值为 87.7uA。内部上拉电阻 RPU = U / I = 3.22V ÷ 87.7uA = 36.7kΩ,与上面的测试是相同的。也符合 STM32G0B1 数据手册中内部上拉电阻的范围,如图3 ![]() 完整版请查看:附件 |
LAT1032_带有空片检测功能的STM32需要注意的GPIO设计_v1.0.pdf
下载404.3 KB, 下载次数: 0
STM32 GUI LTDC 最大像素时钟评估方法
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南