STM32:GPIO输出

news2024/12/27 12:14:28

文章目录

  • 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.coloradmin.cn/o/1642547.html

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

相关文章

腾讯云CentOS7使用Docker安装ElasticSearch与Kibana详细教程

文章目录 一、安装ElasticSearch二、安装Kibana 一、安装ElasticSearch 使用Docker拉取ElasticSearch镜像 这里版本选择的是7.15.2 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.22. 查看ElasticSearch的镜像id docker images3. 创建ElasticSearch容器 …

Linux基础指令001

名称日期版本说明作者了解并熟练运用Linux基础指令2024/05/04v0.0.1汇总篇lgb 一,了解Linux,并安装 Linux是一套免费使用和自由传播的类Unix操作系统,是一个多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协…

基于OpenCv的图像金字塔

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号&#xf…

Finder Windows for Mac:双系统窗口,一键切换!

Finder Windows for Mac是一款专为Mac用户设计的实用工具,它模拟了Windows系统的窗口管理功能,让Mac用户也能享受到类似Windows的窗口操作体验。这款软件的主要功能是提供一个浮动面板,帮助用户随时即时访问打开的Finder窗口列表,…

jQuery Moblie 笔记14 开发跨平台移动设备网页

相关内容:jQuery Moblie基础、操作、移动设备仿真器、jQuery Moblie网页实例、jQuery Moblie的UI组件、…… jQuery推出了一套新的函数库jQuery Mobile,目的是希望能够统一当前移动设备的用户界面(UI)。 移动设备开发应用程序目前大致分为两种&#xff…

IDEA启动Tomcat启动失败:jar包未部署【部署jar包】

IDEA启动Tomcat报错java.lang.ClassNotFoundException:org.springframework.web.context.ContextLoaderListener:jar包未部署【部署jar包】 学习java,开始跟着教程的步伐学习maven下载jar包,tomcat启动项目,发现项目未启动成功也…

NAPLISTENER>APT-REF2924组织后门扫描利用工具

项目地址:https://github.com/MartinxMax/NAPLISTENER 简介 这是与REF2924 APT组关联的Wmdtc.exe后门扫描程序。 我们可以在Windows和Linux上使用此工具来扫描目标服务器。 如果发现字段[Microsoft HTTPAPI/2.0]存在,您可以尝试扫描组织的后门。 当第一次运行脚本…

【Android学习】日期和时间选择对话框

实现功能 实现日期和时间选择的对话框&#xff0c;具体效果可看下图(以日期为例) 具体代码 1 日期对话框 1.1 xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android&quo…

xss漏洞简介

漏洞简介 跨站脚本&#xff08;Cross-site scripting ,简称 XSS&#xff09;是一种经常出现在Web应用程序中的计算机安全漏洞&#xff0c;是由于web应用程序对用户的输入过滤不足而产生的&#xff0c;是代码注入的一种&#xff0c;XSS就是攻击者利用网站漏洞把恶意脚本代码&am…

wpf线程中更新UI的4种方式

在wpf中&#xff0c;更新UI上面的数据&#xff0c;那是必经之路&#xff0c;搞不好&#xff0c;就是死锁&#xff0c;或者没反应&#xff0c;很多时候&#xff0c;都是嵌套的非常深导致的。但是更新UI的方式&#xff0c;有很多的种&#xff0c;不同的方式&#xff0c;表示的意思…

目标跟踪—卡尔曼滤波

目标跟踪—卡尔曼滤波 卡尔曼滤波引入 滤波是将信号中特定波段频率滤除的操作&#xff0c;是抑制和防止干扰的一项重要措施。是根据观察某一随机过程的结果&#xff0c;对另一与之有关的随机过程进行估计的概率理论与方法。 历史上最早考虑的是维纳滤波&#xff0c;后来R.E.卡…

anaconda、cuda、tensorflow、pycharm环境安装

anaconda、cuda、tensorflow、pycharm环境安装 anaconda安装 anaconda官方下载地址 本文使用的是基于python3.9的anaconda 接下来跟着步骤安装&#xff1a; 检验conda是否成功安装 安装CUDA和cuDNN 提醒&#xff0c;CUDA和cuDNN两者必须版本对应&#xff0c;否者将会出错…

SpringBoot---------Swagger

第一步&#xff1a;引入依赖 <!-- swagger--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId></dependency> 第二步&#xff1a;配置文件 import com.sky.intercept…

Educational Codeforces Round 165 (Rated for Div. 2) (C、D)

1969C - Minimizing the Sum 题意&#xff1a; 思路&#xff1a;观察到操作数很小&#xff0c;最值问题操作数很容易想到dp&#xff0c;用表示第个元素&#xff0c;操作了次的最小值总和&#xff0c;转移的时候枚举连续操作了几次即可&#xff0c;而连续操作了几次即将全部变成…

微信小程序 uniapp家庭食谱菜谱食材网上商城系统小程序ko137

随着生活节奏的不断加快&#xff0c;越来越多的人因为工作忙而没有时间自己出去订购喜欢的菜品。随着Internet的飞速发展&#xff0c;网络已经成为我们日常生活中必不可少的部分&#xff0c;越来越多的人也接受了电子商务这种快捷、方便的交易方式。网上订餐其独有的便捷性和直…

GNU Radio创建FFT、IFFT C++ OOT块

文章目录 前言一、GNU Radio官方FFT弊端二、创建自定义的 C OOT 块1、创建 OOT 模块2、创建 OOT 块3、修改 C 和 CMAKE 文件4、编译及安装 OOT 块 三、测试1、grc 图2、运行结果①、时域波形对比②、频谱图对比 四、资源自取 前言 GNU Radio 自带的 FFT 模块使用起来不是很方便…

opengauss概述-基础知识篇-备考华为高斯

目录 &#x1f9e8;考前准备: &#x1f3a1;数据库操作语言 ✨OLTP和OLAP &#x1f3af;常用函数 &#x1f9f2;字符处理函数 关于 left 和 right 特别重点的字符串函数 &#x1f9f2;数字操作函数 关于 ceil 和 floor &#x1f9f2;时间和日期处理函数 &#x1f9f…

karpathy Let‘s build GPT

1 introduction 按照karpathy的教程&#xff0c;一步步的完成transformer的构建&#xff0c;并在这个过程中&#xff0c;加深对transformer设计的理解。 karpathy推荐在进行网络设计的过程中&#xff0c;同时利用jupyter notebook进行快速测试和python进行主要的网络的构建。 …

安卓 app icon大小 安卓app界面尺寸大小

移动应用的界面设计画布尺寸设计多大&#xff08;特别是Android&#xff09;、图标和字体大小怎么定、需要设计多套设计稿么、如何切图以配合开发的实现&#xff1f; 本篇将结合iOS和android官方的设计规范、搜集的资料以及工作中的摸索&#xff0c;来分享移动应用界面设计中的…

《Fundamentals of Power Electronics》——基础交流建模方法

PWM整流器小信号交流模型建模的主要步骤为&#xff1a; (a)利用小纹波近似的动态版本&#xff0c;建立与电感和电容波形的低频平均值有关的方程&#xff1b; (b)平均方程的扰动和线性化&#xff1b; (c)交流等效电路模型的建立。 以下图buck-boost电路为例进行分析。 首先测…