0301STM32GPIO外设输出

news2024/10/6 7:07:28

STM32GPIO外设输出

  • STM32内部的GPIO外设
    • GPIO简介
    • 基本结构
    • GPIO位结构
      • 输入部分:
      • 输出部分:
    • GPIO八种工作模式
      • 浮空/上拉/下拉输入
      • 模拟输入
      • 开漏/推挽输出
      • 复用开漏/推挽输出
    • 手册寄存器描述
      • GPIO功能描述
      • 外设的GPIO配置
      • GPIO寄存器描述
      • 端口输入数据寄存器
      • 端口输出数据寄存器
      • 端口位设置/清除寄存器
      • 端口位清除寄存器
      • 端口配置锁定寄存器
  • STM32外部的设备和电路
    • LED和蜂鸣器简介
    • 硬件电路
    • 面包板
    • keilkill.bat
  • 点亮一个LED灯3步
    • RCC外设
    • GPIO外设
      • gpio.h的文件
      • 8种工作模式:

GPIO的输出 输入
库函数里用了大量的结构体、指针、枚举等知识。C语言中高级部分
LED闪烁、LED流水灯、蜂鸣器滴滴鸣响

STM32内部的GPIO外设

GPIO简介

GPIO(General Purpose Input Output)通用输入输出口
可配置为8种输入输出模式
引脚电平:0V~3.3V,部分引脚可容忍5V(可以输入5V,但是输出只有3.3V,因为供电只有3.3V)FT(Five Tolerate)
输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序(IIC、SPI、芯片的特性协议)等
输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

基本结构

在这里插入图片描述
GPIO外设的名称按照GPIOA、GPIOB、GPIOC等命令的
每个GPIO外设有16个引脚,编号从0-15。GPIOA的第0号引脚,一般成为PA0,第15号为PA15
每个GPIO模块内,主要包含了寄存器和驱动器这些
寄存器(一段特殊的存储器),内核可以通过APB2总线对寄存器进行读写,来完成输出电平和读取电平的功能。
寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平,写0就输出低电平
输入寄存器读取为1,就证明对应的端口目前是高电平,读取为0,就是低电平
所有寄存器都是32位的,但是端口只有16位,所以寄存器只有低16位对应有端口,高16位没有用到
驱动器用来增加信号的驱动能力。寄存器只负责存储数据,如果要进行点灯操作,还是需要驱动器来负责增大驱动能力

GPIO位结构

在这里插入图片描述

左边三个是寄存器,中间部分是驱动器,右边是IO引脚

整体结构分为两部分:上面是输入部分,下面是输出部分

输入部分:

IO引脚,接了两个保护二极管,对输入电压进行限幅的。如果输入电压>VDD ,那么上面的二极管就会导通,输入电压产生的电流就会直接流入VDD而不会流入内部电路,可以避免过高的电压对内部的电路产生伤害。如果输入电压<VSS,下方二极管导通,电流从VSS流出去,而不会从内部电路汲取电流,可以保护内部电路。如果输入电压在VSS到VDD之间,两个二极管均不导通,这时二极管对电路没有影响,这是保护二极管的作用。

上拉电阻至VDD,下拉电阻至VSS。开关可以通过程序配置。
上面导通,下面断开,上拉输入模式(默认为高电平的输入方式)
下面导通,上面断开,下拉输入模式(默认为低电平的输入方式)
两个都断开,浮空输入模式。
上拉下拉式为了给输入提供一个默认的输入电平的。因为对于数字端口,输入不是高电平就是低电平,如果浮空的话引脚的输入电平极易受外接干扰而改变,为了避免输出不确定,所以要确定下来用上拉电阻或者下拉电阻。上下拉电阻阻值都比较大,是一种弱上拉和弱下拉,目的是尽量不影响正常的输入操作。

图中的肖特基触发器,应该为施密特触发器才对(翻译错误)(对输入电压进行整形)(类似迟滞比较器),经过施密特触发器整形的波形就可以直接写入数据寄存器了。再用程序读取输入数据寄存器对应的某一位数据,就可以指导端口的输入电平了

模拟输入和复用功能输入就是连接到片上外设的一些端口,其中有模拟输入(连接到ADC上的,因为ADC接收模拟量,所以在施密特触发器之前)。复用功能输入是连接到其他需要读取端口的外设上的,比如串口的输入引脚,这根线接收的是数字量,所以在施密特触发器后面

输出部分:

