今天看啥  ›  专栏  ›  ST意法半导体

STM32G07x FT_c管脚(PA8/PB15/PD0/PD2)输入高电平检测问题

ST意法半导体  · CSDN  ·  · 2019-12-29 12:17

最近在用 STM32G070RBT6 开发产品(Keil v5.23, STM32G0 SDK 1.3.0,VCC=3.3V),在 PA8和PB15 管脚设计按键输入的时候,总是出现检测异常,具体表现为 PA8/PB15 配置为PULLUP时上电后管脚只有1.8V,NOPULL时只有1.2V,无法满足高电平检测条件(一般至少0.7VCC即2.31V以上才能被识别为高电平)。验证了其他管脚,发现PD0和PD2也具有相同现象。
总结下来就是,同样的电路和配置,除去 PA8/PB15/PD0/PD2 ,其他GPIO在上电后都可以测得3.3V,只有这4个管脚异常,令人百思不得其解。
在这里插入图片描述
图1 按键输入电路(低电平有效)

经过仔细阅读STM32G07x 数据手册和参考手册,得知 PA8/PB15/PD0/PD2 这几个管脚是所谓的FT_c管脚,所谓FT_c就是可以最高输入5V。另外复用做UCPD接口的4个PIN,内部有个下拉电阻,由 SYSCFG_CFGR1 寄存器的Bit9 UCPD1_STROBE (PA8/PB15)和Bit10 UCPD2_STROBE (PD0/PD2)控制 ,具体控制逻辑如下:
在这里插入图片描述
图2 UCPDx_STROBE位配置逻辑(STM32G07参考手册215页)

由于SYSCFG_CFG1上电或复位后为0x0000 000X,因此UCPDx_STROBE默认DISABLE即无下拉(这个下拉和GPIO内部的下拉可能不一样),可能某种机制(有待研究)造成了即使GPIO外部上拉到VCC,上电或复位后该管脚电压仍然无法最终拉到3.3V,始终在2V以内,造成无法检测到高电平。

解决方法是将UCPDx_STROBE置位 ,在GPIO初始化的时候,添加如下代码:

For PA8/PB15

SET_BIT(SYSCFG->CFGR1,SYSCFG_CFGR1_UCPD1_STROBE);
  • 1

For PD0/PD2

SET_BIT(SYSCFG->CFGR1,SYSCFG_CFGR1_UCPD2_STROBE);
  • 1

同时请确保GPIO内部均配置为上拉模式(如果配置为NOPULL,一般只能拉到2.8V左右,一般高电平检测阈值为0.7*VCC,若VCC为3.3V则至少要拉到2.3V以上,存在一定风险):

GPIO_InitStructure.Pull = GPIO_PULLUP;
  • 1

总结下来,针对PA8/PB15/PD0/PD2 这4个管脚如果作为输入检测,要想可靠地检测到高电平,需要牢记如下2点:
1. 将UCPDx_STROBE置位,通过SET_BIT()函数
2. GPIO配置为内部上拉PULLUP


技术交流欢迎加 QQ 2235662010




原文地址:访问原文地址
快照地址: 访问文章快照