stm32 GPIO的使用
作者:互联网
STM32F4 的 IO 可以由软件配置成如下 8 种模式中的任何一种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏式复用功能
IO 配置常 用的 8 个寄存器: MODER、OTYPER、OSPEEDR、PUPDR、ODR、IDR 、AFRH 和 AFRL。
MODER 寄存器 :该寄存器是 GPIO 端口模式控制寄存器,用于控制 GPIOx (STM32F4 最多有 9 组 IO,分别用大写字母表示,即 x=A/B/C/D/E/F/G/H/I,下同)的工作模 式。
OTYPER 寄存器:该寄存器用于控制 GPIOx 的输出类型。
OSPEEDR 寄存器:该寄存器用于控制 GPIOx 的输出速度。
PUPDR 寄存器:该寄存器用于控制 GPIOx 的上拉/下拉。
操作四个配置寄存器初始化 GPIO 是通过 GPIO 初始化函数完成:
void GPIO_Init ( GPIO_TypeDef* GPIOx , GPIO_InitTypeDef* GPIO_InitStruct )
这个函数有两个参数,第一个参数是用来指定需要初始化的 GPIO 对应的 GPIO 组,取值范围 为 GPIOA~GPIOK。
第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。
typedef struct
{
uint32_t GPIO_Pin;
GPIOMode_TypeDef GPIO_Mode;
GPIOSpeed_TypeDef GPIO_Speed;
GPIOOType_TypeDef GPIO_OType;
GPIOPuPd_TypeDef GPIO_PuPd;
}
GPIO_InitTypeDef;
通过初始化结构体初始化 GPIO 的常用格式是:
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9//GPIOF9
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化 GPIO
上面代码的意思是设置 GPIOF 的第 9 个端口为推挽输出模式,同时速度为 100M,上拉。
结构体 GPIO_InitStructure 的 第一个成员变量 GPIO_Pin 用来 设置是要初始化哪个或者哪些 IO 口。
第二个成员变量 GPIO_Mode 是用来设置 对应 IO 端口的输出输入端口模式,这个值实际就是配置 GPIOx 的 MODER 寄 存器的值。
GPIO_Mode_IN 是用来设置为复位状态的输入
GPIO_Mode_OUT 是通用输出模式
GPIO_Mode_AF 是复用功能模式
GPIO_Mode_AN 是模拟输入模式。
第三个参数 GPIO_Speed 是 IO 口输出速度设置,有四个可选值。实际上这就是配置的 GPIO 对应的 OSPEEDR 寄存器的值。
GPIO_Speed_2MHz or GPIO_Low_Speed
GPIO_Speed_25MHz or GPIO_Medium_Speed
GPIO_Speed_50MHz or GPIO_Fast_Speed
GPIO_Speed_100MHz or GPIO_High_Speed
第四个参数 GPIO_OType 是 GPIO 的输出类型设置,实际上是配置的 GPIO 的 OTYPER 寄 存器的值。
输出推挽模式 : GPIO_OType_PP,
输出开漏模式 : GPIO_OType_OD。
第五个参数 GPIO_PuPd 用来设置 IO 口的上下拉,实际上就是设置 GPIO 的 PUPDR 寄存 器的值。
GPIO_PuPd_NOPULL 为不使用上下拉
GPIO_PuPd_UP 为上拉,
GPIO_PuPd_DOWN 为下拉。
ODR 寄存器,该寄存器用于控制 GPIOx 的输出该寄存器用于设置某个 IO 输出低电平(ODRy=0)还是高电平(ODRy=1),该寄存器也仅在输 出模式下有效,在输入模式(MODER[1:0]=00/11 时)下不起作用。
在固件库中设置 ODR 寄存器的值来控制 IO 口的输出状态是通过函数 GPIO_Write 来实现 的:
void GPIO_Write(GPIO_TypeDef* GPIOx , uint16_t PortVal);
该函数一般用来往一次性一个 GPIO 的多个端口设值。 使用实例如下: GPIO_Write(GPIOA,0x0000); 大部分情况下,设置 IO 口我们都不用这个函数
同时读 ODR 寄存器还可以读出 IO 口的输出状态
库函数为: uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx); uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这两个函数功能类似,只不过前面是用来一次读取一组 IO 口所有 IO 口输出状态,后面的函数 用来一次读取一组 IO 口中一个或者几个 IO 口的输出状态。
IDR 寄存器,该寄存器用于读取 GPIOx 的输入,该寄存器用于读取某个 IO 的电平,如果对应的位为 0(IDRy=0),则说明该 IO 输入的是低 电平,如果是 1(IDRy=1),则表示输入的是高电平
库函数相关函数为: uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
前面的函数是用来读取一组 IO 口的一个或者几个 IO 口输入电平,后面的函数用来一次读取一 组 IO 口所有 IO 口的输入电平。比如我们要读取 GPIOF.5 的输入电平,方法为: GPIO_ReadInputDataBit(GPIOF, GPIO_Pin_5);
32 位置位/复位寄存器 (BSRR),这个寄存器是用来置位或者 复位 IO 口,该寄存器和 ODR 寄存器具有类似的作用,都可以用来设置 GPIO 端口的输出位是 1 还是 0。
BSRR 寄存器使用方法如下:
GPIOA->BSRR=1<<1; //设置 GPIOA.1 为高电平
GPIOA->BSRR=1<<(16+1)//设置 GPIOA.1 为低电平;
库函数操作 BSRR 寄存器来设置 IO 电平的函数为:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
函数 GPIO_SetBits 用来设置一组 IO 口中的一个或者多个 IO 口为高电平。
GPIO_ResetBits 用来 设置一组 IO 口中一个或者多个 IO 口为低电平。
设置 GPIOB.5 输出高,方法为: GPIO_SetBits(GPIOB,GPIO_Pin_5);//GPIOB.5 输出高
设置 GPIOB.5 输出低电平,方法为: GPIO_ResetBits(GPIOB,GPIO_Pin_5);//GPIOB.5 输出低
操作GPIO步骤为: (1) 使能 IO 口时钟。调用函数为 RCC_AHB1PeriphClockCmd ()。
(2) 初始化 IO 参数。调用函数 GPIO_Init();
(3) 操作 IO。
标签:输出,TypeDef,GPIOx,使用,stm32,IO,寄存器,GPIO 来源: https://www.cnblogs.com/zanshuai/p/16412251.html