【STM32】GPIO输出

news2024/11/19 12:32:49

1 GPIO简介

(1)GPIO(General Purpose Input Output)通用输入输出口

(2)可配置为8种输入输出模式

(3)引脚电平:0V~3.3V,部分引脚可容忍5V(可以输入5V,但是输出还是3.3V)

I/O口电平带FT是可以接受输入5V

(4)输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等

(5)输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

1.1 GPIO的基本结构

在STMB2中,所有的GPIO都是挂载在APB2外设总线上的。其中GPIO外设的名称是按照GPIOA、GPIOB、GPIOC等等这样来命名的;每个GPIO外设。总共有16的引脚。编号是从0到15(PA0,PA1,...,PA15)。

在每个GPIO模块肉。主要包含了寄存器驱动器这些东西。

寄存器就是一段特殊的存储器。内核可以通过APB2总线对寄存器进行读写,这样就完成输出电平和读取电平的功能了。寄存器的每一位对应一个引脚;其中输出寄存器写1。对应的引脚就会输出高电平;写0,就输出低电平。输入寄存器读取为1,就证明对应的端口目前是高电平;读取为0,就是低电平。因为STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但这个端口只有16位。所以这个寄存器只有低16位对应的端口,高16位是没有用到的。

上一节电灯实验使用的是gpioc端回配置高寄存器控制板子上pc13的输出模式

驱动器是用来增加信号的驱动能力的,寄存器只负责存储数据,如果要进行点灯这样的操作的话,还是需要驱动器来负责增大驱动能力。

1.2 GPIO位结构

具体的1

具体2:上面输入,下面输出

先看输入部分:

IO引脚接了两个保护二极管,这个是对输入电压进行限幅的;上面VDD接3.3V,下面VSS接0V;

如果输入电压大于3.3V,上面的二极管就会导通,输入电压产生的电流就会直接流入VDD,而不会流入电路内部,这样可以避兔过高的电压对内部这些电路产生伤害;

如果输入电压小于0V(这个电压是相对于VSS的电压。所以是可以有负电压的),那这时下方这个二极管就会导通,电流会从VSS(引脚?)直接流出去,而不会从内部电路汲取电流,也是可以保护内部电路的。

如果输入电压在0~3.3V之间。那两个二极管均不会导通。

这时候电路到了上拉电阻和下拉电阻处。

这个开关是可以通过程序进行配置的:

如果上面导通、下面断开。就是上拉输入模武(默认为高电平的输入模式);

如果下面导通、上面断开。就是下拉输入模式(默认为低电平的输入模式);

如果两个都断开,就是浮空输入模式;

接下来是肖特基触发器(施密特触发器),这个施密特触发器的作用就是对输入电压进行整形的。它的执行逻辑是:如果输入电压大于某阈值,输出就会瞬间开为高电平;如果输入电压小于某─阈值,输出就会瞬闻降为低电平。

如果输入电压是上图这样的;定义两个阈值,比阈值1大输出高电平;比阈值2小输出低电平,则输出电压变为:

接下来经过施密特触发器整形的波形就可以直接写入输入数据寄存器了,然后读取就是了。


最后上面这述有两路线路。这些就是连接到片上外设的一些端口。

其中有模拟输入,这个是连接到ADC上的,因为ADC需要接收模拟量,所以这根线是接到施密特触发器前面的;

另一个是复用功能输入,这个是连接到其他需要读取端口的外设上的,比如串口的输入引脚等,这根线接收的是数字量,所以在施密特触发器后面。

接下来看输出部分:

数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过这个数据选择器接到了输出控制部分。如果选择通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了。

左边的位设置/清除寄存器,这个可以用来单独操作输出数据寄存器的某一位,而不影响其它位。因为这个输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以如果想单独控制其中某端口而不影响其他端口的话,就需要一些特殊的操作方式;

(1)先读出这个寄存器。然后用按位与和按位或的方式更改某位,最后再将更改后的数据写回去,在C语言中就是&=和|=的操作。(麻烦,效率不高)

(2)通过设置这个位设置和位清除寄存器,如果我们要对某1位进行置1的操作,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0,这样它内部就会有电路自动将输出数据寄存器中对应应置为1,而剩下写0的位则保持不变。如果想对某一位进行清0的操作。就在位清除寄存器的对应位写1即可。

(3)读写STM32中的“位带”区域。在STM32中,专门分配的有一段地址区域,这段地址映射了RAM和外设寄存器所有的位,读写即可。

然后输出控制就接到了两个mos管

MOS管是一种电子开关,信号控制开关的导通和关闭,开关负责将IO口接到VDD或者VSS。

在这里回以选择推挽、开漏或关闭三种输出方式。

(1)在推挽输出模式下,P-MOS和N-MOS均有效。数据寄存器为1时。上管导通,下管断开。输出直接接到VDD,就是输出高电平;数据寄存器为0时。上管断开,下管导通。输出直接接到VSS,就是输出低电平。这种模式下。高低电平均有较强的驱动能力,所以推挽输出模武也可以叫强推输出模式。在推挽输出模式下。STM32对IO口具有绝对的控制权,高低电平都由STM32说的算。

(2)在开漏输出模式下,这个P-MOS是兔效的,只有N-MOS在工作。数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式;数据寄存器为0时。下管导通,输出直接接到VSS,也就是输出低电平。这种模式下。只有低电平有驱动能为,高电平是没有驱动能力的。可以作为通信协议的驱动方式,比如I2C通信的引脚,在多机通信的情况下,这个模式可以避免各个设备之间的相互干扰。另外开漏模式还可以用于输出5V的电平信号。

(3)剩下的一种状态就是关闭。这个是当引脚配置为输入模式的时候,这两个MOS管都无效,也就是输出关闭,端口的电平由外部信导来控制,

1.3 GPIO的模式

通过配置GPIO的端口配置寄存器,端口可以配置成以下8种模式

模式名称

性质

特征

浮空输入

数字输入

可读取引脚电平,若引脚悬空,则电平不确定

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,悬空时默认高电平

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,悬空时默认低电平

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

开漏输出

数字输出

可输出引脚电平,高电平为高阻态(无驱动能力),低电平接VSS

推挽输出

数字输出

可输出引脚电平,高电平接VDD,低电平接VSS

复用开漏输出

数字输出

由片上外设控制,高电平为高阻态,低电平接VSS

复用推挽输出

数字输出

由片上外设控制,高电平接VDD,低电平接VSS

(1)浮空/上拉/下拉输入

输出驱动器是断开的,端口只能输入而不能输出,

(2)模拟输入

从引脚直接接片上外设,也就是ADC,所以,当我们使用ADC的时候。将引脚配置为模拟输入就行了。

(3)开漏/推挽输出



P-MOS无效就是开漏输出;如果P-MOS和N-MOS都有效,就是推挽输出。

另外还可以看到。在输出模式下,输入模式也是有效的,一个端口只能有一个输出,但是可以有多个输入。

(4)复用开漏/推挽输出

和普通的开漏/推挽输出差不多。

1.4 参考手册GPIO

(1)GPIO配置寄存器。

每一个端口的模式由4位进行配置,16位寄存器就需要64位,所以配置寄存器有两个,一个低寄存器,一个高寄存器


  

(2)端口输入数据寄存器

对应这个

低16位对应16个引脚,高16位没有使用。

(3)端口输出数据寄存器

对应这个

同样,低16位对应16个引脚,高16位没有使用。

(4)端口位设置/清除寄存器

对应这个

这个寄存器的高16位是进行位清除的,低16位是进行位设置的。

(5)端口位清除寄存器

这个寄存器的低16位和端口位设置/清除寄存器的高16位是一样的,为了方便操作设置的。

(6)端口配置锁定寄存器

1.5 LED和蜂鸣器简介

LED:发光二极管,正向通电点亮,反向通电不亮

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音

LED硬件电路

低电平触发(一般使用这种)

高电平触发

蜂鸣器硬件电路

PNP型

NPN型

面包板

2 GPIO输出之LED闪烁

2.1 接线图

点亮LED,这里是低电平点亮

3 GPIO输出之LED流水灯
 

4 GPIO输出之蜂鸣器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252461.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql8下载与安装教程

文章目录 1. MySQL下载2. MySQL安装3. 添加环境变量4. 登录mysql 1. MySQL下载 以下两个网址二选一 官网:https://downloads.mysql.com/archives/community/阿里云镜像:https://mirrors.aliyun.com/mysql/?spma2c6h.13651104.d-5173.5.2e535dc8shSjIl…

centos7搭建ftp服务

一、安装 yum -y install vsftpd vi /etc/vsftpd/vsftpd.conf二、编辑配置文件 /etc/vsftpd/vsftpd.conf 内容如下 #是否允许匿名,默认no anonymous_enableNO#这个设定值必须要为YES 时,在/etc/passwd内的账号才能以实体用户的方式登入我们的vsftpd主机…

【Java程序员面试专栏 专业技能篇 】Java SE核心面试指引(四):Java新特性

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第四部分:Java新特性,子节点表示追问或同级提问 Java8新特性…

PyInstaller打包python程序为exe可执行文件

教程千千万,貌似我的window电脑就是打包不了,而且不同电脑的表现都不一致,很是奇怪。 文章目录 1 极简版1.1 生成文件spec详解1.2 是否变成一个exe主文件 2 虚拟环境打包3 其他打包需求3.1 加密打包3.2 Pyinstaller打包多个py文件为一个exe文…

代码随想录算法训练营第四十七天|198. 打家劫舍、213. 打家劫舍II、337. 打家劫舍III

LeetCode 198. 打家劫舍 题目链接:198. 打家劫舍 - 力扣(LeetCode) 第一次打家劫舍,来个简单一些的,无非就是偷了当前这家偷不了下一家,因此dp[n]代表,偷前n家的时候所能偷到的最高金额&#x…

区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测

区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测 目录 区间预测 | Matlab实现BP-KDE的BP神经网络结合核密度估计多变量时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.BP-KDE多变量时间序列区间预测,基于BP神经网络多…

rtsp点播异常出现‘circluar_buffer_size‘ option was set but it is xx

先说现象: 我使用potplay播放器来点播rtsp码流的时候可以点播成功,同事使用vlc和FFplay来点播rtsp码流的时候异常。 排查思路: 1.开始怀疑是oss账号问题,因为ts切片数据是保存在oss中的,我使用的是自己的oss账号,同事使用的是公司…

Kafka 如何实现顺序消息

版本说明 本文所有的讨论均在如下版本进行,其他版本可能会有所不同。 Kafka: 3.6.0Pulsar: 2.9.0RabbitMQ 3.7.8RocketMQ 5.0Go1.21github.com/segmentio/kafka-go v0.4.45 结论先行 Kafka 只能保证单一分区内的顺序消息,无法保证多分区间的顺序消息…

【数据结构】用C语言实现链队列(附完整运行代码)

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.了解项目功能 在本次项目中我们的目标是实现一个链队列: 该链队列使用动态内存分配空间,可以用来存储任意数量的同类型数据. 队列结点(QNode)需要包含两个要素:数据域data,…

2017年4月10日 Go生态洞察:开发者体验工作组介绍

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

我好像发现了车载测试面试成功的秘籍

在汽车行业中,车载测试工程师扮演着至关重要的角色。他们负责确保汽车的各种系统和功能在各种条件下都能正常运行,以确保车辆的安全性、可靠性和性能。如果你梦想成为一名车载测试工程师,那么你可能需要准备好回答一些关键的面试问题。在本文…

web:[ZJCTF 2019]NiZhuanSiWei1

题目 点进题目,网页显示如下,需要代码审计 $_GET["text"]和$_GET["file"]来获取传入的两个参数text和file。使用isset()函数来检查$text变量是否已设置并且不为null。如果设置了并且不为null,则执行下面的逻辑。在下面的…

C++实现十大排序算法

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

Proteus仿真--基于DS1302与数码管设计的可调电子钟

本文主要介绍基于51单片机的DS1302的可调式电子钟实验(完整仿真源文件及代码见文末链接) 仿真图如下 其中数码管显示电子钟时间信息,按键用于调节时间,时间芯片选用DS1302芯片 仿真运行视频 Proteus仿真--基于DS1302与数码管设…

Debian 11.3 ARM64 安装中文语言包

文章目录 Debian 介绍1、执行命令2、语言选择3、修改设置 Debian 介绍 Debian是一种自由开源的操作系统,被广泛用于服务器、个人计算机和嵌入式设备。它是由全球志愿者组成的开发团队开发和维护的,以稳定性、安全性和自由性而闻名。 以下是一些关于Deb…

机器学习-线性模型·

线性模型是一类用于建模输入特征与输出之间线性关系的统计模型。这类模型的基本形式可以表示为: 其中: 是模型的输出(目标变量)。 是截距(常数项,表示在所有输入特征都为零时的输出值)。 是权重…

Yakit工具篇:WebFuzzer模块之热加载技术

简介 官方定义: 什么是热加载? 广义上来说,热加载是一种允许在不停止或重启应用程序的情况下,动态加载或更新特定组件或模块的功能。这种技术常用于开发过程中,提高开发效率和用户体验。 在Yakit 的Web Fuzzer中&…

PTA NeuDs_数据库题目

二.单选题 1.数据库应用程序的编写是基于数据库三级模式中的。 A.模式 B.外模式 C.内模式 D.逻辑模式 用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系 2.对创建数据库模式一类的数据库对象的授权…

Python基础语法之判断语句

1.布尔类型和比较运算符 布尔类型&#xff1a;数字类型的一种。 比较运算符&#xff1a; > < > < ! 2.if语句基本格式 if 要判断的条件&#xff1a; 条件成立&#xff0c;即做~ 例子&#xff1a; 注意&#xff1a;格式上冒号和缩进 3.if else组合…

docker devicemapper: Error running DeleteDevice dm_task_run failed

docker 删除容器&#xff0c;遇到&#xff1a; devicemapper: Error running DeleteDevice dm_task_run failed 异常 [hadoophadoop02 ~]$ sudo docker rm 5ede1280f0bf Error response from daemon: container 5ede1280f0bf791e91d40038b15decd42e8923546ae578abd96e08114c76…