数字部分可以由输出数据寄存器或片上外设控制,两种方式通过数据选择器接到了输出控制部分。如果通过输出数据寄存器进行控制,就是普通的IO口输出,写这个数据寄存器的某一位就可以操作对应的某个端口了
位设置/清除寄存器,可以用来单独操作输出数据寄存器的某一位,而不影响其他位,因为输出数据寄存器同时控制16个端口,并且这个寄存器只能整体读写,所以只想单独控制某一个端口而不影响其他端口的话,就需要一些特殊的操作方式
第一种方式是先读出这个寄存器,然后用按位与和按位或的方式更改某一位,最后再将更改后的数据写回去,在C语言中就是&=和|=操作,比较麻烦,效率不到,对于IO口的操作而言不太合适
第二种方式是设置这个位设置/清除寄存器,如果对某一位置1,在位设置寄存器的对应位写1即可,剩下不需要操作的位写0。内部有电路,自动将输出数据寄存器中的对应位置位1,而剩下的写0的位则保持不变。保证了只操作其中某一位而不影响其他位,并且是一步到位的操作。
如果相对某一位清0,就在位清除寄存器的对应位写1即可,内部有电路,自动将输出数据寄存器中的对应位置位0

第三种方式是读取STM32中的“位带”区域,这个“位带”作用和51单片机的位寻址作用差不多,在STM32中,专门分配的有一段地址区域,这段地址映射了ARM和外设寄存器所有的位,读写这段地址中的数据,就相当于读写所映射位置的某一位。

目前暂不会用到。库函数方法操作是读写位设置和位清除寄存器的方法

输出控制之后接到两个MOS管,推挽、开漏和关闭三种方式
推挽输出在高低电平均有较强的驱动能力,所以推挽输出模式也叫强推输出模式
开漏输出模式,数据寄存器为1时,输出相当于断开,也就是高阻模式,只有低电平有驱动能力。可以作为通信协议的驱动方式,比如IIC,多机通信时可以避免各个设备的相互干扰。还可以用于输出5V的电平信号(用于兼容5V的设备)
关闭。引脚配置成输入模式时,两个MOS管都无效,输出关闭,端口的电平由外部信号来控制

GPIO位结构的全部介绍

GPIO八种工作模式

通过配置GPIO的端口配置寄存器,位结构的电路就会根据配置进行改变(比如开关的通断,NMOS和PMOS是否有效,数据选择器的选择等),端口可以配置成以下8种模式
在这里插入图片描述

浮空/上拉/下拉输入

浮空输入时,端口一定要接上一个连续的驱动源,不能出现悬空的状态。
在这里插入图片描述
输入模式下,输出驱动器是断开的。端口只能输入不能输出,
VDD或VDD_FT是3.3V端口和容忍5V端口的区别。特殊不同在哪手册没有说,我们也不用管,就知道就行了。上面的保护二极管需要做一下处理,要不然直接接VDD3.3V的话,外部接入5V电压就会导致上边二极管开启,并且产生较大电流,这是不太妥当的。

模拟输入

在这里插入图片描述
从引脚直接接到片上外设ADC,所以使用ADC时,将引脚配置成模拟输入就行了

开漏/推挽输出

在这里插入图片描述
在输出模式下,输入模式也是有效的。但是在输入模式下,输出都是无效的,这是因为一个端口只能有一个输出,但可以有多个输入,所以当配置成输出模式的时候,内部也可以顺便输入,这个没啥影响

复用开漏/推挽输出

在这里插入图片描述
这两个模式和普通的开漏输出和推挽输出差不多,只不过引脚电平由片上外设控制,引脚控制权有片上外设掌控。在输入部分,片上外设也可以读取引脚的电平,同时普通的输入也是有效的,顺便接受一下电平信号

8种模式中,除了模拟输入这个模式会关闭数字的输入功能,其他7个模式中所有的输入都是有效的

手册寄存器描述

GPIO功能描述

可以看GPIO8种方式详情可以看手册,
在这里插入图片描述

外设的GPIO配置

使用片上外设的引脚时,可以参考手册里给的配置(外设的GPIO配置)
在这里插入图片描述

GPIO寄存器描述

GPIO配置寄存器,每个端口的模式由4位进行控制,16个端口需要64位,所以配置寄存器有2个,1个端口配置低寄存器,1个端口配置高寄存器
在这里插入图片描述

多出了GPIO输出的速度(可以限制输出引脚的最大翻转速度),这个设计出来是为了低功耗和稳定性的。一般要求不高时配置50MHz即可。

端口输入数据寄存器

里面的低16位对应16个引脚,高16位没有使用
在这里插入图片描述

端口输出数据寄存器

里面的低16位对应16个引脚,高16位没有使用
在这里插入图片描述

端口位设置/清除寄存器

高16位进行位清除,低16位进行位设置。写1进行设置或者清除,写0不产生影响
在这里插入图片描述

