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

工程师笔记|带有空片检测功能的STM32需注意的GPIO设计

[复制链接]
STMCU-管管 发布时间:2021-12-29 13:39
引言
———
从STM32F0部分型号开始,比如STM32F04x和STM32F09x,STM32越来越多的型号具有了空片检测(Empty Check)功能。以前,STM32的启动由BOOT0和BOOT1来决定,在引入了空片检测功能之后,则在BOOT0=0的情况下,还需要分两种情况:
0 i/ Z0 A7 k% b! O' U. J6 ?8 e3 i  m' W8 P/ q, |
$ I/ n3 m7 }  F- N6 K
一是内部已经存在代码,则从用户存储区启动;
# V" I, m3 U5 p& C  m# Y+ ?8 f二是如果是空片,则从系统存储区启动,执行内部Bootloader。( b# g% Z. S' _( y6 g

( ?. C: m) Q" w+ I

7 F" }0 Z' K- z, M, B它带来什么好处呢?客户如果是空片上板,无需对BOOT0引脚进行跳线,就可以直接使用内部Bootloader进行串口或其他通讯口进行代码烧录了,可以说非常地方便。但是,这同时为GPIO的设计带来一个非常大的风险,在电路设计时需要引起注意,做好相应的措施。
' ~) C" M: h4 A- q; B, }
问题起源
——————
某客户在其产品的设计中,使用STM32G0B1RET6。有一天,客户工程师在测试电流的时候,无意间发现一个情况,说“有个比较奇怪的情况,STM32G0B1没有烧录代码的情况下,会比有烧录代码的情况下电流多了几十毫安。”按我们以往的认知,在没有烧录代码的情况下,没有任何操作,不该会出现这种情况啊。那么这是什么情况呢?3 q! {; G0 p) D1 s" V0 S6 r
问题分析
——————
测量STM32G0B1在没有烧录代码下的GPIO在悬空下的电平,可以发现有部分GPIO呈现为高电平,比如PA2/PA3和PA9/PA10。而客户在PA9上接了一个外部驱动电路,由高电平驱动,所以PA9的高电平,带动了该部分电路的工作,导致了电流的增加。
* |5 s, F- O* n1 _- r
; O5 W. Q; u7 E6 F  b$ K

) Q4 e- [0 [* G: V" m从参考手册RM0444的GPIO一章,我们知道STM32G0的GPIO在上电后应该为模拟状态,所以这些呈现高电平的GPIO显得有点奇怪。, k4 e+ L0 r  [- |6 b) ~8 @
: K0 {6 c7 \- E$ j& ]* F3 U7 s8 I8 u, l
; G1 |  C: w/ C$ s
突然想起STM32F091等型号早就已经有的空片检测功能,就继续查看STM32G0的参考手册RM0444的 “Memory and bus architecture”一章,果然,发现STM32G0系列同样拥有空片检测功能。也就是说,STM32G0B1在没有烧录代码的情况下,它是要到系统存储区去执行内部Bootloader的。7 o# \: x5 H" G

. f$ F6 y; g! S# l2 I+ z( y. c1 y

- [+ H3 l- ^! S- H; ]7 t此时,需要打开应用笔记AN2606《STM32微控制器系统存储器自举模式》了解一下STM32G0B1在系统Bootloader下GPIO的状态。& I5 g( m9 z) Z" B' b
3 ]6 p* e$ E' q6 f/ q; d
; c4 \$ S- p& l9 u) G1 x- ~
由于之前已经检测到PA2/PA3和PA9/PA10为高电平,而这两个引脚对刚好是Bootloader中所用到USART1和USART2对应的GPIO引脚。于是,检查其在Bootloader中的配置状态,请参考图1。
0 S! J3 ]+ W( n, f  S+ L, s5 i
13.png
Figure 1 系统Bootloader下USART1/2的端口状态
4 R7 I, ~: U8 ?% e6 H1 F3 p

6 {6 D9 j1 F2 O) r, ?' E' N从图1中可以了解到PA2/PA3/PA9/PA10均配置为复用推挽结构,带上拉电阻。其中PA10/PA3为输入口,PA2/PA9为输出口。
$ q6 ]. [+ ~. m! z7 h! l& N( X
/ H% M  Q- b9 S# K+ S* a, q

7 ?( T- c. `3 k  }( ]0 B/ X1 j6 Q使用一个1kΩ的电阻来测量PA9/PA10的端口状态,来确定其高电平的来源。系统VDD的电压为3.22V。) l  d3 O. Z3 {* S% w
+ n, A- G' h& t/ }& _

, [* B' I: S) B2 l0 D测量之前,需要了解一下GPIO的结构,如图2。
. g0 f0 {- T2 t: [5 p5 f
14.png
Figure 2 复用功能配置下的I/O的结构

$ u0 @! _, H2 x, U) A& A

+ X, O6 ?9 K3 y8 G: ?8 l+ b从图2中可以得知,当作为输出时,端口上呈现的高电平来自P-MOS上的VDDIOX;当作为输入时,端口上呈现的高电平来自上拉电阻上的VDDIOX。下面来验证测试一下。
( }7 h. T/ g3 `& Y8 G
6 J9 F& I8 @: V0 b
% ~: r! B9 ~9 k" |; z- s) `! G0 F
先对输出口PA9进行测量,使用1kΩ电阻串入PA9与VSS之间,并串上电流表,测得电流为3.22mA。由U=I·R公式,刚刚好,总电阻R = U / I = 3.22V ÷ 3.22mA = 1kΩ。也就是说,PA9的高电平由推挽结构中的P-MOS连接的VDDIOX提供,内部没有电阻。5 C4 v) h/ n, F$ z9 f& c4 r
2 G  n! V# N7 F6 L9 N

, x8 d0 A% ^, I) w0 X4 F' Y' p再来对输入口PA10进行测量,使用1kΩ电阻串入PA10与VSS之间,并串上电流表,测得电流为85.4uA。总电阻R = U / I = 3.22V ÷ 85.4uA = 37.7kΩ,大于在外部串接的1kΩ电阻。也就是说,PA10的高电平来自上拉电阻所连接的VDDIOX,而且内部上拉电阻RPU = 37.7kΩ - 1kΩ = 36.7kΩ。
. C/ K2 _: s, @4 T- F2 m4 \6 ^7 @  ]
* R: i; W$ R) H3 W; p0 C
多加一步再次确认输入口PA10的情况,这次不使用1kΩ电阻,而是直接将PA10串上电流表连接到VSS,得到电流值为87.7uA。内部上拉电阻RPU = U / I = 3.22V ÷ 87.7uA = 36.7kΩ,与上面的测试是相同的。也符合STM32G0B1数据手册中内部上拉电阻的范围,如图3。
- D8 I( H8 a7 d+ f3 H
15.png
Figure 3 I/O的上下拉电阻参数
存在的风险
——————
到此,已经清楚用户存储区没有烧录代码的时候,STM32启动将进入系统 Bootloader,PA9被设置为复用输出并输出高电平,从而推动外部电路产生的电流增加。但是我们应该更加深入地研究这个问题。客户的情况还算是比较好的,接的是一个驱动电路,并不会带来损坏。7 r$ p8 q- d7 P5 Q( F

$ r$ M8 a: C$ q7 w

; D2 R, `' k7 _4 l想象一下,如果在客户的应用中,PA9是用作输入口,用来连接一个传感器的中断输出,比如连接3轴MEMS加速度计LIS2DH12的INT1/2引脚。查看LIS2DH12的数据手册,可以得知INT1和IN2引脚的初始状态是输出低电平的,如图4。3 O( h$ F0 ]( q( c* p- Z* {
16.png
Figure 4   LIS2DH的INT1/INT2引脚初始状态
, N7 Q: e. a- B# X- v3 C
& F2 n+ _9 M" ^8 A, L8 s* A
由于LIS2DH12的INT引脚初始状态是推挽输出且输出低电平,如果直接连接到PA9,而用户打算将空片先焊接于用户板,再进行代码烧录的话,那么,当上电的时候,LIS2DH12的INT引脚输出低电平,而STM32G0B1进入内部Bootloader后PA9输出高电平,直连将导致短路,电流从STM32G0B1的PA9内部的VDDIOX经过P-MOS,从PA9引脚出来,经过连接线,到达LIS2DH12的INT引脚,从内部的M-MOS流到VSS,中间因为没有电阻而造成短路,很可能会对芯片产生损坏。所以必须加以注意!7 u$ N$ g, J, H

2 _, R6 ]% `1 e* K; N7 Y

  H/ L5 |4 }- ?4 X8 J1 G% Q# gPA10作为复用输入功能,倒是没有这个风险。7 b# t+ C  a2 b4 K3 S0 Q
3 f! U6 g3 B; F9 W0 Y3 \# Y

/ A# ]  U$ g5 A: C# r4 G
结论
————
由于空片检测功能的存在,带有此功能的STM32型号在空片的情况下启动,将会进入系统存储区,执行内部Bootloader。内部Bootloader会将部分GPIO设置为复用功能输出引脚并输出高电平或低电平,如果此引脚在用户应用中作为输入引脚连接到外部芯片的输出引脚,那么STM32空片事先焊接于用户板时,上电将可能带来极大的风险。在GPIO设计中如遇到有空片检测功能的STM32必须对此加以注意。
$ J5 J5 h. ]7 W7 a4 c% z1 G+ C
解决办法
——————
两种解决办法供用户选择。/ U* P$ g8 q* k7 c/ D& L; [0 W
1)    在两个芯片的连接中串入电阻进行保护,流经此电阻的电流必须要低于GPIO的注入电流,而且还必须保证不影响双边的高低电平识别。3 D; v5 x8 [& Z6 s# p
2)    在使用带有空片检测功能的STM32型号中,在硬件设计上要预先检查AN2606中所描述的Bootloader使用并配置的复用功能输出引脚,在GPIO设计时避免在用户应用中将其作为输入引脚。/ U# z" d6 p2 T0 u

) C6 D5 m- n$ k- H% z
2 {  X5 V0 \# n3 F7 q
以上两种方法,推荐使用第二种方法,更简单、更稳妥。9 l- J8 _+ S3 x; C& ~% y3 K
; ~3 n: h* [2 ]$ ]/ s; C6 ~
收藏 2 评论0 发布时间:2021-12-29 13:39

举报

0个回答

所属标签

相似分享

官网相关资源

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