GPIO的原理

news2024/11/24 3:18:04

GPIO简介

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

关于这个 可容忍5V的意思是,最大的输入电压为5V,但是输出电压最大还是3.3V

下面是stm32的引脚定义图:

Snipaste_2024-10-12_20-40-24

这个FT,就是five tolerate,可以容忍最大的5V输入

GPIO简单结构

Snipaste_2024-10-07_20-16-20

Snipaste_2024-10-13_00-03-19

在输出模式下输入有效,输入下输出无效,因为一个port只能由一个输出,可以有多个输入

首先看引脚部分

保护二级管是给输入电压限伏的

若相对于VDD的电压大于3.3V上面的电路导通

若相对于VSS的电压小于0V下面的电路导通

若输入电压在0~3.3之间就是走中间那条路

对于输入部分

Snipaste_2024-10-13_23-05-18

存在这个的目的就是为了给输入提供一个默认的输入电平,对于只有一个数字的端,不是高就是低,若输入引脚啥也不接,那这是高电平还是低电平呢?处于浮空状态的引脚电平极易受到外界干扰而改变,要上拉或者下拉,若上面接通就是上拉电阻,若下面接通就是下拉电阻

波浪折线就是指电阻,电阻值很大为了不影响正常的输入操作

Snipaste_2024-10-13_23-10-41

这个触发器写错了,这里应该是施密特触发器,为了对输入电压整形

Snipaste_2024-10-13_23-12-30

模拟输入一般是接在ADC上面,然后可以给信号进行整形

复用功能输入,这是数字量,接其他需要读外设的端口量,不需要整形

对于输出部分

位设置寄存器和位清除寄存器是为了单独操作输出R的某一位,而不影响其他位

Snipaste_2024-10-13_23-18-04

位设置寄存器:001000000(将第三位设置为1,其他位不变)

位清除寄存器:001000000(将第三位设置为0,其他位不变)

这是咱们编程函数操作的方式

第二种方法:将输出数据寄存器读出来,按位与/或的方式更改某一位&=,|=

第三种方法:位带方式(不推荐)

Snipaste_2024-10-13_23-29-07

在推挽模式下P/N都有效,当数据控制R为1时候,P导通,N断开,直接VDD,输出高电平,这个模式又叫强推输出模式,这个模式下STM32对I/O口有绝对的控制权

在开漏模式下N工作,P断开,为1时候N断开,P那边相当于高阻值模式,为0时候街接到VSS,输出低电平,这种mode只有低电平有驱动能力

配置GPIO的端口配置寄存器,端口可以配置成以下8种模式

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS

浮空输入时,端口一定要接一个连续的驱动源,不能出现悬空的状态

编程控制LED闪烁

分三步

第一步:使用RCC开启GPIO的时钟

后面打开定时器我们主要是要用到这三个函数

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

这里我们需要用到APB2的这个函数

第二步:使用GPIO_init函数初始化IO口

GPIO全部库函数为:

Snipaste_2024-10-13_23-55-56

void GPIO_DeInit(GPIO_TypeDef* GPIOx); //gpio外设复位
void GPIO_AFIODeInit(void);//复位AFIO外设
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//重要
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//把结构体变量赋一个默认值
//x
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//指定端口设置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//指定端口设置低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//同时对16个port执行写入操作

void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//重要

用结构体函数初始化GPIO口

第三步:使用函数控制GPIO口

先去main函数里面新建一个结构体的局部变量

然后GPIO_InitStructure.按照编辑器的提示来把三个变量写出来

然后在变量类型GPIO_InitTypeDef上go to definition

Snipaste_2024-10-14_08-28-11

知道结构体需要这三个变量,这三个变量的类型一个是16位整型,另外两个都是枚举类型

16位整型只是掩饰

搜索@ref后面的字符串

Snipaste_2024-10-14_08-39-34

Pin_0代表接PA0

typedef enum
{ GPIO_Mode_AIN = 0x0, //Analog IN模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,//IN_FLOATING浮空输入	
  GPIO_Mode_IPD = 0x28,//In Pull Down下拉输入
  GPIO_Mode_IPU = 0x48,//In Pull Up上拉输入
  GPIO_Mode_Out_OD = 0x14,//Out Open Drain开漏输出
  GPIO_Mode_Out_PP = 0x10,//Out Push Pull推挽输出(点灯)
  GPIO_Mode_AF_OD = 0x1C,//Atl Open Drain复用开漏
  GPIO_Mode_AF_PP = 0x18//Atl Push Pull复用推挽
}GPIOMode_TypeDef;

Snipaste_2024-10-14_08-40-47

总结

	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);

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

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

相关文章

【Iceberg分析】Iceberg 1.6.1 源码使用IDEA本地编译

Iceberg 1.6.1 源码使用IDEA本地编译 文章目录 Iceberg 1.6.1 源码使用IDEA本地编译下载文件配置调整gradle相关修改bulid.gradlegradle.properties在IDEA上构建编译打包 可能出现的问题彩蛋与Spark部署Spark与Iceberg集成部署 下载 网络条件允许的情况下,使用git直…

引领智慧文旅新纪元,开启未来旅游新境界

融合创新科技,重塑旅游体验,智慧文旅项目定义旅游新未来 在全球化的浪潮中,旅游已成为连接世界的重要纽带。天津信之鸥科技有限公司(以下简称“信鸥科技”)今日宣布,公司倾力打造的智慧文旅项目正式投入运营…

10.继承与Data Member

目录 1、只要继承不要多态 2、加上多态 3、多重继承 4、虚拟继承 在C继承模型中,一个derived class object所表现出来的东西,是其自己的members加上其base class(es) members的总和。至于derived class members和base class(es) members的排列顺序&a…