端口位清除寄存器

低16位和端口位设置/清除寄存器的高16位功能一样,为啥还需要这个寄存器,是为了方便操作设置的。如果只想单一地进行位设置或者位清除。位设置时,用上面的寄存器,位清除时,用下面的寄存器。因为设置和清除时,使用的都是低16位的数据,这样方便一些。如果想对多个端口同时进行位设置和位清除,那使用第一个寄存器就可以了,这样可以保证位设置和位清除的的同步性。
在这里插入图片描述

端口配置锁定寄存器

可以对端口的配置进行锁定,防止意外更改。
在这里插入图片描述

STM32外部的设备和电路

LED和蜂鸣器简介

在这里插入图片描述
没有剪过得LED实物,长脚是正极,短脚是负极。
LED内部也可以看正负极,较小的一般是正极,较大的一般是负极

硬件电路

在这里插入图片描述
LED灯的限流电阻一定要接。看IO口的高低电平的驱动能力如何来选取怎么接。一般选取第一种接法。很多单片机或者芯片,使用高电平弱驱动,低电平强驱动的规则。可以一定程度上避免高低电平打架。
三极管驱动电路。(更好的驱动电路和阻值选型可以看模电和数电部分)

面包板

在这里插入图片描述
面包板的正反面。
金属爪的排放规律:
竖着的5孔金属爪连接,上面两排和下面两排的金属爪是横着连接(还标了供电的红+ ,蓝-标识)(有的正中间横的可能断开)

keilkill.bat

批处理文件,可以把工程编译产生的中间文件都删掉,因为编译产生的文件比较大,主要占空间的就是Listing和Objects这两个文件夹,这些都是中间文件,如果要把工程分享给别人,可以双击一下这个批处理文件,会把中间文件都删掉

点亮一个LED灯3步

1.使用RCC开启GPIO的时钟
2.使用GPIO_Init函数初始化GPIO
3.使用输出或者输入的函数控制GPIO口

设计RCC和GPIO两个外设 可以先看下这两个外设都有哪些库函数

RCC外设

可以在Library中找到rcc.h文件,在.h文件的最下面,一般都是库函数所有函数的声明。
可以看到rRCC有很多函数,但是大部分函数我们都不会用到,最常用的只有只有这3个函数
在这里插入图片描述
在这里插入图片描述
以AHB为例:
brief 简介
param 参数
看简介描述它的功能,看参数如何选择。
如果不清楚哪个外设连接在哪一个总线上,还可以到arg这个列表里面找一下

GPIO外设

gpio.h的文件

在这里插入图片描述
需要了解的就是红框里的函数
1.GPIO_DeInit,参数可以写GPIOA、GPIOB等等,调用这个函数之后,所指定的GPIO外设就会被复位
2.GPIO_AFIODeInit,可以复位AFIO外设

3.GPIO_Init 非常重要,作用:用结构体的参数来初始化GPIO口,需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数
这个函数内部会自动读取结构体的值,执行一堆判断和运算,写入到GPIO配置寄存器,然后自动把外设的各个参数配置好(操作细节就不需要关心了)。这种Init函数在STM32中基本所有的外设都有,一般初始化外设都使用Init函数来完成。
4.GPIO——StructInit,可以把结构体变量赋一个默认值,

接下来4个是GPIO的读取函数
再下面4个事GPIO的写入函数
这些函数可以实现读写GPIO口的功能,
剩下的函数暂时不会用到
重要的函数就是GPIO_Init和8个读写函数

8种工作模式:

AIN (Analog IN) 模拟输入
IN_FLOATING 浮空输入
IPD (In Pull Down) 下拉输入
IPU (In Pull Up) 上拉输入
Out_OD (Out Open Drain)开漏输出
Out_PP (Out Push Pull) 推挽输出
AF_OD (Atl Open Drain) 复用开漏
AF_PP (Atl Push Pull) 复用推挽

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

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

相关文章

Kafka第四篇——生产数据总体概括,源码解析分区策略,数据收集器,Sender发送线程,key值

目录 流程图以及总体概述 拦截器 分区器以及分区计算策略 为啥进行分区计算&#xff1f; producer生产者怎么知道有哪些分区&#xff1f; 分区计算 如何自定义实现分区器&#xff1f; 想说的在图里啦&#xff01;宝宝&#xff01;&#x1f4a1; ​编辑 如果key值忘记传递了呢&a…

Vue移动端地图App:van-uploader导致的卡顿问题

问题描述 基于Vue3+Vant IU 4开发的移动端地图App,在进行地图点位上报、上报记录查看过程中,出现App卡顿、甚至闪退的问题,进行问题定位之后,发现是van-uploader组件导致的问题。 van-uploader文件上传组件 van-uploader组件用于将本地的图片或文件上传至服务器,并在上传…

