【Bug】STM32F1的PB3和PB4无法正常输出

Bug

使用标准库配置STM32F103C8T6的PB3和PB4引脚输出控制LED灯时,发现引脚电平没有变化无法正常输出高低电平,配置代码如下:

c 复制代码
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	
	   
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_4);

Reason

原文链接:STM32 PB3/PB4不能正常使用的解决办法

网上搜了一下后通过上面博客的讲解,才知道在系统复位的时候,PB3和PB4对应的功能默认为SYS_JTDO和SYS_NJTRST。

这两个引脚是在使用Jlink向STM32烧录程序时需要用到,所以默认的功能就不作为普通的GPIO,需要通过复用,才能作为普通的GPIO,只需要在配置时增加以下两行代码:

c 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);	 
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);		

第一行是多一个复用功能时钟的使能,第二行是使能JTAG相关引脚的复用,该参数在内部函数中标注的意思是:@arg GPIO_Remap_SWJ_JTAGDisable : JTAG-DP Disabled and SW-DP Enabled


Resolution

修改后的配置代码如下:

c 复制代码
	GPIO_InitTypeDef GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);	
	   
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_SetBits(GPIOB,GPIO_Pin_4);

相关推荐
xiugou79810 分钟前
记录一下CubeMX+Clion的STM32 CMake工程中如何修改Flash程序存储的起始地址
stm32·单片机·嵌入式硬件
涂山苏苏⁠4 小时前
STM32之RTC
stm32·rtc
清风6666665 小时前
基于STM32单片机的OneNet物联网粉尘烟雾检测系统
stm32·单片机·物联网·毕业设计·课程设计
文火冰糖的硅基工坊7 小时前
[硬件电路-192]:基级与发射极两端的电压超过1.5v可能是什么原因
单片机·嵌入式硬件·系统架构·电路·跨学科融合
源远流长jerry10 小时前
STM32之RTOS移植和使用
stm32·单片机·嵌入式硬件
2301_14725836910 小时前
STM32 单片机开发 - SPI 总线
单片机·嵌入式硬件
范纹杉想快点毕业16 小时前
ZYNQ PS 端 UART 接收数据数据帧(初学者友好版)嵌入式编程 C语言 c++ 软件开发
c语言·笔记·stm32·单片机·嵌入式硬件·mcu·51单片机
方圆工作室17 小时前
51单片机驱动数码管
单片机·嵌入式硬件·51单片机
乔宕一18 小时前
stm32 链接脚本没有 .gcc_except_table 段也能支持 C++ 异常
c++·stm32·嵌入式硬件
范纹杉想快点毕业19 小时前
STM32 串口接收数据包(自定义帧头帧尾)
stm32·单片机·嵌入式硬件