STM32基础篇:GPIO
GPIO简介
GPIO:即General Purpose Input/Output,通用目的输入/输出。就是一种片上外设(内部模块)。
对于STM32的芯片来说,周围有一圈引脚,有时需要对引脚进行读写(读:从外部输入一个信号,连接到IO引脚上,我们去读取输入电平;写:通过IO引脚向外输出电平),但CPU本身不能直接读写IO引脚,它必须通过GPIO帮它去执行这个功能。
每一组IO引脚对应一个GPIO,例如:PA0~15,对应GPIOA;PB0~15,对应GPIOB。
GPIO的寄存器组
配置寄存器GPIOx_CR
功能:用来设置IO引脚的参数,共16份,每一份(4个比特位)用来设置单个IO引脚的参数。
| CR15 | CR14 | CR13 | CR12 |
| CR11 | CR10 | CR9 | CR8 |
| CR7 | CR6 | CR5 | CR4 |
| CR3 | CR2 | CR1 | CR0 |
比如CR0这4个比特位,它负责设置Px0这个引脚的参数(x=A、B、...G)。
输入数据寄存器GPIOx_IDR
这个寄存器共有16个比特位,即对应了一组GPIO的16个引脚。
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| IDR 15 | IDR 14 | IDR 13 | IDR 12 | IDR 11 | IDR 10 | IDR 9 | IDR 8 | IDR 7 | IDR 6 | IDR 5 | IDR 4 | IDR 3 | IDR 2 | IDR 1 | IDR 0 |
功能:读取外部输入电平。
例如:IDR0比特位对应Px0引脚,负责读取这个引脚上外部输入信号的电平。如果IDR0为0,则外部输入为低电平;如果IDR0为1,则外部输入为高电平。所以我们可以通过读取输入数据寄存器的值,来判断外部输入信号的电平。
输出数据寄存器GPIOx_ODR
功能:控制IO引脚输出电平
同样是一个16位寄存器,每一位对应一个IO引脚。例如ODR0对应Px0引脚,我们向ODR0写入一个0,则Px0引脚输出一个低电平。我们通过向这个输入数据寄存器写入一个值,来控制IO引脚的输出电平。
GPIO的8种工作模式
为什么会有8种工作模式
STM32的功能比较复杂,需要芯片周围这一圈的IO引脚能够适应不同的工作场景。为了适应不同的工作场景,IO引脚就需要不同工作方式。
对于同一个IO引脚,它既可以作为输入,也可以作为输出;既可以是通用,也可以是复用。从不同角度组合后,具体8个模式如下:
| 输出 | 输入 |
| 输出推挽 | 输入上拉 |
| 输出开漏 | 输入下拉 |
| 复用推挽 | 输入浮空 |
| 复用开漏 | 模拟模式 |
工作模式分类分析
分类标准1:输入与输出;
分类标准2:通用与复用;
分类标准3:推挽与输出;
分类标准4:上拉、下拉和浮空;
分类标准1:输入与输出
输入:通过IO引脚读取外部输入电平的高低;
输出:通过IO引脚向外输出高低电平
分类标准2:通用与复用

通用:CPU直接控制GPIO进行编程;
复用:CPU通过其他的片上外设,去间接控制GPIO引脚的输出;
对于输入模式没有通用和复用之分,对于CPU和片上外设,它们读取GPIO的输入值的时候,多个对象之间同时读取也不会产生干扰。
分类标准3:推挽和开漏

