STM32:GPIO输入输出

文章目录

  • 1、GPIO介绍
    • 1.1 GPIO的基本结构
    • 1.1 GPIO的位结构
  • 2、 GPIO工作模式
  • 3、GPIO标准外设库接口函数
    • 3.1 RCC接口函数
    • 3.2 GPIO接口函数
      • 3.2.1 GPIO的读取函数
      • 3.2.1 GPIO的写入函数
  • 4、GPIO的初始化

1、GPIO介绍

GPIO(General Purpose Input Output)通用输入输出口,也就是我们平时所说的I/O口

  • 可配置为8种输入输出模式。
  • 引脚电平:0v~3v,部分引脚可容忍为5v。
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等。
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接受数据等。

1.1 GPIO的基本结构

在这里插入图片描述
在STM32中,所有的GPIO都是挂载在APB2外设总线上的;其中GPIO所有的外设名称都是按照GPIOA、GPIOB、GPIOC等等这样来命名的。

每个GPIO外设总共有16个引脚,编号是0~15;例如GPIOA的第0号引脚,我们一般将其称之为PA0。

在每个GPIO模块内,主要包含了寄存器和驱动器。寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器进行读写,这样来完成输出电平和读取电平的功能。

寄存器的每一位对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平;写0,就输出低电平。输入寄存器读取为1,就证明对应的端口目前是高电平;读取为0,就是低电平。

STM32是32位的单片机,所有STM32内部寄存器都是32位的,但这个端口只有16位,因此这个寄存器只有低16位对应有端口,而高16位是没有被用到的。

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

1.1 GPIO的位结构

在这里插入图片描述
最右边的I/O引脚,接了两个保护二极管来对输入电压限幅。

上面的二极管VDD-3.3V,下面二极管接VSS-0V:

  • 如果输入电压比3.3V还要高,那上方这个二极管就会导通。
  • 输入电压产生的电流就会直接流入VDD而不会流入内部电路,这样就可以避免过高的电压对内部这些电路产生伤害。
  • 如果输入电压比0V还要低,这个电压是相对于VSS的电压,所以是可以有负电压的,这是下方的二极管就会导通,电流会从VSS直接流到I/O出去,而不会从内部电路汲取电流,也可以保护内部电路。
  • 如果输入电压在0~3.3V之间,那两个二极管均不会导通。

左上方一个上拉电阻,一个下拉电阻

  • 目的是为了提供一个默认的输入电平,因为对应一个数字的端口,输入的不是高电平就是低电平,如果输入引脚什么都不接,那到底是算高电平还是低电平。
  • 实际情况是,如果输入引脚啥都不接,这时输入就会处于一种浮空的状态,引脚的输入电平极易受外界干扰而改变。
  • 为了避免引脚悬空导致的输入数据不确定,我们就需要在这里加上上拉或者下拉电阻了。
  • 此时,如果接入上拉电阻,当引脚悬空时,还有上拉电阻来保证引脚的高电平,所以上拉输入又可以称作是默认为高电平的输入模式。

上拉电阻至VDD,下拉电阻至VSS,这个开关是可以通过程序进行配置的:

  • 如果上边断开,下边开关关闭,为下拉模式,反之为上拉模式。
  • 如果两个都断开,就是浮空输入模式

施密特触发器:

  • 他的作用是对输入电压进行整形。
  • 如果输入电压大于某一阈值,输出就会瞬间升为高电平。
  • 如果输入电压小于某一阈值,输出就会瞬间降为低电平。

输入数据寄存器:

  • 用程序读取输入数据寄存器对应某一位的数据,就可以知道端口的输入电平。

上面还有两路线路,这些就是连接到片上外设的一些端口:

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

2、 GPIO工作模式

通过配置GPIO的端口配置寄存器,端口可以配置位以下8种输入输出模式:

(1)浮空输入

引脚内部既不接上拉电阻也不接下拉电阻,直接经施密特触发器输入I/O引脚的信号。可以读取到引脚电平,若引脚悬空,则电平不确定。

(2)上拉输入(Input Pull-up)

引脚内部连接上拉电阻,通过开关连接到电源VDD,可读取引脚电平,引脚悬空默认为高电平。

