STM32H5 的 PB14 引脚被意外拉低的问题解析

1. 问题现象

客户反馈,使用 STM32H523RET6 应用中配置了两个 IO 口,PC9 为输出模式,内部下拉;

PB14 为输入模式,内部上拉。在程序中将 PC9 引脚输出高电平,结果观察到 PB14 的电平被拉低。

图 1 PC9 输出低时, PB14 为高

2. 问题重现

使用 NUCLEO-H533RE 板,新建一个 cubemx 工程(cubemx 版本 : v6.13.0),按客户问题所述配置 PC9 和 PB14, 然后在代码中驱动 PC9 输出高,结果很容易就重现了问题。

3. 问题分析

一般来说,在 ST 官方 DEMO 板上很容易重现,就意味着问题能很快解决或者很可能是芯片就是如此设计的。于是查找相关文档,注意到 PC9 可复用为 UCPD1_DBCC2 引脚,而 PB14则可复用为 UCPD1_CC2 引脚。

STM32H5 默认时 UCPD 外设的 DB(Dead Battery)功能是激活的,而这个 DB 特性刚好会影响正常的 GPIO 功能,这个在 AN2552 Rev7 文档中的第11.3.1 节有相关描述 :

在 DBCCx 引脚(PC9)上检测到电压超过 1V 时,则芯片内的 Rd 电阻激活,进而将 CCx 引脚(PB14)拉低。

也许有人会问,我啥也没做啊,我也没用到 UCPD 外设,我的电路图也根本不是图上这么设计的,芯片怎么会这样?

这就得回到 USB Type-C 接口的 PD 功能来说了。USB Type-C 口大体上来说数据可分为三个通路: USB3.x 数据通路,USB2.0 数据通路,以及走 CC 线的 PD 协议,当然还有 VBUS 上的电力供应。

CC 线上的 PD 协议正是用于 SOURCE 端和 SINK 端之间进行电力协商的,经典的应用场合就是 SOURCE 端比如手机充电适配器向带电池的 SINK 端(比如手机)充电,用多大功率,多少电压,最大电流多少,这个就得协商,协商的过程是通过 300K 的 CC 线来进行的。

图 3 USB Type-C 口的 CC 线连接

STM32H5 是带 UCPD 外设,全称 USB Type-C®/USB Power Delivery interface. 是专门用于 CC 线上的 PD 协议通信的外设。

如上图所示,SOURCE 端通过检测 SINK 端的 Rd 电阻来判断是否有 SINK 设备连接,只有检测到这个连接,在 USB Type-C 口上的 VBUS 才会供电过去,否则不会有电供应。这就涉及到一个问题,若 SINK 端是电池设备,且电池耗尽(Dead Battery)时,SOURCE 端还能正常供电吗?

这里存在一个关键逻辑点:当 SINK 端电池耗尽时,SOURCE 端是否仍能检测到 Rd 电阻?进一步说,假设 SINK 端的 PD 芯片为 STM32,在其未上电前,CC 引脚(PB14)必须对外呈现 Rd 下拉电阻特性------这是 UCPD 协议中 DB(Dead Battery)功能的核心要求。

若 CC 引脚未表现出 Rd 电阻,SOURCE 端会认为 SINK 端不具备受电条件,从而不会通过VBUS 供电。而没有 VBUS 供电,STM32 就无法上电运行,形成"无电-无法上电-无法反馈"的死循环。因此,STM32H5 芯片默认激活 DB 功能,正是为了确保在未上电状态下,CC 引脚通过内部下拉电阻满足 SOURCE 端的检测要求,从而触发 VBUS 供电流程。

知道了原因,那么解决方法就很简单,即在代码中将 DB 功能关闭,才能释放 DBCCx 引脚作为普通 GPIO 引脚的功能,如 :

复制代码
void HAL_MspInit(void)
{
 /* USER CODE BEGIN MspInit 0 */
 /* USER CODE END MspInit 0 */
 /* System interrupt init*/
 /* USER CODE BEGIN MspInit 1 */
 HAL_PWREx_DisableUCPDDeadBattery(); //Disable the DB feature of UCPD
 /* USER CODE END MspInit 1 */
}

同时,因为 UCPD_DBCCx 引脚(PC9)只要一检测电平>1V,则会将内置的 Rd 电阻激活。

如果 DBCC 引脚仅只用于 GPIO 功能,为了避免意外激活 Rd,建议在 DBCC 引脚外加上 100K的下拉电阻。

图 4 当 DBCC 引脚(PC9)用于 GPIO 功能时的建议电路

这就是整个解决方案了。

4. 后记

在 STM32G0 中,同样的问题,在 STM32CubeMx 中是可以配置是否在代码中关闭 DB 特性的。见下图示意:

Cubemx 中针对 H5 这一选项当前版本还未添加,后续版本应该会更新此功能。

参考文献


本文档参考ST官方的《LAT1542 STM32H5的PB14引脚被意外拉低的问题解析-v1.0》文档。

参考下载地址:https://download.csdn.net/download/u014319604/92182033

相关推荐
llilian_161 天前
总线授时卡 CPCI总线授时卡的工作原理及应用场景介绍 CPCI总线校时卡
运维·单片机·其他·自动化
禾仔仔1 天前
USB MSC从理论到实践(模拟U盘为例)——从零开始学习USB2.0协议(六)
嵌入式硬件·mcu·计算机外设
The Electronic Cat1 天前
树莓派使用串口启动死机
单片机·嵌入式硬件·树莓派
先知后行。1 天前
常见元器件
单片机·嵌入式硬件
恒锐丰小吕1 天前
屹晶微 EG2302 600V耐压、低压启动、带SD关断功能的高性价比半桥栅极驱动器技术解析
嵌入式硬件·硬件工程
Dillon Dong1 天前
按位或(|=)的核心魔力:用宏定义优雅管理嵌入式故障字
c语言·stm32
Free丶Chan1 天前
dsPIC系列-1:dsPIC33点灯 [I/O、RCC、定时器]
单片机·嵌入式硬件
v先v关v住v获v取1 天前
塔式立体车库5张cad+设计说明书+三维图
科技·单片机·51单片机
恒锐丰小吕1 天前
屹晶微 EG2106D 600V耐压、半桥MOS/IGBT驱动芯片技术解析
嵌入式硬件·硬件工程