[STM32 GPIO配置]

[STM32 GPIO配置]

  • GPIO初始化结构体:
	//定义结构体
	GPIO_InitTypeDef GPIO_InitStructure;
	//配置GPIO_Mode
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	//GPIO_Pin选择
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	//GPIO_Speed设置
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  • 关于GPIO_Mode:

在程序函数里是这么写的:

/** 
  * @brief  Configuration Mode enumeration  
  */

typedef enum
{ GPIO_Mode_AIN = 0x0,
  GPIO_Mode_IN_FLOATING = 0x04,
  GPIO_Mode_IPD = 0x28,
  GPIO_Mode_IPU = 0x48,
  GPIO_Mode_Out_OD = 0x14,
  GPIO_Mode_Out_PP = 0x10,
  GPIO_Mode_AF_OD = 0x1C,
  GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;

​ 其中,具体的模式及使用说明如下:

GPIO_Mode_AIN为模拟输入模式(Analog Input Mode)。

​ 在该模式下,GPIO引脚被配置为模拟信号输入。ADC模块可以将引脚读取到的模拟信号转换成数字信号进行处理。这种模式适用于需要精确模拟量信号输入的场合,如温度传感器、光传感器等。

GPIO_Mode_IN_FLOATING为浮空输入模式(Floating Input Mode)。

​ 在该模式下,GPIO引脚处于高阻态且未选通上拉或下拉电阻。这种模式适用于数字输入信号不需要精度要求的场合,例如控制系统中一些状态量检测、接近传感器等的信号输入。但是,在使用输入浮空模式时,需要注意防止静电干扰和误操作。

GPIO_Mode_IPD为下拉输入模式(Input with Pull-up Mode)。

​ 在该模式下,GPIO引脚通过一个上拉电阻与VDD相连。当外部电路未连接时,引脚被拉向高电平。这种模式适用于需要稳定输入信号的场合,如按键开关、震动传感器等的信号输入。此模式适用于数字输入信号需要精度要求的场合。

GPIO_Mode_IPU为上拉输入模式(Input with Pull-down Mode)。

​ 在该模式下,GPIO引脚通过一个下拉电阻与GND相连。当外部电路未连接时,引脚被拉向低电平。这种模式同样适用于需要稳定输入信号的场合,如按键开关、震动传感器等的信号输入。此模式同样适用于数字输入信号需要精度要求的场合。

GPIO_Mode_Out_OD为开漏输出模式(Open-drain Output Mode)。

​ 在该模式下,GPIO引脚可以输出低电平信号,但输出高电平信号时变为高阻态。需搭配一个外部上拉电阻使引脚运作正确。开漏输出模式适用于驱动外部设备,如LED灯、数码管等。此模式适用于外部设备控制信号输出的场合。

GPIO_Mode_Out_PP为推挽输出模式(Push-pull Output Mode)。

​ 在该模式下,GPIO引脚可以输出高、低电平信号。推挽输出模式适用于直接驱动负载场合,如电机、继电器等的输出驱动。此模式适用于直接驱动负载的控制信号输出的场合。

GPIO_Mode_AF_OD为开漏式复用功能模式(Open-drain Alternate Function Mode)

​ 在该模式下,GPIO引脚可以被配置为一些标准的或自定义的功能,例如I2C总线通讯的SCL时钟线。这种模式下,GPIO引脚被配置为开漏输出模式,适用于驱动外部设备或总线通讯。

GPIO_Mode_AF_PP推挽式复用功能模式(Push-pull Alternate Function Mode)

​ 在该模式下,GPIO引脚可以被配置为一些标准的或自定义的功能,例如USART通信的TX、RX数据线。这种模式下,GPIO引脚被配置为推挽输出模式,适用于直接驱动负载或者数据通讯。

  • 关于GPIO_Speed:

在程序函数里是这么写的:

typedef enum  
{   
  GPIO_Speed_10MHz = 1,
  GPIO_Speed_2MHz,  
  GPIO_Speed_50MHz  
}GPIOSpeed_TypeDef;

说实话,我也不太清楚Speed具体有什么用,站内查了一下资料,是这么说的:

​ GPIO 引脚速度,又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。)

可理解为: 输出驱动电路的带宽:即一个驱动电路可以不失真地通过信号的最大频率。

​ 这里给出链接stm32引脚速度GPIO_Speed的区别


这样一来,GPIO的基本参数就了解完成了,下面给出完整的配置函数:

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

	GPIO_Init(GPIOA, &GPIO_InitStructure);

​ 这里将GPIOA的Pin_1引脚配置为了上拉输入。因为是从按键函数里拽过来的


给出GPIO的使用函数

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置为高电平
  • GPIOx:要操作的GPIO端口,可以是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF或GPIOG。
  • GPIO_Pin:要设置为高电平的引脚编号,取值范围为0-15。
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置为低电平
  • GPIOx:要操作的GPIO端口,可以是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF或GPIOG。
  • GPIO_Pin:要设置为高电平的引脚编号,取值范围为0-15。
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//写电平
  • GPIOx:要操作的GPIO端口,可以是GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF或GPIOG。
  • PortVal:要输出的值,取值范围为0到FFFF(16位)。
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取指定GPIO端口和引脚号对应的输入状态
  • GPIOx:GPIO端口号(例如GPIOA、GPIOB等)。
  • GPIO_Pin:引脚号(例如GPIO_Pin_0、GPIO_Pin_1等)。
  • 函数返回值为uint8_t类型。
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取指定GPIO端口的输入数据
  • GPIOx:可以是A、B、C、D、E、F或G端口之一。
  • 返回值是一个16位的无符号整数,表示指定GPIO端口上各个引脚的电平状态(1为高电平,0为低电平)。

END

  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值