STM32 GPIO操作
外设时钟控制
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); |
跳转之后,函数提示输入以下信息:
/** |
RCC_APB2PeriphClockCmd( )
参数1:假设使用A0口,即为RCC_APB2Periph_GPIOA
参数2:启用或禁用
GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure; |
GPIO_Init( )
/** |
GPIO_Init( )
参数1:GPIOx,A0为A
参数2:结构体类型GPIO_InitTypeDef的地址
结构体 GPIO_InitTypeDef
用于初始化GPIO
typedef struct |
**GPIO_Pin **查询GPIO_pins_define
/** @defgroup GPIO_pins_define
* @{
*/由于点灯使用A的0号引脚,故使用GPIO_Pin_0,即GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_Mode 查询GPIOMode_TypeDef GPIO的八种工作模式
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_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Speed 查询 GPIOSpeed_TypeDef
typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;平常使用50mhz即可,即GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO输出
初始化
1、设置时钟
2、初始化io
3、实现代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); |
GPIO_SetBits( ) 设置高电平
/** |
参数1:GPIOx (A..G) 例如A0 为GPIOA
参数2:GPIO_Pin_x (0..15) 例如A0 为GPIO_Pin_0
GPIO_ResetBits( )设置低电平
/** |
参数1:GPIOx (A..G) 例如A0 为GPIOA
参数2:GPIO_Pin_x (0..15) 例如A0 为GPIO_Pin_0
GPIO_WriteBit( ) 设置单个端口的值
/** |
参数1:GPIOx (A..G) 例如A0 为GPIOA
参数2:GPIO_Pin_x (0..15) 例如A0 为 GPIO_Pin_0
参数3:Bit_RESET 清除端口值(清零) Bit_SET设置端口值(置1)
GPIO_Write( ) 设定GPIOx的端口值
/** |
参数1:GPIOx (A..G) 例如A0 为GPIOA
参数2:ODR寄存器值 16位二进制,但是c语言需要将其转为16进制
举例 设置A0为高 0000 0000 0000 0001
0x0 0 0 1
0x0001;
总览
GPIO_SetBits(GPIOA,GPIO_Pin_0); |
应用
灯闪烁
点亮led等待一段时间,然后再熄灭,循环
|
流水灯
|
GPIO 输入
初始化
1、设置时钟
2、初始化io
3、实现代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//配置时钟 |
观察发现,相比于GPIO输出仅变两处代码
1、删除GPIO_Speed,对于输入模式GPIO_Speed无意义
2、设置GPIO_Mode为GPIO_Mode_IPU
GPIO_ReadInputDataBit( ) 读取单个端口的值
/** |
入参:GPIOx、GPIO—Pin
出参:value 1/0
GPIO_ReadInputData( ) 读取端口GPIOx的值
/** |
入参:GPIOx
出参:16位二进制 例如0x0001
GPIO_ReadOutputDataBit( ) 查询设定的单个端口的值
/** |
入参:GPIOx、GPIO—Pin
出参:value 1/0
GPIO_ReadOutputData( )查询设定的GPIOx的值
/** |
入参:GPIOx
出参:16位二进制 例如0x0001
总览
xxx=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10); |
应用
按键改变灯光状态
|
不过需要注意的是
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)(~value));这样写,不能正常工作
故使用以下语句代替
if(value){
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);
}else{
GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
}感觉逻辑是对的,但是不知为何不工作
补充内容
推挽模式与开漏模式
推挽输出再高电平与低电平都具有驱动能力
开漏输出低电平有驱动能力,高电平相当于高阻态无驱动能力
总结
代码总体的书写流程
第一步,配置RCC外设时钟控制
第二步,初始化GPIO引脚,借助结构体配置io引脚号、模式、频率等,其中模式很重要
第三步,根据选择的模式,使用使用输入或者输出的函数,实现其余的代码逻辑
GPIO的8种工作模式
GPIO_Mode_AIN
(模拟输入):将引脚配置为模拟输入模式。此模式适用于连接到模拟信号的引脚,用于测量或读取模拟电压。GPIO_Mode_IN_FLOATING
(浮空输入):将引脚配置为浮空输入模式。在此模式下,引脚既不连接到外部电源也不连接到地,可以用作普通输入引脚。GPIO_Mode_IPD
(下拉输入):将引脚配置为下拉输入模式。在此模式下,引脚被连接到地,并且在未连接到外部信号时,引脚被拉低为逻辑低电平。GPIO_Mode_IPU
(上拉输入):将引脚配置为上拉输入模式。在此模式下,引脚被连接到外部电源,并且在未连接到外部信号时,引脚被拉高为逻辑高电平。GPIO_Mode_Out_OD
(开漏输出):将引脚配置为开漏输出模式。在此模式下,引脚可以输出高电平或悬空(高阻态),但不能输出低电平。需要通过外部上拉电阻或其他引脚来拉低引脚电平。GPIO_Mode_Out_PP
(推挽输出):将引脚配置为推挽输出模式。在此模式下,引脚可以输出高电平或低电平,可以直接驱动外部电路。GPIO_Mode_AF_OD
(复用开漏):将引脚配置为复用开漏模式。在此模式下,引脚用于特定的外设功能,并且输出为开漏模式。需要通过外部上拉电阻或其他引脚来拉低引脚电平。GPIO_Mode_AF_PP
(复用推挽):将引脚配置为复用推挽模式。在此模式下,引脚用于特定的外设功能,并且输出为推挽模式,可以直接驱动外部电路。
- 标题: STM32 GPIO操作
- 作者: Kozakemi
- 创建于 : 2023-09-08 23:15:06
- 更新于 : 2024-05-17 13:47:59
- 链接: https://kozakemi.gitlab.io/post/fea5aa33.html
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。