(一)GPIO功能描述
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器 (GPIOx_IDR 和 GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存 器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
根据数据手册中列出的每个I/O端口的特定硬件特征, GPIO端口的每个位可以由软件分别配置成多种模式。
─ GPIO_Mode_IN_FLOATING 输入浮空
─ GPIO_Mode_IPU 输入上拉
─ GPIO_Mode_IPD 输入下拉
─ GPIO_Mode_AIN 模拟输入
─ GPIO_Mode_Out_OD 开漏输出
─ GPIO_Mode_Out_PP 推挽式输出
─ GPIO_Mode_AF_PP 推挽式复用功能
─ GPIO_Mode_AF_OD 开漏复用功能
每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。
P-MOS管和N-MOS管可以使得GPIO具有“推挽输出”和“开漏输出”的模式。
P-MOS管: MCU输出为 1 导通,低电平关闭。
N-MOS管: MCU输出为 0 导通,高电平关闭。
说明:上拉输入等于接内部电阻到VDD,下拉输入等于接内部电阻到GND,浮空就是什么都不接。
GPIO端口配置表
输出模式位
I/O口相关的寄存器:
说明:其中GPIOx_CRL为端口配置低寄存器,GPIOx_CRH为端口配置高寄存器。
(二)GPIO输出-LED闪灯
操作STM32的GPIO还是比较模式化的,总共需要三个步骤:
1.使能RCC开启GPIO的时钟(使用各个外设前必须开启时钟,否则对外设的操作无效)。
2.使用GPIO_Init函数初始化GPIO:
(1)我们需要先定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure
(2)配置GPIO模式,赋值为推挽输出模式(在该LED闪灯程序中)
(3)配置GPIO引脚,可以用”|“同时配置多个引脚
(4)配置GPIO速度,赋值为50MHz
(5)将赋值后的构体变量传递给GPIO_Init函数,函数内部会自动根据结构体的参数配置相应寄存器
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
3.使用输出或输入的函数控制GPIO口(IO输出低电平点亮LED):
配置引脚(以配置PA0为例)的高低电平,实现LED闪烁有三种方式:
(1)GPIO_ResetBits设置低电平,GPIO_SetBits设置高电平。
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为低电平
GPIO_SetBits(GPIOA, GPIO_Pin_0); //将PA0引脚设置为高电平
(2)GPIO_WriteBit设置低/高电平,由Bit_RESET/Bit_SET指定。
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //将PA0引脚设置为低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //将PA0引脚设置为高电平
(3)GPIO_WriteBit设置低/高电平,由数据0/1指定,数据需要强转为BitAction类型
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //将PA0引脚设置为低电平
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //将PA0引脚设置为高电平