(3)下拉输入(Input Pull-down)
与上拉输入模式相反,内部连接下拉电阻,引脚悬空默认为低电平。

(4)模拟输入

GPIO无效,引脚直接接入内部ADC,实现对外部信号的采集。

(5)开漏输出(Open-Drain,OD)

可输出引脚电平,高电平为高阻态,低电平接Vss。

(6)推挽输出(Push-Pull,PP)

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

(7)复用开漏输出(AF-OD)

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

(8)复用推挽输出(AF-PP)

由片上外设控制,高电平为接VDD,低电平接Vss。

3、GPIO标准外设库接口函数

3.1 RCC接口函数

在这里插入图片描述

我们可以在Library文件中找到rcc.h这个文件,其中里面我们最常用到的就是红框内的3个函数:

	RCC APB外设时钟控制、RCC APB2外设时钟控制、RCC APB1外设时钟控制

其中上面常用的3个函数的操作方法都是一样的,第一个参数选择外设,第二个参数选择使能或失能。

3.2 GPIO接口函数

在这里插入图片描述

上图就是GPIO的全部库函数,其中红色方框内的函数用来实现读写GPIO口的功能,基本上常用的就是上面蓝色方框内的函数。

1.GPIO_DeInit,调用这个函数后,所指定的GPIO外设就会被复位。

2.GPIO_AFIODeInit,也是一样,可以复位AFIO外设。

3.GPIO_Init,用结构体的参数来初始化GPIO口。我们需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数,这个函数内部就会自动读取结构体的值,然后自动把外设的各个参数配置好。这种Init函数在STM32中基本所有的外设都有,一般我们初始化外设都是使用这个Init函数来完成的。

4.GPIO_StructInit,这个函数可以把结构体变量赋一个默认值。

3.2.1 GPIO的读取函数

1.uint8_t GPIO_ReadInputDataBit,用来读取输入寄存器的某一个端口的输入值,参数是GPIOx和GPIO_Pin,用来指定某一个端口,返回值是uint8_t,代表这个端口的高低电平。

2.uint16_t GPIO_ReadInputData,读取整个输入寄存器,参数只有一个GPIOx,用来指定外设,返回值是uint16_t,一个16位的数据,每一位代表一个端口值。

3.uint8_t GPIO_ReadOutputDataBit,读取输出寄存器的某一个位,因此他并不是用来读取端口的输入数据的,一般用于输出模式下,用来查询字节输出的是什么。

4uint16_t GPIO_ReadOutputData,用来读取整个输出寄存器。

总结来说:若想读取GPIO口的话,需要用到ReadIput的这两个函数;若在输出模式下,想要看一下现在输出了什么,才需要用到ReadOutput这两个函数。

3.2.1 GPIO的写入函数

1.GPIO_SetBits,可以把指定的端口设置为高电平。

2.GPIO_ResetBits,可以把指定的端口设置为低电平。

3.GPIO_WriteBit,这个函数有三个参数,前两个也是指定端口;第三个是BitValue,可以根据第三个参数的值来设置指定的端口。

4.GPIO_Write,第一个参数GPIOx选择外设;PortValue,这个函数可以同时对16个端口进行写入操作。

4、GPIO的初始化

操作STM32的GPIO总共需要3个步骤,涉及了RCC和GPIO两个外设:

  • 使用RCC开启GPIO的时钟;
  • 使用GPIO_Init函数初始化GPIO;
  • 使用输入或输出函数控制GPIO口。

当我们需要控制一个LED的亮灭时,我们要先对GPIO端口进行初始化

例如我们需要点亮PA0口的LED,首先新建一个LED.c的工程,用来存放LED驱动程序的主题代码,将我们所需要初始化的函数写入这个工程文件中。

首先我们需要调用的是RCC里面的APB2外设时钟控制函数:
在这里插入图片描述

跳转到定义后查看参数说明,他的第一个参数就应该为RCC_APB2Periph_GPIOA,第二个参数就为ENABLE,这样时钟就开启了。

接着调用GPIO_Init函数,跳转定义查询后可以写出第一个参数为GPIOA,第二个参数是一个结构体,我们先给第二个参数结构体重命名为GPIO_InitStructure,如下所示:

#include "stm32f10x.h"                  // Device header
void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启时钟
	GPIO_InitTypeDef GPIO_InitStructure;//配置端口模式
	
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

接着我们通过结构体成员操作符“.”来引出结构体成员,如下所示:

GPIO_InitStructure.GPIO_Mode = ;
GPIO_InitStructure.GPIO_Pin = ;
GPIO_InitStructure.GPIO_Speed = ;

接着再配置其中所需要的参数,最后的初始化代码如下:

#include "stm32f10x.h"                  // Device header
void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启时钟
	GPIO_InitTypeDef GPIO_InitStructure;//配置端口模式
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}

当我们完成GPIO初始化后,写入主函数下载后就可以查看LED灯的变化。

上电后LED处于低电平状态,因此为常亮;若想上电为高电平,即LED熄灭的状态则在初始化函数后添加一个写入函数GPIO_SetBits即可。程序如下:

#include "stm32f10x.h"                  // Device header
void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //开启时钟
	GPIO_InitTypeDef GPIO_InitStructure;//配置端口模式
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
}

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

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

相关文章

深入大模型量化技术,大模型端侧落地已Ready?

揭秘未来:大模型量化技术如何革新移动AI应用 ©作者|饮水机 来源|神州问学 前言 最近,苹果发布了OpenELM系列模型,参数规模分别为270M、450M、1.1B和3B。与此同时,微软也推出了Phi-3系列模型,其中mini版本的参数…

支付时,中国网联结算与中国银联结算的区别与联系

随着电子商务和互联网支付的快速发展,中国的支付清算市场也呈现出前所未有的繁荣景象。在这个大背景下,中国网联与中国银联作为两大支付清算机构,各自扮演着重要的角色。本文将对两者的区别和联系进行深入探讨,以期对读者有更全面…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第9章ubuntu系统下升级固件

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

智慧公厕,城市现代化公卫变革的关键节点

随着城市的快速发展,公共厕所作为社会基础民生设施,正越来越受到精细化管理的重视。智慧公厕的出现,为传统公共厕所的脏乱臭提供了解决方案,通过物联网、大数据、云计算、自动化控制等先进技术的贡献,使公厕管理更加高…

怎么编辑百度百科个人词条

辑百度百科个人词条是一个相对复杂的过程,需要遵循一定的步骤和规则。以下是百科优化网整理的编辑百度百科个人词条的步骤和注意事项。 1. 确定编辑资格 百度百科个人词条的编辑权主要赋予那些具有一定影响力的公众人物,或者是有一定“身份”的人物&…

大模型驱动的新一代 BI 平台,Sugar BI 开启智慧决策新模式

本文整理自 2024 年 4 月 16 日的 2024 百度 Create 大会上的《大模型驱动的新一代 BI 平台如何开启智慧决策》分享。 全文包括了可视化 BI 分析技术架构、智能图表推荐策略与规则设计、Sugar Bot 智能问数的技术实现流程,以及目前的场景应用等。 1 Sugar BI 产…

【C语言】路漫漫其修远兮,深入[指针]正当下

一. 指针初步 1.概念定义 地址:我们在内存中开辟空间时,为了方便后续访问,每个数据有确切的地址。 指针:指向数据的地址,并将其地址储存在指针变量中。 2.基本运算符 • 取地址操作符(&) …

OpenHarmony 4.0 实战开发——分布式软总线解析:设备发现与传输

OpenHarmony 的分布式软总线子系统为 OpenHarmony 系统提供的通信相关的能力,包括:WLAN 服务能力、蓝牙服务能力、软总线、进程间通信 RPC(Remote Procedure Call)等通信能力。 其中主要包括: WLAN 服务:…

【Java开发的我出书啦,各位同仁快过来围观】!!!

文章目录 🔊博主介绍🥤本文内容出书的目的出书的过程书籍的内容 📥博主的话 🔊博主介绍 文章目录 🔊博主介绍🥤本文内容出书的目的出书的过程书籍的内容 📥博主的话 🌾阅读前&#x…

机器学习 | 时间序列预测中的AR模型及应用

自回归模型,通常缩写为AR模型,是时间序列分析和预测中的一个基本概念。它们在金融、经济、气候科学等各个领域都有广泛的应用。在本文中,我们将探索自回归模型,它们如何工作,它们的类型和实际例子。 自回归模型 自回…

Elasticsearch中的三种分页策略深度解析:原理、使用及对比

码到三十五 : 个人主页 在Elasticsearch中,分页是查询操作中不可或缺的一部分。随着数据量的增长,如何高效地分页查询数据急需需要面对的问题。Elasticsearch提供了三种主要的分页方式:from size、scroll和search_after。下面详细…

ICode国际青少年编程竞赛- Python-2级训练场-基础训练4

ICode国际青少年编程竞赛- Python-2级训练场-基础训练4 1、 for i in range(4):if i > 2:Flyer[i].step(3)else:Flyer[i].step(1) Dev.step(Item[3].x - Dev.x)2、 for i in range(6):if i < 3:Flyer[i].step(2)else:Flyer[i].step(3) Dev.step(Item[2].x - Dev.x)3、 …

制造版图大变革!逾10座晶圆厂蓄势待发 | 百能云芯

在全球半导体产业的激烈竞争和市场需求的复杂波动中&#xff0c;晶圆厂建设热潮正在美国兴起&#xff0c;这一波建设浪潮的核心动力之一&#xff0c;便是美国政府推出的《芯片与科学法案》所承诺的巨额补贴&#xff0c;旨在提升美国在全球半导体行业的竞争力。 当地时间4月25日…

翻译《The Old New Thing》 - The new scratch program

The new scratch program - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20050422-08/?p35813 Raymond Chen 2005年4月22日 译注&#xff1a;此篇是 翻译《The Old New Thing》 - The scratch program 姊妹篇&#xff0c;对 scratch 程序作…

普通人副业要趁早,5种靠谱且持久的赚钱副业

中年危机、35岁被裁&#xff0c;这些听起来就让人焦虑的词汇&#xff0c;是否也让你感到不安&#xff1f;别担心&#xff0c;只要你早早开启副业之旅&#xff0c;这些都不是问题。 今天&#xff0c;我要为你介绍的这5种副业&#xff0c;不仅能帮你赚钱&#xff0c;还能让你的能…

前端高频面试题 5.08

事件委托 事件委托是前端开发中常用的一种优化性能和代码可维护性的方法&#xff0c;它基于DOM的事件冒泡机制。当一个元素触发事件时&#xff0c;这个事件会按照从顶层到底层的顺序传播&#xff0c;直到最底层的元素&#xff08;通常是文档的根节点&#xff09;。事件委托利用…

张大哥笔记:如果不想继续打工,互联网创业或许是最好的出路!

互联网时代最好的出路&#xff0c;就是选择创业&#xff0c;不要选择打工。选择打工很亏&#xff0c;你学到的是打工的本事。而创业&#xff0c;看似不赚钱&#xff0c;看似倒霉&#xff0c;但是会锻炼出了你一天赚几千&#xff0c;甚至几万的本事。 随着互联网越来越被人们所…

Educational Codeforces Round 165 (Div. 2) A~E

A.Two Friends (思维) 题意&#xff1a; 小 A A A想开一个派对。他有 n n n个朋友&#xff0c;他希望至少有 2 2 2个朋友参加他的派对。 i i i 这个朋友最好的朋友是 p i p_i pi​ 。所有的 p i p_i pi​ 都是不同的&#xff0c;对于每一个 i ∈ [ 1 , n ] i \in [1, n] …

C++之泛型编程---有限双端队列结构容器

引言 为了解决工业领域代码容器的通用化&#xff0c;可以考虑C里的泛型编程概念。假设一个场景需要实时保存最近的n个数据并按照顺序依次处理时&#xff0c;就需要定义一种新的容器来满足要求。当容器不满时&#xff0c;添加数据直接到队尾&#xff0c;当容器数据已经为n个时&a…

毕设UI设计不会前端怎么办?今天看到了一款自动生成UI的项目-OpenUI

试用地址&#xff1a;Create a new Elemint (openui.fly.dev) OpenUI 是由 W&B 开发开源项目&#xff0c;旨在简化用户界面(UI)组件的构建过程。它通过允许开发者使用想象力描述 UI&#xff0c;然后实时看到渲染效果&#xff0c;使得 UI 开发变得有趣、快速且灵活。 这个…