对于开漏:PMOS管始终断开(可去掉),当输入为1时,为高阻态;输入为0时,为低电平。
分类标准4:上拉、下拉和浮空
针对输入模式,分为上拉、下拉和浮空三种模式。对于IO引脚而言,工作在输入模式下的时候,相当于测量外部电压,所以其内阻为无穷大。
对于某个引脚,当外部为高电平时引脚为高电平,外部为低电平时引脚为低电平。但当外部输入信号断开后,此时IO引脚悬空,会在空间中接收电磁波,IO引脚上的信号会随着电磁波抖动,制造一些杂乱无章的信号。此时为输入浮空模式。
因此,我们可以给IO引脚添加上拉电阻或者加一个下拉电阻。(当IO引脚悬空的时候,给一个默认的电平)
模拟模式
对于C8T6芯片,内部有一个ADC模块,此模块会采集外部的输入信号(通过IO口)。ADC模块有10个通道,故需要10个引脚进行采集。当我们使用ADC的时候,就需要将对应的IO引脚来设置成模拟模式。
IO的最大输出速度
最大输出速度:IO允许输出电平的最大切换频率。(仅对于输出模式)
IO引脚的切换频率不能无限大,因为IO引脚的最大切换速度受限于引脚的电平切换的上升时间和下降时间,以及有效输出时间。
对于STM32,其IO引脚最大输出速度有3档可选,考虑功耗,实际应用通常选取能满足要求的最小值。如下所示:

附GPIO内部结构图:

