【STM32】GPIO通用输入输出口

文章目录

  • 一、GPIO的概念
  • 二、STM32中GPIO的基本结构
  • 三、GPIO位结构
    • 输入部分分析
    • 输出部分分析
    • GPIO的8种模式
  • 四、GPIO相关函数

一、GPIO的概念

  • GPIO(General Purpose Input Output),意为通用输入输出口,在嵌入式系统中,GPIO是一种用于与外部设备进行数字信号交互的接口

  • GPIO 可以通过设置为输入或输出模式来读取或控制外部设备的状态(根据使用场景可配置为8种输入输出模式

    • 输出模式下可控制端口输出高低电平,向外部设备发送数字信号,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
    • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
  • 引脚电平:0V~3.3V,部分引脚可容忍5V

    0V 就是低电平,在数字信号中用数据 0 表示

    3.3V 就是高电平,在数字信号中用数据 1 表示

二、STM32中GPIO的基本结构

在这里插入图片描述

【说明】

  • 在STM32中,所有的GPIO都是挂载在APB2外设总线上的

  • 每个GPIO外设有16个引脚,编号从0到15

    GPIOA的第0号引脚一般把它称作PA0,以此类推,一直到PA15(GPIOB引脚也采用一样的命名方式)

  • 在每个GPIO模块内,主要包含了寄存器驱动器

    • 寄存器

      寄存器就是一段特殊的存储器,内核可以通过APB2总线对寄存器读写来实现输出电平和读取电平的功能

      寄存器的每一位就对应一个引脚,其中输出寄存器写1,对应的引脚就会输出高电平,写0就会输出低电平(由于STM32是32位的单片机,所以STM32内部的寄存器都是32位的,但是每个GPIO的端口只有16位,所以寄存器只有低16位有对应端口,高16位是没有用到的)

    • 驱动器

      驱动器用于增加信号的驱动能力(驱动器可以提供更强的电流或电压),寄存器只负责存储数据,如果要进行点灯这样的操作就需要驱动器增加驱动能力

三、GPIO位结构

GPIO位结构是指GPIO中每一位的具体电路结构

在这里插入图片描述

在这里插入图片描述

整体结构可以分为两个部分:输入部分输出部分

在这里插入图片描述

输入部分分析

  • I/O 引脚

    在 I/O 引脚处连接了两个保护二极管,用于对输入电压进行限幅

    上面的二极管接 V D D V_{DD} VDD —— 3.3V,下面的二极管接 V S S V_{SS} VSS —— 0V

    如果输入电压高于 3.3V ,上方的二极管导通,输入电压产生的电流会直接流入 V D D V_{DD} VDD 而不会流入内部电路,从而避免过高电压对内部电路产生伤害

    如果输入电压低于 0V(相对于 V S S V_{SS} VSS 的电压),下方的二极管导通,电流会从 V S S V_{SS} VSS 直接流出,从而避免从内部电路汲取电流

    如果输入电压在 0 ~ 3.3V 之间,那么两个二极管均不会导通

  • 上拉电阻 & 下拉电阻

    上拉电阻连接至 V D D V_{DD} VDD ,下拉电阻连接至 V S S V_{SS} VSS ,这个开关可以通过程序进行配置

    上拉和下拉目的是给输入提供一个默认的输入电平

    • 上拉输入模式默认为高电平的输入模式

      上拉电阻导通连接到高电平 V D D V_{DD} VDD,下拉电阻断开

      当外部设备不驱动引脚时,引脚会被上拉电阻拉到高电平

    • 下拉输入模式默认为低电平的输入模式

      下拉电阻导通连接到低电平 V S S V_{SS} VSS,上拉电阻断开

      当外部设备不驱动引脚时,引脚会被下拉电阻拉到低电平

    • 浮空输入模式

      上拉电阻和下拉电阻都断开,处于高阻态

      当外部设备不驱动引脚时,引脚处于未定义状态,可能会受到环境干扰

  • TTL施密特(肖特基)触发器对输入电压进行整形

    执行逻辑:如果输入电压大于某一阈值,输出就会瞬间升为高电平;如果输入电压小于某一阈值,输出就会瞬间降低为低电平(预防因为输入数字信号失真产生的误判)

    经过施密特触发器整形的波形就可以直接写入输入数据寄存器了

    最后使用程序读取输入数据寄存器对应某一位的数据就可以知道端口的输入电平了

  • 模拟输入 & 复用功能输入 两条线路适用于连接到片上外设的一些端口

    模拟输入:连接到ADC上,因为ADC需要接收模拟量,所以模拟输入线路接在施密特触发器之前

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

输出部分分析

  • 数字部分可以由输出数据寄存器或片上外设控制,两种控制方式通过数据选择器接到了输出控制部分

  • 如果选择通过输出数据寄存器进行控制,就是普通的 I/O 口输出,写输出数据寄存器的某一位就可以操作对应的某个端口了

    • 位设置/清除寄存器:用于单独操作输出数据寄存器的某一位而不影响其他位(因为输出数据寄存器同时控制16个端口,并且该寄存器只能整体读写,所以如果想单独控制器中某一个端口而不影响其他端口的话,就需要通过设置 位设置/清除寄存器 )

      如果想要对某一位进行置 1 的操作,在位设置寄存器的对应位写 1 ,剩下不需要操作的位写 0 即可;
      如果想要对某一位进行清 0 的操作,在位清除寄存器的对应位写 1 ,剩下不需要操作的位写 0 即可

  • P-MOS管 & N-MOS管

    MOS管就是一种电子开关,数字信号用于控制开关的导通和关闭,开关负责将 I/O 口接到 V D D V_{DD} VDD V S S V_{SS} VSS

    • 推挽输出模式

      P-MOS 和 N-MOS 均有效

      数据寄存器为 1 时,上管断开下管导通,输出接到低电平( V S S V_{SS} VSS

      数据寄存器为 0 时,上管导通下管断开,输出接到高电平( V D D V_{DD} VDD

      引脚输出的电平可以是高电平( V D D V_{DD} VDD )或低电平( V S S V_{SS} VSS ),没有电流流过引脚,这是最常见的输出模式

    • 开漏输出模式

      P-MOS 无效, N-MOS 有效

      数据寄存器为 1 时,下管断开,输出相当于断开,即高阻模式

      数据寄存器为 0 时,下管导通,输出接到低电平( V S S V_{SS} VSS

      在开漏输出模式下引脚输出的电平可以是低电平,而不能输出高电平

    • 关闭输出模式

      P-MOS 和 N-MOS 均无效

      输出关闭,端口的电平由外部信号来控制

GPIO的8种模式

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

四、GPIO相关函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);//GPIO_Init是重点
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//初始化一个或者多个IO口(同一组)的工作方式和速度
/*
第一个参数:GPIOx,GPIO的分组,如 GPIOA,GPIOB,GPIOC等的宏定义
第二个参数:GPIO_InitStruct,GPIO的初始化相关结构体结构体里的成员变量:GPIO_Pin:指定具体的IO脚,如GPIO_Pin_0,GPIO_Pin_1GPIO_Mode:指定GPIO的模式GPIO_Speed:指定IO最快翻转速度,也就是当使用IO产生频率(如PWM)的最大速度
*/void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//用于读取指定引脚电平状态的函数,检查某个特定引脚的输入电平是高电平(逻辑1)还是低电平(逻辑0)
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//用于读取指定引脚的输出数据状态的函数,检查某个特定引脚的输出电平是高电平(逻辑1)还是低电平(逻辑0)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//将指定的 GPIO 引脚设置为高电平(逻辑1)的函数
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//将指定的 GPIO 引脚设置为低电平(逻辑0)的函数
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//用于设置指定 GPIO 引脚输出值的函数
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
//用于同时设置指定 GPIO 端口的所有引脚状态的函数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);

有注释的几个函数是常用函数,可以多看一下

不需要一下全部记住,用到的时候多理解


STM32 专栏文章均参考 《STM32入门教程-2023版 细致讲解 中文字幕》教程视频

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

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

相关文章

华为荣耀曲面屏手机下面空白部分设置颜色的方法

荣耀部分机型下面有一块空白区域&#xff0c;如下图红框部分 设置这部分的颜色需要在themes.xml里面设置navigationBarColor属性 <item name"android:navigationBarColor">android:color/white</item>

电子电气架构 --- 整车控制系统

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

STM32 HAL库 SPI驱动1.3寸 OLED屏幕

目录 参考硬件引脚与接线 点亮屏幕CubeMX 配置OLED 驱动程序代码 参考 基于STM32F103C8T6最小系统板HAL库CubeMX SPI驱动7针 OLED显示屏&#xff08;0.96寸 1.3寸通用&#xff09;0.96 oled HAL库驱动 SPI STM32SPI驱动0.96/1.3寸 OLED屏幕&#xff0c;易修改为DMA控制STM32驱…

iOS 18.2 可让欧盟用户删除App Store、Safari、信息、相机和照片应用

升级到 iOS 18.2 之后&#xff0c;欧盟的 iPhone 用户可以完全删除一些核心应用程序&#xff0c;包括 App Store、Safari、信息、相机和 Photos 。苹果在 8 月份表示&#xff0c;计划对其在欧盟的数字市场法案合规性进行更多修改&#xff0c;其中一项更新包括欧盟用户删除系统应…

[前端] 为网站侧边栏添加搜索引擎模块

前言 最近想给我的个人网站侧边栏添加一个搜索引擎模块&#xff0c;可以引导用户帮助本站SEO优化&#xff08;让用户可以通过点击搜索按钮完成一次对本人网站的搜索&#xff0c;从而实现对网站的搜索引擎优化&#xff09;。 最开始&#xff0c;我只是想实现一个简单的百度搜索…

C++ STL 学习指南:带你快速掌握标准模板库

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 大家好呀&#xff01;&#x1f917; 今天我们来聊一聊 C 程序员的必备神器——STL&#xff08;Standard Template Library&#xf…

Oracle视频基础1.3.5练习

Oracle视频基础1.3.4练习 1.3.5 检查数据库启动状态 ps -ef | grep oracle ipcs clear演示alter向前向后改database阶段 sqlplus /nolog conn / as sysdba startup mount alter database nomount # 报错 alter database open启动restricted mode&#xff0c;创建一个connect&…

Unity3D包管理bug某些版本Fbx Exporter插件无法搜索到的问题

这个问题是在使用unity的时候发现的 有些版本里没有Fbx Exporter插件也是没法搜到 经过测试&#xff0c;在package manager中开启Enable Preview Packages也没有用 这个插件在2020已经是正式版了&#xff0c;不需要再开启 后来发现可能是版本bug 需要手动开启 在工程的Pac…

深度学习-学习率调整策略

在深度学习中&#xff0c;学习率调整策略&#xff08;Learning Rate Scheduling&#xff09;用于在训练过程中动态调整学习率&#xff0c;以实现更快的收敛和更好的模型性能。选择合适的学习率策略可以避免模型陷入局部最优、震荡不稳定等问题。下面介绍一些常见的学习率调整策…

Caffeine 手动策略缓存 put() 方法源码解析

BoundedLocalManualCache put() 方法源码解析 先看一下BoundedLocalManualCache的类图 com.github.benmanes.caffeine.cache.BoundedLocalCache中定义的BoundedLocalManualCache静态内部类。 static class BoundedLocalManualCache<K, V> implements LocalManualCache&…

《Qwen2-VL》论文精读【上】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当

1、论文地址Qwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any Resolution 2、Qwen2-VL的Github仓库地址 该论文发表于2024年4月&#xff0c;是Qwen2-VL的续作&#xff0c;截止2024年11月&#xff0c;引用数24 文章目录 1 论文摘要2 引言3 实验3.…

StandardThreadExecutor源码解读与使用(tomcat的线程池实现类)

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java源码解读-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 目录 1.前言 2.线程池基础知识回顾 2.1.线程池的组成 2.2.工作流程 2…

前端埋点与监控最佳实践:从基础到全流程实现.

前端埋点与监控最佳实践&#xff1a;从基础到全流程实现 大纲 我们会从以下三个方向来讲解埋点与监控的知识&#xff1a; 什么是埋点&#xff1f;什么是监控&#xff1f; JS 中实现监控的核心方案 写一个“相对”完整的监控实例 一、什么是埋点&#xff1f;什么是监控&am…

rom定制系列------红米k30_4G版澎湃os安卓13批量线刷固件

&#x1f49d;&#x1f49d;&#x1f49d;红米k30 4G版&#xff0c;机型代码;phoenix.此机型官方固件最后一版为稳定版13.0.6安卓12的固件。客户的软件需运行在至少安卓13的系统至少。测试原生适配有bug。最终测试在第三方澎湃os安卓13的固件可以完美运行。 &#x1f49d;&am…

钉钉平台开发小程序

一、下载小程序开发者工具 官网地址&#xff1a;小程序开发工具 - 钉钉开放平台 客户端类型 下载链接 MacOS x64 https://ur.alipay.com/volans-demo_MiniProgramStudio-x64.dmg MacOS arm64 https://ur.alipay.com/volans-demo_MiniProgramStudio-arm64.dmg Windows ht…

android——渐变色

1、xml的方式实现渐变色 效果图&#xff1a; xml的代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools…

微信小程序生成二维码

目前是在开发小程序端 --> 微信小程序。然后接到需求&#xff1a;根据 form 表单填写内容生成二维码&#xff08;第一版&#xff1a;表单目前需要客户进行自己输入&#xff0c;然后点击生成按钮实时生成二维码&#xff0c;不需要向后端请求&#xff0c;不存如数据库&#xf…

rhce:web服务器

web服务器简介 服务器端&#xff1a;此处使用 nginx 提供 web 服务&#xff0c; RPM 包获取&#xff1a; http://nginx.org/packages/ /etc/nginx/ ├── conf.d #子配置文件目录 ├── default.d ├── fastcgi.conf ├── fastcgi.conf.default ├── fastcgi_params #用…

解决使用netstat查看端口显示FIN_WAIT的问题

解决使用netstat查看端口显示FIN_WAIT的问题 1. 理解`FIN_WAIT`状态2. 检查应用程序3. 检查网络延迟和稳定性4. 更新和修补系统5. 调整TCP参数6. 使用更详细的工具进行分析7. 咨询开发者或技术支持8. 定期监控和评估结论在使用 netstat查看网络连接状态时,如果发现大量连接处…

01LangChain 实战课开篇——AI奇点时刻

LangChain 实战课开篇——AI奇点时刻 课程简介 课程背景&#xff1a;随着ChatGPT和GPT-4的出现&#xff0c;AI技术与实际应用之间的距离变得前所未有的近。LangChain作为基于大模型的应用开发框架&#xff0c;为程序员提供了开发智能应用的新工具。 LangChain 概述 定义&am…