一、GPIO(General Purpose Input Output)通用输入输出口简介
1.可配置为8中输入输出模式;
2.引脚电平:0V~3.3V,部分引脚可容忍5V;
3.输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等;
4.输入模式下可读取端口的高低电平和电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等。
内核可以通过APB2总线对寄存器进行读写,用以完成输出电平和读取电平的功能。
STM32内的寄存器都是32位的,但是端口只有16位,所以寄存器只有低16位有对应端口,高16位是没有的。
驱动器使用来增加信号的驱动能力的。
二、GPIO位结构
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式:
浮空/上拉/下拉输入:
模拟输入:
开漏/推挽输出:
P-MOS如果无效,就是开漏输出,如果P-MOS和N-MOS都有效,就是推挽输出。
复用开漏/推挽输出:
三、GPIO寄存器
1.端口配置低/高寄存器
2. 端口输出数据寄存器
低16为对应16个引脚,高16为没有使用。
3.端口位设置/清除寄存器
高16为是进行清除的,低16为是进行位设置的。
四、GPIO输入、输出代码实现
1.外设对应总线开启RCC时钟使能
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//使能或失能AHB外设时钟
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//使能或者失能 APB2 外设时钟
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
//使能或者失能 APB1 外设时钟
2.GPIO初始化
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//将外设 GPIOx 寄存器重设为缺省值
void GPIO_AFIODeInit(void);
//将复用功能(重映射事件控制和 EXTI 设置)重设为缺省值
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
//把 GPIO_InitStruct 中的每一个参数按缺省值填入
3.GPIO输入/输出操作
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定端口管脚的输入
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取指定的 GPIO 端口输入
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取指定端口管脚的输出
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
//读取指定的 GPIO 端口输出
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//设置指定的数据端口位
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//清除指定的数据端口位
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//设置或者清除指定的数据端口位
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//向指定 GPIO 数据端口写入数据
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//锁定 GPIO 管脚设置寄存器
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//选择 GPIO 管脚用作事件输出
void GPIO_EventOutputCmd(FunctionalState NewState);
//使能或者失能事件输出
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
//改变指定管脚的映射
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
//选择 GPIO 管脚用作外部中断线路
输出例子:
将IO口A0、A1设置为推挽输出,并输出高电平1。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开GPIOA的时钟使能
GPIO_InitTypeDef GPIO_InitStructure; //创建初始化IO口的结构体
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //选择IO的输出模式为推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1; //选择需要初始化的IO口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //选择IO的传输速度
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化GPIO
GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); //设置A0,A1输出1
补:GPIO_Mode的取值范围有: