0301STM32GPIO外设输出

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) 复用推挽

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【驱动篇】龙芯LS2K0300之ADC驱动

实验目的 由于LS2K0300久久派开发板4.19内核还没有现成可用的ADC驱动&#xff0c;但是龙芯官方的5.10内核已经提供了ADC驱动&#xff0c;想要在4.19内核使用ADC就要参考5.10内核移植驱动&#xff0c;本次实验主要是关于ADC驱动的移植和使用 驱动移植 主要的驱动代码主要有3个…

【ROS2】初级:客户端-创建自定义 msg 和 srv 文件

目标&#xff1a;定义自定义接口文件&#xff08; .msg 和 .srv &#xff09;并将它们与 Python 和 C节点一起使用。 教程级别&#xff1a;初学者 时间&#xff1a;20 分钟 目录 背景 先决条件 任务 1. 创建一个新包2. 创建自定义定义3 CMakeLists.txt4 package.xml5. 构建 tut…

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】 购物车需求描述购物车数据结构数据Model抽取实现流程&#xff08;参照京东&#xff09;代码实现参考 购物车需求描述 用户可以在登录状态下将商品添加到购物车【用户购物…

【LabVIEW学习篇 - 4】:程序结构——条件结构、事件结构、禁用结构

文章目录 条件结构案例一&#xff08;布尔输入&#xff09;案例二&#xff08;整数输入&#xff09;案例三&#xff08;字符串输入&#xff09; 事件结构案例一案例二 禁用结构 条件结构 条件结构的组成部分&#xff1a; 选择器标签&#xff08;带方框的“?”&#xff09;&…

PCIe驱动开发(2)— 第一个简单驱动编写和测试

PCIe驱动开发&#xff08;2&#xff09;— 第一个简单驱动编写和测试 一、前言 教程参考&#xff1a;02_实战部分_PCIE设备测试 教程参考&#xff1a;03_PCIe设备驱动源码解析 二、驱动编写 新建hello_pcie.c文件 touch hello_pcie.c然后编写内容如下所示&#xff1a; #i…

基于java+springboot+vue实现的校园外卖服务系统(文末源码+Lw)292

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

目标检测2--yolov1中相关基础知识(边框回归、交并比、nms)介绍

文章目录 前言回归介绍基本概念线性回归非线性回归边框回归 交并比介绍定义程序实现 NMS介绍定义与原理工作原理代码实现 前言 在上篇博客目标检测1–Pytorch目标检测之yolov1中介绍了yolov1的原理&#xff0c;里面提到几个知识点现在详细介绍一下。 回归介绍 在上篇博客中提…

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度&#xff0c;逆向转90度 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 步进电机可以理解为&#xff1a;是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于&#xff0c;普通电机可以持…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令&#xff0c;可以当作学习笔记收藏学习一下&#xff01;&#xff01;&#xff01; 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展&#xff0c;水果在线销售已逐渐演变为一种极为便捷的购物方式&#xff0c;日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台&#xff0c;致力于为用户提供优质、…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

常用的MRI分析软件

MRI&#xff08;磁共振成像&#xff09;分析软件种类繁多&#xff0c;涵盖了从基础图像处理到高级数据分析的各个方面。这些软件广泛应用于临床诊断、研究和教育等领域。以下是一些常用的MRI分析软件&#xff1a; 开源软件 商用软件 特殊用途软件 在线工具和云平台 这些软件各…

孟德尔随机化与痛风3

写在前面 检索检索&#xff0c;刚好发现一篇分区还挺高&#xff0c;但结果内容看上去还挺熟悉的文章&#xff0c;特记录一下。 文章 Exploring the mechanism underlying hyperuricemia using comprehensive research on multi-omics Sci Rep IF:3.8中科院分区:2区 综合性期…

# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】

easy-rl PDF版本 笔记整理 P5、P10 - P12 joyrl 比对 补充 P11 - P13 OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链…

渐开线花键测量学习笔记分享

大家好&#xff0c;继续渐开线花键的相关内容&#xff0c;本期是渐开线花键测量相关的学习笔记分享&#xff1a; 花键检测项目有花键大径和小径检验&#xff1b;内花键齿槽宽和外花键齿厚&#xff0c;以及渐开线终止圆 和起始圆直径检测&#xff1b;齿距累计误差 、齿形误差 、…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫&#xff1a;Scrapy框架的全面解析 一、引言 在当今互联网的时代&#xff0c;数据是最重要的资源之一。为了获取这些数据&#xff0c;我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言&#xff0c;拥有许多用于网络爬虫的工具和库…

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢&#xff1f; 何以解忧&#xff1f;唯有知攻善防&#xff01; 创作起源&#xff1a; 驻场、护网等&#xff0c;有的客户现场只允许用客户机器&…

一.7.(2)基本运算电路,包括比例运算电路、加减运算电路、积分运算电路、微分电路等常见电路的分析、计算及应用;(未完待续)

what id the 虚短虚断虚地? 虚短&#xff1a;运放的正相输入端和反相输入端貌似连在一起了&#xff0c;所以两端的电压相等&#xff0c;即UU- 虚断&#xff1a;输入端输入阻抗无穷大 虚地&#xff1a;运放正相输入端接地&#xff0c;导致U&#xff1d;U-&#xff1d;0。 虚…

采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式

采用Java语言开发工具 Idea scode数字化产科管理平台源码&#xff0c;产科管理新模式 数字化产科管理系统是现代医疗信息化建设的重要组成部分&#xff0c;它利用现代信息技术手段&#xff0c;对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理&#xf…

lua中判断2个表是否相等

当我们获取 table 长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数&#xff0c;而导致无法正确取得 table 的长度&#xff0c;而且还会出现奇怪的现象。例如&#xff1a;t里面有3个元素&#xff0c;但是因为最后一个下表是5和4&#xff0c;却表现出不一…