一、问题描述
简单描述:
最近做的一个项目中,PB3端口配置为输入,不管外部输入是高电平还是低电平,一直读取到的是低电平。
调试过程:在撰写代码过程中,又发现新的问题,Enter按键无法控制屏幕数值,反复检查了原理图,以及引脚配置均没有问题,通过万用表也检查了引脚的电压,引脚的电压与理论值3V基本一致。PB3已经拉高了,但是读取的仍为低电平。
二、解决办法
2.1以前的解决方法
记得以前做过的ECU项目中,有几个GPIO由于是JTAG的调试引脚,输出总是没信号,调试了两天才搞定,当时是配置的时候要打开复用时钟,关闭JTAG功能,然后输出就正常了,截取配置的代码如下:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能,把PB3,PB4作为普通IO口使用
2.2根据网上资料总结的解决办法:
PB3作为JDO,被JTAG占用。 一般都只禁用JTAG了,但是在 Asynchronous trace mode(异步跟踪调试模式),PB3还是TRACESWO,TRACESWO if async trace is enabled PB3,所以,作为输入还需要禁用async trace,寄存器版的那两句话就是禁用async trace的之后,输入就没问题了。
在HAL库的__HAL_AFIO_REMAP_SWJ_NOJTAG()之后,增加下面的关闭异步跟踪调试代码:
DBGMCU->CR &= ~((uint32_t)1<<5);
这样,void HAL_MspInit(void)完整代码如下:
void HAL_MspInit(void)
{
/* USER CODE BEGIN MspInit 0 */
/* USER CODE END MspInit 0 */
__HAL_RCC_AFIO_CLK_ENABLE();
__HAL_RCC_PWR_CLK_ENABLE();
/* System interrupt init*/
/** NOJTAG: JTAG-DP Disabled and SW-DP Enabled
*/
__HAL_AFIO_REMAP_SWJ_NOJTAG();
/* USER CODE BEGIN MspInit 1 */
DBGMCU->CR &= ~((uint32_t)1<<5); // close asynchronous trace mode
// AFIO->MAPR = (AFIO->MAPR & ~((uint32_t)0x7 << 24)) | (2 << 24); // set PA15、PB3、PB4 as normal GPIO, input and output
/* USER CODE END MspInit 1 */
}
再进行仿真,可以正确的读取到PB3的高低电平了,问题得到了解决,感谢众网友。
使用标准库的话,代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
DBGMCU->CR &= ~((uint32_t)1<<5);
AFIO->MAPR = (AFIO->MAPR & ~((uint32_t)0x7 << 24)) | (2 << 24); /* PA15 PB3 PB4 */