STM32GPIO
目录
- GPIO基本结构
- GPIO位结构
- 输入部分
- 输出部分
- 输出模式
- GPIO模式
- 浮空/上拉/下拉
- 模拟输入
- 开漏和推挽
- 复用开漏/复用推挽
GPIO基本结构

GPIO是挂载在APB2总线上的外设。GPIO结构中的寄存器分为输入寄存器和输出寄存器,APB2总线通过输出寄存器向引脚发送数据,通过输入寄存器读取引脚的高低电平。STM32是32位的单片机,所以寄存器是32位的,每一位对应一个pin,但是GPIO端口只有16位,所以寄存器只有低16位寄存器有效,高16位无效。驱动器是负责提高驱动能力的。
GPIO位结构

上图是一个IO口的结构。1号是寄存器,2号是驱动器,3号就是外部的引脚。从图中还可以看到输入部分和输出部分。
IO口上的两个二极管是保护二极管,上方的主要防止电压过高,下放的主要防止电压负脉冲。当电压过低时,也可以防止从内部汲取电流。IO口引脚的电压是相对VSS的电压。
输入部分
IO口再往里面走,输入部分就到了两个电阻,一个上拉电阻,一个下拉电阻。通过程序控制开关的关闭还是打开来控制上拉输入还是下拉输入,两个都断开就是浮空输入。这两个电阻的阻值比较大,属于弱上拉和弱下拉的模式,目的是为了不影响输入的电平。
在往后走实际上是一个斯密特触发器,文档中翻译错误。
斯密特触发器的作用是对波形进行整形,因为IO口的输入电压是外界给的电压,难以避免的会出现失真,斯密特触发器就可以进行整形,当高于阈值上限的时候输出高,往后只要不是低于阈值下限就一直输出高。当低于阈值下限的时候输出低,只要不高于阈值上限就一直输出低。这样便可以存在一个抖动范围而不影响信号的输入。
然后就可以用程序读取寄存器的某一位数据就可以知道输入的电平了。
在上面是两个接到需要读取端口的片上外设的线,模拟输入连接到ADC上,因为ADC需要接收模拟量,所以接在触发器前面。另一个是复用功能输入,连接到其他需要读取端口的外设上,如串口的输入引脚等。
输出部分
输出可以由输出数据寄存器或片上外设控制。两种控制方式通过数据选择器接到输出控制那里。如果通过输出数据寄存器控制就可以通过写这个数据寄存器的某一位就可以操作对应的IO口。
左边的位设置/清楚寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其他位。因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写。我们只能通过按位与或者按位或的方式更改某一位。最后整体更改后在写回去。但是这种方法比较麻烦,效率不高。
所以就可以通过这个寄存器,在位设置的寄存器某一位写 1 即可。剩下不需要的写0,它的内部会有电路,自动将输出数据寄存器中的对应位置1,其他位不变。
如果要在某一位写0,就在位清楚寄存器写0,其他位置 1 ,这样就对某一位写0了。
还有第三种方式,通过读取STM32中的“位带”区域。
输出模式
输出控制向右就是输出模式选择。
输出总共由三种模式,推挽,开漏或关闭。
推挽输出:
推挽输出模式下N-MOS和P-MOS均有效,输出为1时上管导通下管断开,此时直接接到VDD,输出高电平。输出为0时,下管导通上官断开,此时直接接到VSS,输出低电平。
这种模式下高低电平均有较强的驱动能力,所以推挽输出模式也叫强推输出模式。 在这种模式下,STM32对IO口拥有绝对的控制权。高低电平都由STM32说了算。
开漏输出:
在开漏路输出模式下。P-MOS管是无效的,只有N-MOS在工作。数据寄存器为 1 时下管断开,这时输出相当于断开,也就是高阻模式。数据寄存器为0时,下管导通,输出直接接到VSS,也就是输出低电平。这种模式下只有低电平有驱动能力,高电平是没有驱动能力的。开漏模式,可以作为通信协议的驱动方式。比如I2C通信的引脚就是使用的开漏模式。在多机通信的情况下,这个模式可以避免各个设备的相互干扰。开漏模式还可以用于输出5V的电平信号。比如在io口外接一个上拉电阻到5V的电源。此时当输出低电平时,由内部的N -MOS直接接VSS。当输出高电平时,由外部的上拉电阻拉高至5V。这样就可以输出5V的电平信号,用于兼容一些5V电平的设备。
关闭模式:
关闭模式下,两个mos管都无效,端口的电平由外部信号来控制。
GPIO模式
通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式

在使用浮空输入的时候,端口一定要街接上一个驱动源,避免浮空的情况。
浮空/上拉/下拉

我们可以看到在输入模式下输出驱动器是无效的。端口只能输入,不能输出。
模拟输入

模拟输入模式下,输出驱动器也是断开的。此时斯密特触发器是关着的。所以当我们使用ADC的时候,只需要将端口设置为模拟输入就行了。
开漏和推挽

此时输出是由输出寄存器控制的。这个P-MOS如果无效就是开漏输出。如果P-MOS和N-MOS都有效,就是推挽输出。
另外我们还可以看到在输出模式下,输入模式也是有效的。因为一个端口只能有一个输出,但是此时读取电平并不影响输出。
复用开漏/复用推挽

