STM32 GPIO篇
GPIO,全称为通用输入输出接口(General-Purpose Input/Output),是嵌入式系统中常见的接口之一。它提供了一种灵活的方式来连接和控制外部设备和电路,使得CPU可以读取这些设备的状态、向其发送控制信号,或者与其进行数据交换。
可配置八种输入输出模式:
- GPIO浮空输入_IN_FLOATING模式
- GPIO带上拉输入_IPU 模式
- GPIO带下拉输入_IPD 模式
- GPIO模拟输入_AIN 模式
- GPIO开漏输出_OUT_OD 模式
- GPIO推挽输出_OUT_PP模式
- GPIO开漏复用输出_AF_OD模式
- GPIO推挽复用输出_AF_PP模式
引脚电平:0~3.3V 部分引脚可容忍5V
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器模拟通信协议输出时序等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
可以看到GPIO全部挂载在APB2总线上,且仅在低16位有对应的端口
GPIO位结构
输入模式(图13中上方虚线框块:输入驱动器
浮空输入:数字输入,上下开关都断开
上拉输入:数字输入,上开关导通,下开关断开;电阻阻值较大,弱上拉
下拉输入:数字输入,上开关断开,下开关导通;电阻阻值较大,弱下拉
模拟输入:模拟输入,施密特触发器无效状态,一般在ADC时使用
其中肖特基触发器貌似应该是施密特触发器,故经过施密特触发器整形后是波形作为数字量,可直接斜入输入数据寄存器,而模拟输入接收模拟量,故接到触发器前
输出模式 (上方虚线框块:输出驱动器(均为数字输出
推挽输出:P-MOS和N-MOS均有效;数据寄存器为1时,上通下断,输出高电平;为0反之。高低电平均有较强的驱动能力,故该模式也叫强推输出模式
开漏输出:P-MOS无效,N-MOS工作;数据寄存器为1时,下管断开,为高阻模式
关闭状态:输出关闭,端口电平由外部信号来控制
复用开漏输出:由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出:由片上外设控制,高电平接VDD,低电平接VSS
位设置/清除寄存器:用于单独操作输出数据寄存器的某一位,而不影响其他位
GPIO寄存器
端口配置寄存器
每个端口由四位进行配置,故配置寄存器分为端口配置低寄存器(GPIOx_CRL)和端口配置高寄存器(GPIOx_CRH),配置方式:
端口输入寄存器(GPIOx_IDR)
低16位对应16个引脚,高16位没有使用
端口输出寄存器(GPIOx_ODR)
低16位对应16个引脚,高16位没有使用
端口位设置/清除寄存器(GPIOx_BSRR)
高16位用于进行位清除,低16位用于位设置
端口位清除寄存器(GPIOx_BRR)
低16位用于位清除,与端口位设置/清除寄存器(GPIOx_BSRR)的高16位作用相同,用于方便操作
端口配置锁定寄存器(GPIOx_LCKR)
用来锁定端口位的配置
GPIO初始化配置
步骤1:使用RCC开启GPIO时钟
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
以上函数为RCC常用函数,分别用于使能或失能AHBP、APB2、APB1外设时钟
步骤2:使用GPIO_Init()函数初始化GPIO
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
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_DeInit() 用于复位指定的GPIO外设
GPIO_AFIODeInit() 复位AFIO外设
GPIO_Init() 用结构体的参数初始化GPIO口
GPIO_StructInit() 把结构体变量赋默认值
步骤3:使用输出或输入函数控制GPIO口
其余Read和Set、Reset函数用于控制GPIO读写
示例
//用于整点原子精英版点亮LED灯
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能APB2
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO_InitTypeDef结构体,用于初始化
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB5
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化
GPIO_ResetBits(GPIOB, GPIO_Pin_5); //低电平点亮
作者:陽临