目录
1.GPIO输入输出工作方式
1)输入浮空模式
浮空顾名思义就是悬浮在空中,也叫悬空输入。
配置成浮空输入模式,如果没有连接其他设备,检测到的电平是不确定的,有可能检测到高电平,也有可能检测到低电平。
2)输入上拉—下拉模式
上拉模式时输入端口默认为高电平,下拉与之相反
3)输入模拟模式
这个模式比较好理解,主要用于模拟输入时的配置(一般是针对ADC功能)。在特殊DAC输出的时候也用该模式
4)输出开漏模式
输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内).
输出 0 时,N-MOS 导通,P-MOS 不被激活,输出0。
输出 1 时,N-MOS 高阻, P-MOS 不被激活,输出1(需要外部上拉电路);
此模式可以把端口作为双向IO使用。
支持线与和电平转换——线与,即两个输出端(包括两个以上)直接互连就可以实现“AND”(有0出0,全1出1)的逻辑功能。
5)复用输出开漏模式
所谓的管脚复用,就是除第一功能外,增加了第二功能.当然在利用程序控制时是不会影响的
6)输出推挽模式
可以输出高,低电平,连接数字器件; 推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止。高低电平由IC的电源低定。
输出 0 时,N-MOS 导通,P-MOS 高阻,输出0。
输出 1 时,N-MOS 高阻,P-MOS 导通,输出1(不需要外部上拉电路)。
不支持线与和电平转换
7)复用输出推挽模式
所谓的管脚复用,就是除第一功能外,增加了第二功能当然在利用程序控制时是不会影响的.
2.GPIO寄存器
GPIOx_CRL :端口配置低寄存器 -
选定GPIO 的特定功能,最基本的如:选择作为输入还是输出端口,运行模式和运作速度
GPIOx_CRH:端口配置高寄存器 -
选定GPIO 的特定功能,最基本的如:选择作为输入还是输出端口,运行模式和运作速度
GPIOx_IDR:端口输入寄存器 -
32位寄存器其中16-31位一直保留,始终为0;0-15位则对应着16个IO口,1为高电平,0为低电平。
如:GPIOA->IDR & 0x0001 即为 PA-1的电平状态,IDR寄存器的16位对应了该GPIO的P0-P15
GPIOx_ODR:端口输出寄存器 -
与数据输入的配置差不多,但是ODR在输入模式下可以控制上升沿和下降沿的配置!
GPIOx_BSRR:端口位设置/清除寄存器 -
BSRR比之上面的寄存器有些复杂,但也不是很难,32位分两个16位高和低,共同控制ODR数据输出寄存器的每一位输出;具体的控制方式在下图中。
高低位0不产生影响,高位置1则对应ODR位为0.低位置1则对应ODR为1;高低位同事作用时,则只有低16位起作用!
GPIOx_BRR :端口位清除寄存器
该寄存器与上面BSRR高16位作用相同,F1中有些赘余,但F4中已优化。
GPIOx_LCKR:端口配置锁存寄存器
3.GPIO功能
端口复用功能
STM32的大部分端口都具有复用功能。 所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一 些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。
端口重映射功能
例如串口1的默认引脚为A9,当A9被占用时,根据芯片端口重映射功能,把B6分配为串口1引脚使用。一但无可分配引脚,则串口1无法使用。
4.GPIO初始化
1.HAL库初始化
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//声明一个结构体,结构体的名字为GPIO_InitStruct,结构体的原型由GPIO_InitTypeDef确定
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOB_CLK_ENABLE();
//使能GPIOB的时钟线,如果没有开启时钟线,GPIOB无法正常使用
//使能了外设时钟后,不能立即操作对应的寄存器,要加延迟。例如加一个读操作或写操作
//a、如果是AHB的外设,使能了时钟后,需要等待2个AHB时钟周期才可以操作这个外设的寄存器。
//b、如果是APB的外设,使能了时钟后,需要等待2个APB时钟周期才可以操作这个外设的寄存器。
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
//将B5默认电平设置为高电平
/*Configure GPIO pin : PB5 */
GPIO_InitStruct.Pin = GPIO_PIN_5;
//选择5号引脚
//#define GPIO_PIN_5 ((uint16_t)0x0020)
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
//引脚模式为推挽输出
//#define GPIO_MODE_OUTPUT_PP 0x00000001U
GPIO_InitStruct.Pull = GPIO_NOPULL;
//没有上拉或下拉电阻
//#define GPIO_NOPULL 0x00000000U
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
//选择低速传输 输出模式,最大速度2MHz
//#define GPIO_SPEED_FREQ_LOW (0x2U << GPIO_CRL_MODE0_Pos)
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
//将结构体的配置给GPIOB
}
2.标准库初始化
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
//声明一个结构体,结构体的名字为GPIO_InitStruct,结构体的原型由GPIO_InitTypeDef确定
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//使能GPIOA时钟
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
//配置输出推挽模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
//配置0号IO口
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
//配置IO口速度,仅输出有效
GPIO_Init(GPIOA,&GPIO_InitStruct);
//初始化GPIOA的参数为以上结构体
}
3.GPIO配置结构体
typedef struct
{
uint32_t Pin; //第几个引脚
uint32_t Mode; //GPIO模式
uint32_t Pull; //上拉电阻或下拉电阻或无上拉下拉电阻
uint32_t Speed; //工作速度
} GPIO_InitTypeDef;
4.GPIO函数
(1)HAL_GPIO_DeInit
功能:这个函数的主要功能是将我们在1函数初始化之后的引脚恢复成默认的状态,即各个寄存器复位时的值
例:HAL_GPIO_DeInit(GPIOx,GPIO_PIN_X);
(2)HAL_GPIO_LockPin
功能:这个函数看函数名称就是锁住的意思,比如说一个管脚的当前状态是1,读管脚值使用锁定,当这个管脚电平变化时保持锁定时的值。
例:HAL_GPIO_LockPin(GPIOX,GPIO_PIN_X);
(3)HAL_GPIO_ReadPin
功能:检测这个管教当前状态值,函数返回值为0或1。
例:HAL_GPIO_ReadPin(GPIOX,GPIO_PIN_X);
(4)HAL_GPIO_TogglePin
功能:这个函数用来翻转某个引脚的电平状态,我用的最多的场合是LED灯的翻转,也就是LED闪烁。
例:HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_10);
(5)HAL_GPIO_WritePin
功能:这个函数从字面意思来看就是给某个引脚写0或1,但是不要理解成,写1就是使能之类的意思,有些寄存器写1是擦除的意思,这一点要谨记。
例:HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET) //设置为高电平 HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET) //设置为低电平