嵌入式八股文之 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.pswp.cn/diannao/90704.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)

前置博客:Ubuntu-Server 22.04.4 详细安装图文教程 wget命令在windows终端下不能使用的原因及解决办法 在 Ubuntu 22.04 LTS 上离线安装 Docker 手把手教你在Win11下安装docker Umi-OCR 安装docker时报错:workstation服务启动报错。错误1075&#…

力扣242.有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入: s "anagram", t "nagaram" 输出: true示例 2:输入: s "rat", t "car" 输出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai实现模拟面试小工具二:后端项目搭建

本节介绍本项目后端项目的开发工具及基础项目的搭建&#xff0c;包括开发工具介绍及后端项目的创建和依赖框架的引入及对应配置。 源码下载&#xff1a; 点击下载 讲解视频&#xff1a; UniappSpringbootKimi实现模拟面试小程序-Springboot项目创建一&#xff0e;开发工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ • MobaXterm Personal Edition v23.2 • ││…

QT 秘钥生成工具

该项目是注册机和验证机项目&#xff0c;分别是密钥生成工具&#xff0c;和密钥验证demo,可以识别电脑唯一标识码。#include "frmmain.h" #include "ui_frmmain.h" #include "qmessagebox.h" #include "qfile.h" #pragma execution_ch…

PyTorch神经网络训练全流程详解:从线性层到参数优化

目录 一、神经网络训练的核心组件 二、代码逐行解析与知识点 三、核心组件详解 3.1 线性层(nn.Linear) 3.2 损失函数(nn.MSELoss) 3.3 优化器(optim.SGD) 四、训练流程详解 五、实际应用建议 六、完整训练循环示例 七、总结 在深度学习实践中&#xff0c;理解神经网络…

从代码学习深度学习 - 针对序列级和词元级应用微调BERT PyTorch版

文章目录 前言针对序列级和词元级应用微调BERT单文本分类文本对分类或回归文本标注问答总结前言 在自然语言处理(NLP)的广阔天地里,预训练模型(Pre-trained Models)的出现无疑是一场革命。它们如同站在巨人肩膀上的探索者,使得我们能够利用在大规模文本语料上学到的丰富…

学习笔记丨卷积神经网络(CNN):原理剖析与多领域Github应用

本文深入剖析了卷积神经网络&#xff08;CNN&#xff09;的核心原理&#xff0c;并探讨其在计算机视觉、图像处理及信号处理等领域的广泛应用。下面就是本篇博客的全部内容&#xff01;&#xff08;内附相关GitHub数据库链接&#xff09; 目录 一、什么是CNN&#xff1f; 二、…

cnpm exec v.s. npx

1. 核心定位与设计目标 npx (Node Package Executor): 定位: Node.js 内置工具&#xff08;npm 5.2 起捆绑&#xff09;&#xff0c;核心目标是便捷地执行本地或远程 npm 包中的命令&#xff0c;无需全局安装。核心价值: 避免全局污染&#xff1a; 临时使用某个 CLI 工具&#…

我花10个小时,写出了小白也能看懂的数仓搭建方案

目录 一、什么是数据仓库 1.面向主题 2.集成 3.相对稳定 4.反映历史变化 二、数仓搭建的优势 1.性能 2.成本 3.效率 4.质量 三、数仓搭建要考虑的角度 1.需求 2.技术路径 3.数据路径 4.BI应用路径 四、如何进行数仓搭建 1.ODS层 2.DW层 3.DM层 五、写在最后…

OBB旋转框检测配置与训练全流程(基于 DOTA8 数据集)

&#x1f680; YOLO交通标志识别实战&#xff08;五&#xff09;&#xff1a;OBB旋转框检测配置与训练全流程&#xff08;基于 DOTA8 数据集&#xff09; 在专栏前面四篇里&#xff0c;我们完成了&#xff1a; ✅ Kaggle交通标志数据集下载并重组标准YOLO格式 ✅ 训练/验证集拆…

uniapp制作一个视频播放页面

1.产品展示2.页面功能(1)点击上方按钮实现页面跳转&#xff1b;(2)点击相关视频实现视频播放。3.uniapp代码<template><view class"container"><!-- 顶部分类文字 --><view class"categories"><navigator class"category-…

8.卷积神经网络基础

8.1 卷积核计算 import torch from torch import nn import matplotlib.pyplot as plt def corr2d(X,k):#计算二维互相关运算h,wk.shape#卷积核的长和宽Ytorch.zeros((X.shape[0]-h1,X.shape[1]-w1))#创建(X-H1,X-W1)的全零矩阵for i in range(Y.shape[0]):for j in range(Y.s…

【每天一个知识点】子空间聚类(Subspace Clustering)

“子空间聚类&#xff08;Subspace Clustering&#xff09;”是一种面向高维数据分析的聚类方法&#xff0c;它通过在数据的低维子空间中寻找簇结构&#xff0c;解决传统聚类在高维空间中“维度诅咒”带来的问题。子空间聚类简介在高维数据分析任务中&#xff0c;如基因表达、图…

《汇编语言:基于X86处理器》第7章 整数运算(2)

本章将介绍汇编语言最大的优势之一:基本的二进制移位和循环移位技术。实际上&#xff0c;位操作是计算机图形学、数据加密和硬件控制的固有部分。实现位操作的指令是功能强大的工具&#xff0c;但是高级语言只能实现其中的一部分&#xff0c;并且由于高级语言要求与平台无关&am…

JVM故障处理与类加载全解析

1、故障处理工具基础故障处理工具jps&#xff1a;可以列出正在运行的虚拟机进程&#xff0c;并显示虚拟机执行主类&#xff08;Main Class&#xff0c;main()函数所在的类&#xff09;名称以及这些进程的本地虚拟机唯一ID&#xff08;LVMID&#xff0c;Local Virtual Machine I…

Python 第三方库的安装与卸载全指南

在 Python 开发中&#xff0c;第三方库是提升效率的重要工具。无论是数据分析、Web 开发还是人工智能领域&#xff0c;都离不开丰富的第三方资源。本文将详细介绍 Python 第三方库的安装与卸载方法&#xff0c;帮助开发者轻松管理依赖环境。 一、第三方库安装方法 1. pip 工具…

RabbitMQ 高级特性之消息分发

1. 为什么要消息分发当 broker 拥有多个消费者时&#xff0c;就会将消息分发给不同的消费者&#xff0c;消费者之间的消息不会重复&#xff0c;RabbitMQ 默认的消息分发机制是轮询&#xff0c;但会无论消费者是否发送了 ack&#xff0c;broker 都会继续发送消息至消费者&#x…

Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源

Linux操作系统从入门到实战&#xff1a;怎么查看&#xff0c;删除&#xff0c;更新本地的软件镜像源前言一、 查看当前镜像源二、删除当前镜像源三、更新镜像源四、验证前言 我的Linux版本是CentOS 9 stream本篇博客我们来讲解怎么查看&#xff0c;删除&#xff0c;更新国内本…

两台电脑通过网线直连形成局域网,共享一台wifi网络实现上网

文章目录一、背景二、实现方式1、电脑A&#xff08;主&#xff09;2、电脑B3、防火墙4、验证三、踩坑1、有时候B上不了网一、背景 两台windows电脑A和B&#xff0c;想通过**微软无界鼠标&#xff08;Mouse without Borders&#xff09;**实现一套键盘鼠标控制两台电脑&#xf…