最近在用
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);
For PD0/PD2
SET_BIT(SYSCFG->CFGR1,SYSCFG_CFGR1_UCPD2_STROBE);
同时请确保GPIO内部均配置为上拉模式(如果配置为NOPULL,一般只能拉到2.8V左右,一般高电平检测阈值为0.7*VCC,若VCC为3.3V则至少要拉到2.3V以上,存在一定风险):
GPIO_InitStructure.Pull = GPIO_PULLUP;
总结下来,针对PA8/PB15/PD0/PD2 这4个管脚如果作为输入检测,要想可靠地检测到高电平,需要牢记如下2点:
1. 将UCPDx_STROBE置位,通过SET_BIT()函数
2. GPIO配置为内部上拉PULLUP
技术交流欢迎加
QQ 2235662010
。