当前位置: 首页 > news >正文

嵌入式八股文之 GPIO

1. GPIO 的基本概念

(1) 什么是 GPIO?

GPIO 的中文意思是通用输入输出端口(General Purpose Input/Output),是嵌入式系统中可编程控制的通用引脚,可通过软件配置为输入或输出模式。(背诵)

(2) 它的主要功能是什么?(背诵)

输入功能:读取引脚电平状态获取按键和各类传感器的信息输入。

输出功能:输出高低电平,控制外围设备。

复用功能:部分GPIO可配置为特殊功能(如UART、SPI、I2C)

2. GPIO 的 8 种工作模式(背诵)

模式名称性质关键特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定(巧记:输入为读取)
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入 GPIO 无效,引脚直接接入内部 ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接 VSS(巧记:输出为输出)
推挽输出数字输出可输出引脚电平,高电平接 VDD,低电平接 VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平为 VSS
复用推挽输出数字输出由片上外设控制,高电平接 VDD,低电平接 VSS

(1) 上拉/下拉电阻:上拉/下拉电阻用于设置引脚的默认电压。上拉使能,引脚默认电压为高电平,下拉使能,引脚默认电压为低电平。

(2) VSS 通常指电路的负极,VDD 通常指电路的正电源。

3. 推挽输出和开漏输出的区别

(1) 

4. GPIO 初始化流程(以STM32为例,描述GPIO初始化的步骤)

(1) 使能GPIO时钟

作用:微控制器中外设(如GPIO)默认处于关闭状态以节省功耗。时钟信号是数字电路工作的基础,必须开启对应GPIO端口的时钟,才能配置和使用其引脚

操作实例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  # 使能GPIOA的时钟
  • RCC:Reset and Clock Control(复位与时钟控制器),负责管理系统时钟和外设时钟。
  • APB2:一种低速总线,连接GPIO、USART等外设。
  • PeriphClockcmd:外设时钟控制命令。

(2) 配置GPIO引脚参数(背诵)

① 关键参数:

  • Pin:选择具体的引脚(如GPIO_PIN_5)。
  • Mode:设置引脚模式(输入/输出/复用/模拟)。
  • Pull:配置上拉或下拉电阻(上拉、下拉、无上下拉)。
  • Speed:输出驱动速度(低速、中速、高速、超高速)。

(3) 调用 GPIO_Init() 生效

① 声明结构体变量:

GPIO_InitTypeDef GPIO_InitStruct;  # 创建结构体实例

② 填充配置参数:

# 示例:配置PA5为推挽输出,高速,无上下拉
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pull = GPIO_PuPd_NOPULL;

③ 调用初始化函数:

GPIO_Init(GPIOA, &GPIO_InitStruct);  # 应用配置到GPIOA端口

5. GPIO 必记函数

(1) 时钟控制函数:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

示例:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); # 开启GPIOA的时钟

(2) GPIO 初始化函数:

void GPIO_DeInit(GPIO_TypeDef* GPIOx); # 被指定的GPIO外设会被复位
void GPIO_AFIODeInit(); # 复位AFIO复用功能配置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* InitStruct); # 配置GPIO引脚的工作模式、速度、上下拉等参数
void GPIO_StructInit(GPIO_InitTypeDef* InitStruct); # 把结构体变量赋值一个默认值

示例:

GPIO_InitTypeDef gpio;
gpio.GPIO_Pin = GPIO_Pin_5;        # 选择PA5引脚
gpio.GPIO_Mode = GPIO_Mode_Out_PP; # 推挽输出模式
gpio.GPIO_Speed = GPIO_Speed_50MHz; # 高速驱动
GPIO_Init(GPIOA, &gpio);           # 应用配置到GPIOA
GPIO_DeInit(GPIOA);  # 复位GPIOA所有寄存器的值
gpio.GPIO_Pin = GPIO_Pin_5;        # 仍选择PA5
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING; # 浮空输入模式
GPIO_Init(GPIOA, &gpio);           # 重新初始化PA5

(3) 输出控制类函数:

① GPIO_SetBits()

  • 功能:将指定引脚设置为高电平(1)。
  • 示例:点亮LED。
GPIO_SetBits(GPIOA, GPIO_Pin_5);  # PA5输出高电平

② GPIO_ResetBits()

  • 功能:将指定引脚设置为低电平(0)。
  • 示例:熄灭LED。
GPIO_ResetBits(GPIOA, GPIO_Pin_5); # PA5输出低电平

③ GPIO_WriteBit()

  • 功能:动态设置单个引脚电平(可替代SetBits/ResetBits)。
  • 示例:根据条件设置电平。
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (condition ? Bit_SET : Bit_RESET));

(4) 输入读取类函数:

① GPIO_ReadInputDataBit()

  • 功能:读取单个引脚的电平状态(输入模式时使用)。
  • 示例:检测按键按下。
if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 0) {# 引脚PA0为低电平(按键按下)
}

② GPIO_ReadOutputDataBit()

  • 功能:读取输出寄存器的状态(输出模式时使用)。
  • 示例:检测当前输出值。
BitStatus pinState = GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_5);

(5) 必须掌握的模式宏定义:

GPIO_Mode_AIN 是模拟输入。

GPIO_Mode_IN_FLOATING 是浮空输入。

GPIO_Mode_IPD 是下拉输入。

GPIO_Mode_IPU 是上拉输入。

GPIO_Mode_Out_OD 是开漏输出。

GPIO_Mode_Out_PP 是推挽输出。

GPIO_Mode_AF_OD 是复用开漏。

GPIO_Mode_AF_PP 是复用推挽。

http://www.xdnf.cn/news/1105885.html

相关文章:

  • 鸿蒙系统安全机制全解:安全启动 + 沙箱 + 动态权限实战落地指南
  • 【驱动】移植CH340驱动,设置 udev 规则,解决和 BRLTTY 的冲突
  • Word表格默认格式修改成三线表,一劳永逸,提高生产力!
  • FREERTOS根本不能使用连续接收串口思想
  • P4597 序列 sequence题解
  • 跟着Carl学算法--二叉树【3】
  • 猿人学js逆向比赛第一届第十九题
  • 【每日算法】专题八_分治_归并排序
  • RLHF:人类反馈强化学习 | 对齐AI与人类价值观的核心引擎
  • Windows解决 ping 127.0.0.1 一般故障问题
  • 阿里云服务器,CentOS7.9上安装YApi 接口管理平台
  • Redis概念和基础
  • AI基建还能投多久?高盛:2-3年不是问题,回报窗口才刚开启
  • 学习C++、QT---21(QT中QFile库的QFile读取文件、写入文件的讲解)
  • MySQL内置函数(8)
  • Windows删除文件或者拔出U盘显示正在使用/占用解决办法
  • 必备软件推荐:1、Everything:Windows 文件查找的终极利器
  • CSS和CSS3区别对比
  • [面试] 手写题-插入排序
  • 网络安全第一次作业
  • 史上最详细Java并发多线程(面试必备,一篇足矣)
  • 视频翻译用什么软件?这里有5个高效推荐
  • 论迹不论心
  • 【天坑记录】cursor jsx文件保存时错误格式化了
  • 并发编程
  • C#元组:从基础到实战的全方位解析
  • 【C++类】
  • 速盾:高防CDN和普通CDN的区别大吗?
  • 【MySQL】———— 索引
  • 数据分析师如何构建自己的底层逻辑?