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.mzph.cn/bicheng/6513.shtml

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

相关文章

Python设计模式 - 单例模式

定义 单例模式是一种创建型设计模式, 其主要目的是确保一个类只有一个实例, 并提供一个全局访问点来访问该实例。 结构 应用场景 资源管理:当需要共享某个资源时,例如数据库连接、线程池、日志对象等,可以使用单例模…

铜川市各区县高新技术企业奖励补贴政策文件,铜川高企申报条件

铜川市高新技术企业奖励补贴政策文件解读:《铜川市科技型企业创新发展倍增计划》 【高企申请 找 小编 见 个 人 简 介 】一、指导思想 按照市委、市政府部署要求,以强化科技型企业创新主体地位为牵引,以培育壮大主体规模、提升…

【UnityRPG游戏制作】Unity_RPG项目_玩法相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:就业…

【算法与数据结构】哈希表

文章目录 引入哈希函数介绍便利店的例子Python3 中的哈希表C 中的哈希表 应用将散列表用于查找防止重复将散列表用作缓存 哈希冲突与解决链地址法开放寻址 总结参考资料写在最后 引入 假设你在一家便利店上班,你不熟悉每种商品的价格,在顾客需要买单是时…

详述DM9161芯片的特性和用法

目录 概述 1. 认识DM9161 2 DM9161的特性 2.1 特性总结 2.2 结构框图 3 功能描述 4 RMII接口 4.1 100Base-TX Operation 4.2 10Base-T Operation 4.3 Auto-Negotiation 4.4 HP Auto-MDIX功能描述 6 DM9161的寄存器 6.1 寄存器列表 6.2 寄存器功能介绍 6.2.1 基本…

ubuntu20中ros与anaconda的python版本冲突问题

系统环境 原本系统是ubuntu20 noetic,python都在/usr/bin中,一共是两个版本的python,一个是python3.8,另一个是python2.7。 问题发现 当安装anaconda后,并且将anaconda的bin目录加入到系统环境中时候,…

Stable Diffusion webUI 配置指南

Stable Diffusion webUI 配置指南 本博客主要介绍部署Stable Diffusion到本地,生成想要的风格图片。 文章目录 Stable Diffusion webUI 配置指南1、配置环境(1)pip环境[可选](2)conda环境[可选] 2、配置Stable Diffu…

Monorepo(单体仓库)与MultiRepo(多仓库): Monorepo 单体仓库开发策略与实践指南

🌟 引言 在软件开发的浩瀚宇宙里,选择合适的代码管理方式是构建高效开发环境的关键一步。今天,我们将深入探讨两大策略——Monorepo(单体仓库)与MultiRepo(多仓库),并通过使用现代化…

CMakeLists.txt语法规则:部分常用命令说明一

一. 简介 前一篇文章简单介绍了CMakeLists.txt 简单的语法。文章如下: CMakeLists.txt 简单的语法介绍-CSDN博客 接下来对 CMakeLists.txt语法规则进行具体的学习。本文具体学习 CMakeLists.txt语法规则中常用的命令。 二. CMakeLists.txt语法规则:…

【Qt问题】VS2019 Qt win32项目如何添加x64编译方式

解决办法: 注意改为x64版本以后,要记得在项目属性里,修改Qt Settings、对应的链接include、lib等 参考文章 VS2019 Qt win32项目如何添加x64编译方式_vs2019没有x64-CSDN博客 有用的知识又增加了~

Spring事件

📝个人主页:五敷有你 🔥系列专栏:Spring⛺️稳中求进,晒太阳 Spring事件 简洁 Spring Event(Application Event)就是一个观察者模式,一个bean处理完任务后希望通知其他Bean的…

OpenCV人脸识别C++代码实现Demo

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法。 官网:https://opencv.org/ Github: https://github.com/opencv/opencv Gitcode…

微博一级评论爬虫

cookies需要替换成自己的 import requests import requests from lxml import etree import openpyxl from concurrent.futures.thread import ThreadPoolExecutor import re from datetime import datetime, timedelta from urllib import parse from jsonpath import jsonpa…

查找算法与排序算法

查找算法 二分查找 (要求熟练) // C// 二分查找法(递归实现) int binarySearch(int *nums, int target, int left, int right) // left代表左边界,right代表右边界 {if (left > right) return -1; // 如果左边大于右边,那么…

初始化Linux或者Mac下Docker运行环境

文章目录 1 Mac下安装Docker2 Linux下安装Docker2.1 确定Linux版本2.2 安装Docker2.3 配置加速镜像 3 Docker安装校验4 安装docker-compose4.1 直接下载二进制文件4.2 移动二进制文件到系统路径4.3 设置可执行权限4.4 验证安装 1 Mac下安装Docker mac 安装 docker 还是比较方便…

open3d 处理las点云数据

laspy读取las点云数据 转换格式 open3d 处理:法向量估计 分享给有需要的人,代码质量勿喷。 import numpy as np import os import math import laspy import open3d as o3d# 输入文件夹路径 dirInput = "F://data"# 要筛选的文件后缀 extension = ".las&q…

配置Zephyr编译环境

安装chocolatey 以管理员身份运行PowerShell,然后在PowerShell下执行以下命令,安装chocolatey。 Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol [System.Net.ServicePointManager]::Securi…

自然科学领域基于ChatGPT大模型的科研绘图

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…

【深度学习实战(32)】模型结构之解耦头(de-coupled head)与耦合头(coupled head)

一、传统耦合头局限性 传统的检测模型,如YOLOv3和YOLOv4,使用的是单一的检测头,它同时预测目标类别和框的位置。然而,这种设计存在一些问题。首先,将类别预测和位置预测合并在一个头中,可能导致一个任务的…

机器学习小tip

有监督学习 有监督学习是通过现有训练数据集进行建模,再用模型对新的数据样本进行分类或者回归分析的机器学习 方法。 无监督学习 而无监督学习,或者说非监督式学习,则是在没有训练数据集的情况下,对没有标 签的数据进行分析并…