园区、社区、乡村的智能管理

智慧园区、社区、乡村管理系统是现代信息技术在城市化进程中的重要应用,它们通过集成多种技术手段,实现对园区、社区、乡村的全面、高效、智能化管理。以下是对这三种管理系统的详细阐述: 一、智慧园区管理系统 1. 定义与目的 智慧园区管理系统是运用物联网、云计算、大数…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档&#xff1a;GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可…

【做一道算一道】和为 K 的子数组

给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1], k 2 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;nums [1,2,3],…

分布式整合

一、分布式架构介绍 什么是分布式系统 分布式系统指一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 通俗的理解&#xff0c;分布式系统就是一个业务拆分成多个子业务&#xff0c;分布在不同的服务器节点&#xff0…

【数据结构与算法】快速排序霍尔版

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

找不到x3daudio1_7.dll怎么修复?一招搞定x3daudio1_7.dll丢失问题

当你的电脑突然弹出提示&#xff0c;“找不到x3daudio1_7.dll”&#xff0c;这时候你就需要警惕了。这往往意味着你的电脑中的程序出现了问题&#xff0c;你可能会发现自己无法打开程序&#xff0c;或者即便打开了程序也无法正常使用。因此&#xff0c;接下来我们要一起学习一下…

【简单介绍下Memcached】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

Wormhole Filters: Caching Your Hash on Persistent Memory——泛读笔记

EuroSys 2024 Paper 论文阅读笔记整理 问题 近似成员关系查询&#xff08;AMQ&#xff09;数据结构可以高效地近似确定元素是否在集合中&#xff0c;例如Bloom滤波器[10]、cuckoo滤波器[23]、quotient滤波器[8]及其变体。但AMQ数据结构的内存消耗随着数据规模的增长而快速增长…

Kubernetes集群性能测试之kubemark集群搭建

Kubernetes集群性能测试之kubemark集群搭建 Kubemark是K8s官方提供的一个对K8s集群进行性能测试的工具。它可以模拟出一个K8s cluster&#xff08;Kubemark cluster&#xff09;&#xff0c;不受资源限制&#xff0c;从而能够测试的集群规模比真实集群大的多。这个cluster中ma…

针对tcp不出网打——HTTP隧道代理(以CFS演示)

目录 上传工具到攻击机 使用说明 生成后门文件 由于电脑短路无法拖动文件&#xff0c;我就wget发送到目标主机tunnel.php文件​ 成功上传​ 可以访问上传的文件 启动代理监听 成功带出 后台私信获取弹药库工具reGeorg 上传工具到攻击机 使用说明 生成后门文件 pyt…

Android OpenGL ES 离屏幕渲染2——获取渲染结果并显示到ImageView控件中,使用最简模型展示

简介&#xff1a; 紧接上文&#xff0c;本文将用一个不包含顶点shader和片元shader的最小模型讲述如何把通过EGL创建的OpenGL ES环境渲染后的结果进行提取&#xff0c;单纯输出一片铺满视口的红色的像素。 EGL环境创建逻辑&#xff1a; 先看完整代码&#xff1a; package com.c…

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成&#xff1a;运行异常与编译异常 两者区别&#xff1a;编译异常用来提醒程序员&#xff0c;运行异常大部分是由于参数传递错误导致 异常作用&#xff1a; 作用1&#xff1a;就是平时的报错&#xff0c;方便我们找到报错的来源 作用2&#xff1a;在方法内部…

华为机试HJ51输出单向链表中倒数第k个结点

华为机试HJ51输出单向链表中倒数第k个结点 题目&#xff1a; 想法&#xff1a; 因为要用链表&#xff0c;且要找到倒数第k个结点&#xff0c;针对输入序列倒叙进行构建链表并找到对应的元素输出。注意因为有多个输入&#xff0c;要能接受多次调用 class Node(object):def __…

[Godot3.3.3] – 人物死亡动画 part-2

前言 在上一个 part 中已经完成了大部分的逻辑&#xff0c;现在进行一些新的修改。 增加重力 首先将 PlayerDeath 中的 AnimationPlayer 设置为自动播放。 返回 PlayerDeath.gd 并增加一个重力 300&#xff0c;防止玩家的尸体腾空运动。 var gravity 1000 _process 函数中…

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…

基于深度学习LightWeight的人体姿态之行为识别系统源码

一. LightWeight概述 light weight openpose是openpose的简化版本&#xff0c;使用了openpose的大体流程。 Light weight openpose和openpose的区别是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…