基坑气膜:为清洁施工提供强力保障—轻空间

随着城市建设的不断推进,环保要求也日益提高。基坑气膜作为一种新型的施工技术,不仅在防尘降噪方面表现出色,还能支持复杂的施工设备运行,真正实现了从源头解决扬尘和噪音问题。 高效防尘,优化施工环境 传统施工中&…

Hyper-V管理器连接到服务器出错。请检查虚拟机管理服务是否正在运行以及是否授权你连接到此服务器。

尝试连接到服务器”XXXXXX"时出错。请检查虚拟机管理服务是否正在运行以及是否授权你连接到此服务器。 计算机"XXXXXX"上的操作失败: WinRM客户端无法处理该请求。如果身份验证方案与Kerberos不同,或者客户端计算机未加入到域中,则必须使…

工业物联网一直是风口,可视化大屏就是门面

工业物联网作为当下的热门领域,一直处于风口浪尖。而在这个领域中,可视化大屏确实充当着重要的门面角色。 可视化大屏以其震撼的视觉效果和直观的数据展示,为工业物联网赋予了强大的表现力。当人们走进工业物联网的应用场景,首先映…

Jina ColBERT v2: 一个多语言的晚期交互信息检索模型

Jina AI发布 Jina ColBERT v2版本, Jina ColBERT v2是一个多语言的晚期交互(Late Interaction)信息检索模型,基于BERT架构开发,旨在优化查询和文档之间的匹配和排序。用于在搜索引擎、推荐系统、问答系统等应用中实现高…

20 个精选 Midjourney SREFs 及额外代码,等你来用!

今天我整理了 Midjourney 的参考 ID 801 到 850,并选择了 20 种色彩和艺术风格多样的样式。灵感来源于 _旧金山的彩绘女士_,这是加利福尼亚州著名的排屋系列。 我使用文本提示“城市中的一组排屋”生成了图像,并应用了 20 个选定的 SREF。每张…

【Java】I/O 操作详解

📃个人主页:island1314 ⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞 目录 1. 引言 🚀 2. File 类 📕 2.1 创建 File 对象 …

讲个故事(升级版)1.0

一、总述 离线强化学习(Offline RL)是交互推荐中的一种常用技术,它离线地学习离线数据以学习策略而不必与用户进行在线交互。Offline RL存在高估用户对离线数据中很少出现的物品的偏好的问题,当前采用了保守主义去解决这一问题&a…

基于SpringBoot的流浪动物救助系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

新160个crackme -081-fireworx.9

运行分析 输入key,点击OK无反应 PE分析 Delphi程序,32位,无壳 静态分析&动态调试 ida搜索关键字符串,双击进入函数 通过静态分析,发现程序逻辑:1、获得固定值"678234",转换为int2…

网络学习第二篇

认识网关和路由器 这里大家先了解一下什么三层设备。 三层设备 三层设备是指在网络架构中能够工作在第三层(网络层)的设备,通常包括三层交换机和路由器。这些设备可以根据IP地址进行数据包的转发和路由选择,从而在不同的网络之间…

【Solr】Solr搜索引擎下载、安装、使用及跟Elasticsearch的对比(保姆篇)

文章目录 Solr简单介绍Solr 版本与 JDK版本 兼容情况安装与配置(Windows)安装与配置(Linux)应用案例(电商产品搜索系统)为什么要用Solr,不用数据库的模糊查询Solr对比Elasticsearch 更多相关内容可查看 Solr官方文档&a…

JAVA智能代驾跑腿系统一站式服务系统源码小程序

​探索“智能代驾跑腿系统”的便捷魅力 🚗 一、智能代驾:安全出行的首选 在这个快节奏的城市生活中,偶尔的聚会小酌或深夜加班后,如何安全回家成了不少人心中的小困扰。幸运的是,“智能代驾跑腿系统”应运而生&#x…

RJ45网线T568B接法

目录 1.说明 2.应用 3.方法 4.网络制作注意 1.说明 常规的网线T568B和T568A,为了保持最佳的兼容性,普遍采用T568B标准来制作。 2.应用 T568B:主要应用于平行线(即直连线)和交叉线(用于两台设备之间的直接连接,如两台计算机互连或计算机…

应用商店上新:MainConcept Transcoder和Live Streaming Software App

在Akamai云计算平台上运行工作负载的你也许还不知道,为了帮助用户更容易地找到并快速部署各类解决方案,Akamai提供了一个丰富的应用商店(Marketplace),其中包含各类经过验证,可以在Akamai云计算平台上轻松部…

自由学习记录(7)

文件的判断是否存在,带上文件自己的名字 XmlSerializer (Person)serializer.Deserialize(reader); 如果出错之后,没有try来接,就会直接程序报错暂停, 有了的话无论如何都会继续正常进final using则是正常 为什么要用 using&a…

DICOM是什么?如何成为医学成像和通讯的国际标准的?

DICOM DICOM是医学数字成像和通信标准(Digital Imaging and Communications in Medicine),它是一种用于描述医学图像及其元数据如何存储和在设备间传输的标准。 DICOM标准支持多种医学成像模态的数据存储,包括CT、PET、MRI、X射线…

Golang | Leetcode Golang题解之第478题在圆内随机生成点

题目: 题解: type Solution struct {radius, xCenter, yCenter float64 }func Constructor(radius, xCenter, yCenter float64) Solution {return Solution{radius, xCenter, yCenter} }func (s *Solution) RandPoint() []float64 {r : math.Sqrt(rand.…