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,发现也开…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