GPIO的标准库编程接口
初始化
void GPIO_Init(GPIO_TypeDef*GPIOx,GPIO_TypeDef*GPIO_InitStruct)
//用于IO引脚的初始化
此函数用于IO引脚的初始化,实际上就是配置CR寄存器里的比特位。
读IDR
UINT8_t GPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//读取IDR的一个比特位UINT8_t GPIO_ReadInputData(GPIO_TypeDef*GPIOx)
//读取整个IDR寄存器
读ODR
UINT8_t GPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//读取ODR的一个比特位UINT8_t GPIO_ReadOutputData(GPIO_TypeDef*GPIOx)
//读取整个ODR寄存器
写ODR
void GPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//将ODR的某一位置1void GPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin)
//将ODR的某一位置0void GPIO_WriteBits(GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin,BitAction BitVal)
//将ODR的某个比特位写0或写1void GPIO_Write(GPIO_TypeDef*GPIOx,uint16_t PortVal)
//写ODR寄存器相关文章:
STM32基础篇:GPIO
GPIO简介 GPIO:即General Purpose Input/Output,通用目的输入/输出。就是一种片上外设(内部模块)。 对于STM32的芯片来说,周围有一圈引脚,有时需要对引脚进行读写(读:从外部输入一…...
HTTPS 发送请求出现TLS握手失败
最近在工作中,调外部接口,发现在clientHello步骤报错,服务端没有返回serverHello。 从网上找了写方法,都没有解决; 在idea的vm options加上参数: -Djavax.net.debugSSL,handshake 把SSL和handshake的日…...
数字化精益生产系统--IFS财务管理系统
IFS财务管理系统是一款功能丰富、高效且灵活的企业财务管理软件,广泛应用于多个行业和不同规模的企业中。以下是对IFS财务管理系统的功能设计:...
基于SpringBoot的校园台球厅人员与设备管理系统
本系统是要设计一个校园台球厅人员与设备管理系统,这个系统能够满足校园台球厅人员与设备的管理及用户的校园台球厅人员与设备管理功能。系统的主要功能包括首页、个人中心、用户管理、会员账号管理、会员充值管理、球桌信息管理、会员预约管理、普通预约管理、留言…...
免杀笔记 ---> Session0--DLL注入
刚更新完上一篇,于是我们就马不停蹄的去跟新下一篇!! Session0注入 :: 各位看官如果觉得还不错的可以给博主点个赞💕💕 这次,我把这个脚本直接传到Github上了 喜欢的师傅点个Star噢…...
如何做好IT类的技术面试?
我们在找工作时,需要结合自己的现状,针对意向企业做好充分准备。作为程序员,你有哪些面试IT技术岗的技巧? 方向一:分享你面试IT公司的小技巧 我分享一些基于广泛观察和用户反馈的面试IT公司的小技巧: 技术准…...
A7 配置方式Master SPI如何更改位宽
在 FPGA 完成自初始化后,INIT 释放,FPGA 对模式引脚 (M[2:0]) 进行采样,以确定使用哪种配置模式。当模式引脚 M[2:0] 001 时,FPGA 开始以大约 3 MHz 的频率在 CCLK 上输出时钟。随后,FCS_B 驱动为低电平,紧…...
linux kthread任务管理
目录 一、linux 创建内核线程1.1 kthread_create1.2 kthread_create_worker kthread_queue_work 二、设置线程优先级和调度策略2.1 sched_setscheduler2.2 调度策略 一、linux 创建内核线程 1.1 kthread_create 在 linux 中,可以使用 kthread_create 接口创建内核…...
第一节 网络安全概述
一.网络空间安全 网络空间:一个由信息基础设施组成相互依赖的网络。 ---- 海陆空天(大海、陆 地、天空、航天) 通信保密阶段 ---- 计算机安全 ----- 信息系统安全 ----- 网络空间安全 计算机安全:开始秉持着“严于律己&#x…...
星光云VR全景系统源码
星光云VR全景系统源码 体验地址请查看...
spdlog一个非常好用的C++日志库(七): 源码分析之异常类spdlog_ex
目录 1.自定义异常类spdlog_ex 1.1.通用异常 1.2.系统调用异常 1.3.what()函数 2.异常的使用 2.1.抛出异常 2.2.控制异常使用 1.自定义异常类spdlog_ex 标准库异常类(std::exception)系列,能满足大多数使用异常的场景,但对…...
从一次 SQL 查询的全过程了解 DolphinDB 线程模型
1. 前言 DolphinDB 的线程模型较为复杂,写入与查询分布式表都可能需要多个类型的线程。通过了解 SQL 查询的全过程,可以帮助我们了解 DolphinDB 的线程模型,掌握 DolpinDB 的配置,以及优化系统性能的方法。 本教程以一个分布式 …...
Vue3.js“非原始值”响应式实现基本原理笔记(二)
如果您觉得这篇文章有帮助的话!给个点赞和评论支持下吧,感谢~ 作者:前端小王hs 阿里云社区博客专家/清华大学出版社签约作者/csdn百万访问前端博主/B站千粉前端up主 此篇文章是博主于2022年学习《Vue.js设计与实现》时的笔记整理而来 书籍&a…...
论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型
论文全称:PRCA: Fitting Black-Box Large Language Models for Retrieval Question Answering via Pluggable Reward-Driven Contextual Adapter 核心问题:如何在检索增强式问答(ReQA)任务中,利用大型语言模型…...
网络状态的智能感知:WebKit 支持 Network Information API 深度解析
网络状态的智能感知:WebKit 支持 Network Information API 深度解析 在现代 Web 应用中,理解用户的网络连接状态对于提供适应性体验至关重要。Network Information API,一个新兴的 Web API,允许 Web 应用访问设备的网络信息&…...
Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示
1.provide和inject相较于父子传递的不同在于provide,inject可以用于跨层级通信(通俗易懂的讲就是可以实现爷孙之间的直接信息传递)。 1.跨层级传递数据 1.在顶层组件通过provide函数提供数据 2.底层组件通过inject函数获取数据 演示一:跨…...
Transformer自注意力机制(Self-Attention)模型
上一篇我们介绍了transform专题一:Seq2seq model,也知道了transfrom属于seq2seq模型,这一排篇咱们接着介绍另外几种seq2seq架构的模型。)RNN(循环神经网络)CNN(卷积神经网络)&…...
【计算机体系结构】缓存的false sharing
在介绍缓存的false sharing之前,本文先介绍一下多核系统中缓存一致性是如何维护的。 目前主流的多核系统中的缓存一致性协议是MESI协议及其衍生协议。 MESI协议 MESI协议的4种状态 MESI协议有4种状态。MESI是4种状态的首字母缩写,缓存行的4种状态分别…...
Ubuntu24.04 Isaacgym的安装
官方论坛 rl-接口 教程1 教程2 教程3 1.下载压缩包 link 2. 解压 tar -xvf IsaacGym_Preview_4_Package.tar.gz核心教程在 isaacgym/docs/install.html下 3. 从源码安装 Ubuntu24.04还需首先进入虚拟环境 python -m venv myenv # 创建虚拟环境,已有可跳过…...
docker 设置代理,通过代理服务器拉取镜像
docker 拉取目标镜像需要通过代理服务器进行时,可以通过为 docker 配置全局代理来实现。 注:Linux 上通过临时命令 export HTTP_PROXY 设置的代理,对 curl 这些有用,但是对 docker pull 不起作用。 示例 假设您的代理服务器地址是…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