复用开漏/复用推挽与开漏/推挽的区别就是引脚的控制权转移到了片上外设,由片上外设来控制。
此时在输入部分片上外设也可以读取引脚的电平。同时普通的输入也是有效的,顺便接收一下电平信号。
相关文章:
STM32GPIO
目录 GPIO基本结构GPIO位结构输入部分输出部分 输出模式GPIO模式浮空/上拉/下拉模拟输入开漏和推挽复用开漏/复用推挽 GPIO基本结构 GPIO是挂载在APB2总线上的外设。GPIO结构中的寄存器分为输入寄存器和输出寄存器,APB2总线通过输出寄存器向引脚发送数据,…...
MyBatis拦截器终极指南:从原理到企业级实战
在本篇文章中,我们将深入了解如何编写一个 MyBatis 拦截器,并通过一个示例来展示如何在执行数据库操作(如插入或更新)时,自动填充某些字段(例如 createdBy 和 updatedBy)信息。本文将详细讲解拦…...
SpringBoot启动失败之application.yml缩进没写好
修改前: spring前面空格了 报错输出:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class Action: Consider the follow…...
【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter17-事件
十七、事件 事件 JavaScript 与 HTML 的交互是通过事件实现的,事件代表文档或浏览器窗口中某个有意义的时刻。可以使用仅在事件发生时执行的监听器(也叫处理程序)订阅事件。在传统软件工程领域,这个模型叫“观察者模式”ÿ…...
鸿蒙开发:V2版本装饰器之@Monitor装饰器
前言 本文代码案例基于Api13。 随着官方的迭代,在新的Api中,对于新的应用开发,官方已经建议直接使用V2所属的装饰器进行开发了,所以,能上手V2的尽量上手V2吧,毕竟,V2是V1的增强版本,…...
51单片机-外部中断
以外部中断0为例: 主程序中需要有以下代码: EA1; //打开总中断开关 EX01; //开外部中断0 IT00/1; 设置外部中断的触发方式 P3.2\P3.3为外部中断接口,通过控制P3.2口按键按下实现LED灯反转点亮 #include "reg52.h"typed…...
UE C++ UObject 功能的初步总结(结合官方文档)
一. Uboject的官方文档的个人理解 Objects in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community 目录在此 1.垃圾回收:上篇文章简单介绍过,UObject的创建和回收。本身是很复杂的功能,后续会接着单项深入分析。 2.引用更新 1. 反射:之前…...
DeepSeek和ChatGPT的全面对比
一、模型基础架构对比(2023技术版本) 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...
Spring Boot Actuator 监控✨
Spring Boot Actuator 是 Spring Boot 提供的一个强大的监控和管理工具,它可以帮助你深入了解和监控你的应用程序的运行状态。通过 Actuator,你可以获取应用程序的健康状况、内存使用情况、线程信息、HTTP 请求跟踪等。🚀 核心知识点 &#…...
构建高效 Python Web 应用:框架与服务器的选择及实践
构建高效 Python Web 应用:框架与服务器的选择及实践 flyfish 从选择合适的 Web 框架(如 Flask 和 FastAPI)到部署时选用适当的 Web 服务器(如 Waitress、Gunicorn、uWSGI 和 Uvicorn)的全过程。它不仅介绍了各个框架…...
LED灯闪烁实验:Simulink应用层开发
文章目录 1 阶段目标2 开发过程2.1 模型搭建2.2 模型仿真2.3 数据字典配置2.4 代码生成3 总结1 阶段目标 本文是《LED灯闪烁实验》的第三部分,会通过图文结合的方式,手把手带读者操作Simulink工具进行LED灯闪烁的应用层开发。 本章的开发可分解为如下若干过程: 方波输出建…...
在做题中学习(89):螺旋矩阵
解法:模拟 思路:创建ret数组,用变量标记原矩阵的行数和列数,遍历一个元素就push_back进ret数组,每次遍历完一行或一列,相应行/列数--,进行顺时针螺旋遍历到为0即可。 细节:要有边界…...
使用EasyExcel和多线程实现高效数据导出
使用EasyExcel和多线程实现高效数据导出 1. 概述 在企业级应用中,数据导出是一个常见的需求。为了提高导出效率,尤其是在处理大量数据时,我们可以结合使用EasyExcel库和多线程技术。本文将详细介绍如何通过EasyExcel和多线程技术实现高…...
rabbitmq五种模式的实现——springboot
rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址:https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成 (一)Spring Boot 集成 RabbitMQ 概述 Spring Boot 提供了对 RabbitMQ 的自…...
每日学习Java之一万个为什么
9.Class <?> class1 Myclass.class 为什么要有通配符?传给谁用的? 首先,这里的class特指某个对象在JVM中的元数据集合。 有普通、接口、数组、基本类型、 void 类型、局部类、匿名类、枚举、注解 1.类型安全:通配符允许…...
寒假学习总结
整个寒假都走在数据结构与算法的路上,深入学习了其中多个板块,刷了一些与之对应的题目,下面来一期总结(c) (emmm,主播在寒假试着去学习了几大语言的语法基础(丢丢) 如Ja…...
Java Web开发实战与项目——用户认证与授权模块开发
Web应用中,用户认证与授权是至关重要的功能,确保只有合法用户才能访问受保护的资源。Spring Security作为一个强大的安全框架,支持多种认证与授权方式。在本章节中,我们将深入探讨三种常见的用户认证与授权方案:基于To…...
力扣每日一题【算法学习day.129】
前言 ###我做这类文章一个重要的目的还是记录自己的学习过程,我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!! 习题 1.数组列表中的最大距离 题目链接…...
uni-app发起网络请求的三种方式
uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header:设置请求的 header,header 中不能设置 Referer; method:请求方法; timeout:超时时间,单位 ms&a…...
字节火山云DeepSeek接入教程,支持联网,速度超快。
大家好,我是苍何。 在使用 DeepSeek 官网,实在是卡的我差点学猪叫,于是我一直在寻找替代方案。 要求就 2:满血,速度快。(当然能联网更好)。 我也一度使用了如硅基流动 API,发现也开…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
