大家好,欢迎来到IT知识分享网。
目录
一、问题描述
简单描述:
最近做的一个项目中,PB3端口配置为输入,不管外部输入是高电平还是低电平,一直读取到的是低电平。
详细操作过程:
最近做的一个项目中,使用的主控MCU是STM32F103VET6,使用的开发环境是RTThread Studio,配置的PB3为浮空输入,连接风扇的故障输出,用来检测风扇故障,仿真的时候发现无法正常读取外部高低电平;将PB3设置成输出,发现也无法输出高低电平。使用keil+cubeMX裸机开发,配置PB3成输出和输入,发现用keil仿真的时候不好使,将JTAG插拔重新上电后再测试,输入输出都正常了。相同的配置在RTThread 工程中仿真,PB3输出、输入都不好使,推出仿真模式,输出好使,输入还是无法检测到外部电平。
二、以前的解决方法
记得以前做过的航空发动机ECU项目中,有几个GPIO由于是JTAG的调试引脚,输出总是没信号,调试了两天才搞定,当时是配置的时候要打开复用时钟,关闭JTAG功能,然后输出就正常了,截取配置的代码如下:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能,把PB3,PB4作为普通IO口使用
三、套用以前的解决方法依旧不行
以前的方法其实就是关闭JTAG功能,开启SWD,但是在cubeMx上已经这么配置好了,依然不好使,配置如下:
对应的代码如下:
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 */ /* USER CODE END MspInit 1 */ }
其实 __HAL_AFIO_REMAP_SWJ_NOJTAG()功能就是对应的上面标准库中的GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE),就是关闭JTAG,开启SWD调试功能。虽然这么配置了,RTThread工程中PB3还是无法读取到电平。
四、整合网上资料得出解决方法
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 */ }
再使用RTThread进行仿真,可以正确的读取到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 */
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/140711.html