1 示例:通过一个按钮控制LED灯亮灭,了解gpio外设寄存器组。
#include "stm32f10x.h"
#include "stm32f10x_pal.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
int main(void)
{
GPIO_InitTypeDef GPIOInitStruct;
uint8_t current = Bit_SET;
uint8_t previous = Bit_SET;
PAL_Init();
// PC13 Out_OD
// GPIOC
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // GPIOC的时钟
GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIOInitStruct);
// GPIO_Write(GPIOC,0);
// PA0 IPU
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // GPIOA的时钟
GPIOInitStruct.GPIO_Pin = GPIO_Pin_0;
GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIOInitStruct);
while(1)
{
previous = current;
current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if(current != previous)
{
// PAL_Delay(10);
current = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
if(current != previous)
{
if(current == Bit_RESET) // 按钮按下
{
}
else // 按钮松开
{
// ODR
if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13) == Bit_RESET)
{
PAL_Delay(50);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
PAL_Delay(50);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
else
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}
}
}
}
}
}
2 未按下复位
1 GPIOA寄存器组
PA14 引脚默认具有特殊功能,被用作 JTAG 调试接口的一部分。当你将其配置为下拉输入模式但仍然测量到高电平时,可能是因为没有正确禁用 JTAG 功能并将该引脚重映射为普通 I/O 口。
要解决这个问题,可以按照以下步骤进行操作:
1. 在时钟配置部分,开启 AFIO 复用时钟。例如:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
2. 进行重映射配置,以禁用 JTAG 功能并将 PA13、PA14、PA15、PB3、PB4 引脚设置为普通 I/O 口。使用以下代码:
GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
完成上述步骤后,PA14 引脚就可以作为普通的下拉输入引脚使用了,在没有外部输入信号时,它应该呈现低电平。如果仍然存在问题,请检查硬件电路连接是否正确。
2 GPIOB寄存器组
PB4 引脚具有多种功能,默认情况下,它被用作 JTAG 的调试端口之一。
如果要将 PB4 用作普通 GPIO(通用输入输出)引脚,需要进行一些配置。具体来说,需要关闭 PB4 引脚的 JTAG 功能,使其可以充当普通 GPIO 来进行使用,配置方式如下:
首先开启 AFIO(复用功能 I/O)复用时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
然后进行引脚重映射: GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
经过上述配置后,PB4 就可以作为普通 GPIO 使用了。
PB4 还可以通过复用功能重映射,用于其他外设功能,例如 TIM3 的通道 1(CH1)。在这种情况下,需要进行相应的外设配置,例如配置定时器等。
3 GPIOC寄存器组
C端口都是浮空输入
3 按下复位,打开时钟,初始化GPIOA、GPIOC
PA0 上拉输入
PC13 开漏输出 2Mhz
初始化完成