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,发现也开…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
