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,发现也开…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...