STM32,这个MPU上电默认PB4 PB3 PA15这些引脚电平且无法正常拉高拉低。
PB4,PA15为高电平,PB3为低电平。
其实原因是:I/O口不能正常输出一般都是端口被复用了造成的。
文章讲的这几个端口在单片机上电时默认就是复用的,JTAG相关的PA13,PA14,PA15,PB3,PB4引脚,禁用JTAG或SWD可以释放其中的一些引脚。
这个就是复用功能
我们需要使用stlinkV2进行烧录所以使用,部分重映射。JTAG-DA失能,SW-DP使能;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO ,ENABLE);//重映射需要先使能AFIO时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//只关闭JTAG而保留SWD
打开复用时钟是为了,使用重映射功能。(PinRemapConfig)
重映射就是引脚重映射,本来每个内置外设都有原来设定的引脚,所谓的重映射就是通过某种方式,将外设本来的引脚的功能赋予给另外的引脚。这里就是释放了PB4,PB3,PA15.
以下是代码实例:
void Motor_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//使用推挽输出,别用复用推挽;
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// GPIO_Init(GPIOB, &GPIO_InitStructure);
PWM_Init();
}
然后就可以快乐的拉高拉低io口电平啦。
GPIO_ResetBits(GPIOB,GPIO_Pin_4);//默认高,欧姆表测得到低电平就好啦。
GPIO_SetBits(GPIOB,GPIO_Pin_3);//默认低,拉高就正确啦。
不知道为啥打开复用功能,端口配置复用推挽不可以正常拉高拉低,只有普通的推挽才可以,有会的小伙伴教教我。
参考文献:文章来源:https://www.toymoban.com/news/detail-771163.html
STM32 I/O口不能正常输出高低电平问题的解决方案_stm32 io在中断中能输出,主程序中无法_奇奇猴的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-771163.html
到了这里,关于STM32引脚PA15,PB3,PB4用做普通I/O口高低电平默认无法拉高拉低的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!