STM32 GPIO

GPIO(通用输入输出口,General Purpose Input Output)接口的功能是让嵌入式处理器能够通过软件灵活地读出或控制单个物理引脚上的高、低电平,实现内核和外部系统之间的信息交换。 GPIO是嵌入式处理器使用最多的外设,能够充分利用其通用性和灵活性,是嵌入式开发者必须掌握的重要技能。 作为输入时,GPIO可以接收来自外部的开关量信号、脉冲信号等,如来自键盘、拨码开关的信号。 作为输出时,GPIO可以将内部的数据传送给外部设备或模块,如输出到LED、数码管、控制继电器等。另外,理论上讲,当嵌入式处理器上没有足够的外设时,可以通过软件控制GPIO模拟UART、SPI、I2C、FSMC等各种外设的功能。

以STM32F103ZET6为例,它共有7个端口(PA、PB、PC、PD、PE、PF和PG),每个端口有16个GPIO,共7×16=112个GPIO。 几乎在所有的嵌入式系统应用中,都涉及开关量的输入和输出功能,例如状态指示、报警输出、继电器闭合和断开、按钮状态读入、开关量报警信息的输入等。这些开关量的输入和控制输出都可以通过GPIO接口实现。 GPIO接口的每个位都可以由软件分别配置成以下模式。

(1)输入浮空:浮空(floating)就是逻辑器件的输入引脚既不接高电平,也不接低电平。由于逻辑器件的内部结构,当它输入引脚浮空时,相当于该引脚接了高电平。一般实际运用时,引脚不建议浮空,易受干扰。

(2)输入上拉:上拉就是把电压拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻钳位在高电平。电阻同时起限流作用。弱强只是上拉电阻的阻值不同,没有什么严格区分。

(3)输入下拉:下拉就是把电压拉低,拉到GND。与上拉原理相似。

(4)模拟输入:模拟输入是指传统方式的模拟量输入。数字输入是输入数字信号,即0和1的二进制数字信号。

(5)开漏输出:输出端相当于三极管的集电极。要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对较强(一般20mA以内)。

(6)推挽式输出:可以输出高低电平,连接数字器件;推挽结构一般是指两个三极管分别受两个互补信号的控制,总是在一个三极管导通时另一个截止。

(7)推挽式复用输出:可以理解为GPIO接口被用作第二功能时的配置情况(并非作为通用I/O口使用)。STM32 GPIO的推挽复用模式,复用功能模式中输出使能、输出速度可配置。这种复用模式可工作在开漏及推挽模式,但是输出信号是源于其他外设的,这时的输出数据寄存器 GPIOx_ODR 是无效的;而且输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器获取该数据信号。

(8)开漏复用输出:复用功能可以理解为GPIO接口被用作第二功能时的配置情况(即并非作为通用I/O口使用)。 一个I/O接口的基本结构如图所示。

STM32的GPIO资源非常丰富,包括26、37、51、80、112个多功能双向5V的兼容的快速I/O接口,而且所有的I/O接口可以映射到16个外部中断,对于STM32的学习,应该从最基本的GPIO开始学习。 每个GPIO端口具有7组寄存器: 2个32位配置寄存器(GPIOx_CRL,GPIOx_CRH); 2个32位数据寄存器(GPIOx_IDR,GPIOx_ODR); 1个32位置位/复位寄存器(GPIOx_BSRR); 1个16位复位寄存器(GPIOx_BRR); 1个32位锁定寄存器(GPIC_LCKR I/O接口位的基本结构包括以下几部分。

输入通道

输入通道包括输入数据寄存器和输入驱动器(带虚框部分)。在接近I/O引脚处连接了两只保护二极管。 根据TTL 肖特基触发器、上拉电阻端和下拉电阻端两个开关的状态,GPIO的输入可分为以下4种: (1)模拟输入:TTL肖特基触发器关闭。 (2)上拉输入:GPIO内置上拉电阻,此时GPIO内部上拉电阻端的开关闭合,GPIO内部下拉电阻端的开关打开。该模式下,引脚在默认情况下输入为高电平。

输出通道

输出通道包括位设置/清除寄存器、输出数据寄存器、输出驱动器。 GPIO的输出驱动器主要由多路选择器、输出控制逻辑和一对互补的MOS管组成。

(1)多路选择器。 多路选择器根据用户设置决定该引脚是GPIO普通输出还是复用功能输出。 ① 普通输出:该引脚的输出来自GPIO的输出数据寄存器。

② 复用功能(Alternate Function,AF)输出:该引脚的输出来自片上外设,并且一个STM32微控制器引脚输出可能来自多个不同外设,即一个引脚可以对应多个复用功能输出。但同一时刻,一个引脚只能使用这些复用功能中的一个,而这个引脚对应的其他复用功能都处于禁止状态。

(2)输出控制逻辑和一对互补的MOS管。 输出控制逻辑根据用户设置通过控制P-MOS管和N-MOS管的状态(导通/关闭)决定GPIO输出模式(推挽、开漏还是关闭)。

STM32的GPIO功能

复位期间和刚复位后,复用功能未开启,I/O口被配置成浮空输入模式。 复位后,JTAG引脚被置于输入上拉或下拉模式。 (1)PA13:JTMS置于上拉模式。 (2)PA14:JTCK置于下拉模式。 (3)PA15:JTDI置于上拉模式。 (4)PB4:JNTRST置于上拉模式。

当作为输出配置时,写到输出数据寄存器(GPIOx_ODR)上的值输出到相应的I/O引脚。可以以推挽模式或开漏模式(当输出0时,只有N-MOS被打开)使用输出驱动器。 输入数据寄存器(GPIOx_IDR)在每个APB2时钟周期捕捉I/O引脚上的数据。 所有GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活也可以被断开。

当对GPIOx_ODR的个别位编程时,软件不需要禁止中断:在单次APB2写操作中,可以只更改一个或多个位。这是通过对“置位/复位寄存器”(GPIOx_BSRR,复位是GPIOx_BRR)中想要更改的位写1实现的。没被选择的位将不被更改。

所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

复用功能(AF)

使用默认复用功能前必须对端口位配置寄存器编程。

(1)对于复用输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动。

(2)对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。

(3)对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。此时,输入驱动器被配置成浮空输入模式。 如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接。 如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,那么它的输出将不确定。

STM32F103微控制器的I/O引脚除了通用功能外,还可以设置为一些片上外设的复用功能。而且,一个I/O引脚除了可以作为某个默认外设的复用引脚外,还可以作为其他多个不同外设的复用引脚。类似地,一个片上外设,除了默认的复用引脚,还可以有多个备用的复用引脚。在基于STM32微控制器的应用开发中,用户根据实际需要可以把某些外设的复用功能从默认引脚转移到备用引脚上,这就是外设复用功能的I/O引脚重映射。

输入配置

当I/O口配置为输入时:

(1)输出缓冲器被禁止。

(2)施密特触发输入被激活。

(3)根据输入配置(上拉,下拉或浮动)的不同,弱上拉和下拉电阻被连接。

(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。

(5)对输入数据寄存器的读访问可得到I/O状。

输出配置

当I/O口被配置为输出时:

(1)输出缓冲器被激活。 ① 开漏模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将端口置于高阻状态(P-MOS从不被激活)。 ② 推挽模式:输出寄存器上的0激活N-MOS,而输出寄存器上的1将激活P-MOS。

(2)施密特触发输入被激活。

(3)弱上拉和下拉电阻被禁止。

(4)出现在I/O引脚上的数据在每个APB2时钟被采样到输入数据寄存器。

(5)在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。

(6)在推挽式模式时,对输出数据寄存器的读访问得到最后一次写的值。

复用功能配置

当I/O口被配置为复用功能时:

(1)在开漏或推挽式配置中,输出缓冲器被打开。

(2)内置外设的信号驱动输出缓冲器(复用功能输出)。

(3)施密特触发输入被激活。

(4)弱上拉和下拉电阻被禁止。

(5)在每个APB2时钟周期,出现在I/O引脚上的数据被采样到输入数据寄存器。

(6)开漏模式时,读输入数据寄存器时可得到I/O口状态。

(7)在推挽模式时,读输出数据寄存器时可得到最后一次写的值。 一组复用功能I/O寄存器允许用户把一些复用功能重新映像到不同的引脚。

模拟输入配置

当I/O口被配置为模拟输入配置时:

(1)输出缓冲器被禁止。

(2)禁止施密特触发输入,实现了每个模拟I/O引脚上的零消耗。施密特触发输出值被强置为0。 (3)弱上拉和下拉电阻被禁止。

(4)读取输入数据寄存器时数值为0。

输出速度

如果STM32F103的I/O引脚工作在某个输出模式下,通常还需设置其输出速度,这个输出速度指的是I/O口驱动电路的响应速度,而不是输出信号的速度。输出信号的速度取决于软件程序。 STM32F103的I/O引脚的输出速度有3种选择:2MHz、10MHz和50MHz。下面,根据一些常见的应用,给读者一些选用参考:

(1)连接LED、蜂鸣器等外部设备的普通输出引脚:一般设置为2MHz。

(2)用作USART复用功能输出引脚:假设 USART工作时最大比特率为115.2Kb/s,选用2MHz的响应速度也足够了,既省电,噪声又小。

(3)用作I2C复用功能的输出引脚:假设I2C工作时最大比特率为400Kb/s,那么2MHz的引脚速度或许不够,这时可以选用10MHz的I/O引脚速度。

(4)用作 SPI复用功能的输出引脚:假设SPI工作时比特率为18Mb/s或9Mb/s,那么10MHz的引脚速度显然不够,这时需要选用50MHz的I/O引脚速度。

(5)用作FSMC复用功能连接存储器的输出引脚:一般设置为50MHz的I/O引脚速度。

外部中断映射和事件输出

借助AFIO,STM32F103微控制器的I/O引脚不仅可以实现外设复用功能的重映射,而且可以实现外部中断映射和事件输出。需要注意的是,如需使用STM32F103微控制器I/O引脚的以上功能,都必须先打开APB2总线上的AFIO时钟。

1.    外部中断映射 当STM32F103微控制器的某个I/O引脚被映射为外部中断线后,该I/O引脚就可以成为一个外部中断源,可以在这个1/O引脚上产生外部中断实现对用户STM32 运行程序的交互。 STM32F103微控制器的所有I/O引脚都具有外部中断能力。每个外部中断线EXTI LineXX和所有的GPIO端口 GPIO[A..G].xx共享。为了使用外部中断线,该I/O引脚必须配置成输入模式。

2.    事件输出 STM32F103微控制器几乎每个I/O引脚(除端口F和G的引脚外)都可用作事件输出。例如,使用SEV指令产生脉冲,通过事件输出信号将STM32F103从低功耗模式中唤醒。

GPIO的HAL驱动程序

GPIO引脚的操作主要包括初始化、读取引脚输入和设置引脚输出,相关的HAL驱动程序定义在文件stm32f1xx_hal_gpio.h中

1.    初始化函数HAL_GPIO_Init() 函数HAL_GPIO_Init()用于对一个端口的一个或多个相同功能的引脚进行初始化设置,包括输入/输出模式、上拉或下拉等。其原型定义如下: void  HAL_GPIO_Init(GPIO_TypeDef *GPIOx,GPIO_InitTypeDef *GPIO_Init); 其中,第1个参数GPIOx是GPIO_TypeDef类型的结构体指针,它定义了端口的各个寄存器的偏移地址,实际调用函数HAL_GPIO_Init()时使用端口的基地址作为参数GPIOx的值,在文件stm32f103xx.h中定义了各个端口的基地址。 第2个参数GPIO_Init是一个GPIO InitTypeDef类型的结构体指针,它定义了GPIO引脚的属性。

2.    设置引脚输出的函数HAL GPIO_WritePin() 使用函数HAL_GPIO_WritePin()向一个或多个引脚输出高电平或低电平,其原型定义如下: void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin,GPIO_PinState PinState); 其中,参数GPIOx是具体的端口基地址;GPIO Pin是引脚号;PinState是引脚输出电平,是枚举类型GPIO_PinState。

3.    读取引脚输入的函数HAL_GPIO_ReadPin() 函数HAL_GPIO_ReadPin()用于读取一个引脚的输入状态,其原型定义如下: GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin); 函数的返回值是枚举类型GPIO_PinState。常量GPIO_PIN_RESET表示输入为0(低电平),常量GPIO_PIN SET表示输入为1(高电平)。

4.    翻转引脚输出的函数HAL_GPIO_TogglePin() 函数HAL_GPIO_TogglePin()用于翻转引脚的输出状态。例如,引脚当前输出为高电平,执行此函数后,引脚输出为低电平。其原型定义如下,只需传递端口号和引脚号: void  HAL_GPIO_TogglePin (GPIO_TypeDef* GPIOx,uint16_t  GPIO_Pin)

STM32的GPIO使用流程

根据IO端口的特定硬件特征,IO端口的每个引脚都可以由软件配置成多种工作模式。 在运行程序之前必须对每个用到的引脚功能进行配置。

(1)如果某些引脚的复用功能没有使用,可以先配置为通用输入输出GPIO。

(2)如果某些引脚的复用功能被使用,需要对复用的IO端口进行配置。

(3)IO具有锁定机制,允许冻结IO。当在一个端口位上执行了锁定(LOCK)程序后,在下一次复位之前,将不能再更改端口位的配置。

GPIO是最基本的应用,其基本配置方法为:

(1)配置GPIO时钟,完成初始化。

(2)利用函数HAL_GPIO_Init 配置引脚,包括引脚名称、引脚传输速率、引脚工作模式。

(3)完成HAL_GPIO_Init的设置。

IO复用功能AFIO配置

IO功能AFIO常对应到外设的输入输出功能。使用时,需要先配置IO为复用功能,打开AFIO时钟,然后再根据不同的复用功能进行配置。对应外设的输入输出功能有下述3情况:

(1)外设对应的引脚为输出:需要根据外围电路的配置选择对应的引脚为复用功能的推挽输出或复用功能的开漏输出。

(2)外设对应的引脚为输入:根据外围电路的配置可以选择浮空输入、带上拉输入或带下拉输入。

(3)ADC对应的引脚:配置引脚为模拟输入。

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

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

相关文章

甲虫身体图像分割系统源码&数据集分享

甲虫身体图像分割系统源码&数据集分享 [yolov8-seg-EfficientRepBiPAN&yolov8-seg-C2f-FocusedLinearAttention等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challen…

毕设开源 大数据电影数据分析与可视化系统(源码+论文)

文章目录 0 前言1 项目运行效果2 设计概要3 最后 0 前言 🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师…

简单粗暴理解GNN、GCN、GAT

GNN 思想:近朱者赤近墨者黑 GNN的流程: 聚合(把邻居的信息贴到自己身上来,作为它自己特征的补足)更新循环(为什么要多次?看以下例子) GNN能干嘛? 1.结点分类&#xf…

【多线程】多线程(12):多线程环境下使用哈希表

【多线程环境下使用哈希表(重点掌握)】 可以使用类:“ConcurrentHashMap” ★ConcurrentHashMap对比HashMap和Hashtable的优化点 1.优化了锁的粒度【最核心】 //Hashtable的加锁,就是直接给put,get等方法加上synch…

【网络协议】TCP协议常用机制——延迟应答、捎带应答、面向字节流、异常处理,保姆级详解,建议收藏

💐个人主页:初晴~ 📚相关专栏:计算机网络那些事 前几篇文章,博主带大家梳理了一下TCP协议的几个核心机制,比如保证可靠性的 确认应答、超时重传 机制,和提高传输效率的 滑动窗口及其相关优化机…

Qt实现Halcon窗口显示当前图片坐标

一、前言 Halcon加载图片的窗口,不仅能放大和缩小图片,还可以按住Ctrl键显示鼠标下的灰度值,这种方式很方便我们分析缺陷的灰度和对比度。 二、实现方式 ① 创建显示坐标和灰度的widget窗口 下图的是widget部件,使用了4个label控…

常说的风险评估,那么「基于风险的测试 (RBT)」如何测试?

基于风险的测试 (RBT) 是一种测试方法,它根据风险的概率和影响确定测试活动的优先级。它涉及在潜在问题发生之前识别它们,并将资源分配给风险最高的测试区域。 在 RBT 中,“风险”是指缺陷的可能性及其对系统运行或业…

DS线性表之单链表的讲解和实现(2)

文章目录 前言一、链表的概念二、链表的分类三、链表的结构四、前置知识准备五、单链表的模拟实现定义头节点初始化单链表销毁单链表打印单链表申请节点头插数据尾插数据头删数据尾删数据查询数据在pos位置之后插入数据删除pos位置之后的数据 总结 前言 本篇的单链表完全来说是…

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题,就是在服务器外网架设时,建好角色点开始游戏提示此服务器满员,这个问题一般比较少见,而且出现的话一般都是GEE引擎的版本。 他折腾了半天,一直没进游戏&#x…

Apache Linkis + OceanBase:如何提升数据分析效率

计算中间件 Apache Linkis 构建了一个计算中间件层,以实现上层应用程序和底层数据引擎之间的连接、治理和编排。目前,已经支持通过数据源的功能,实现用户通过Linkis 对接并使用 OceanBase数据库。 本文详细阐述了在 Apache Linkis v1.3.2中&a…

VGG16模型实现MNIST图像分类

MNIST图像数据集 MNIST(Modified National Institute of Standards and Technology)是一个经典的机器学习数据集,常用于训练和测试图像处理和机器学习算法,特别是在数字识别领域。该数据集包含了大约 7 万张手写数字图片&#xf…

线性代数在大一计算机课程中的重要性

线性代数在大一计算机课程中的重要性 线性代数是一门研究向量空间、矩阵运算和线性变换的数学学科,在计算机科学中有着广泛的应用。大一的计算机课程中,线性代数的学习为学生们掌握许多计算机领域的关键概念打下了坚实的基础。本文将介绍线性代数的基本…

高考技术——pandas使用

百家讲坛,谈论古今,今天我们不聊别的,我们来聊一聊中国的国宝——大熊猫(bushi) 好好,言归正传,我们今天来讲pandas import pandas as pd 申明无需多言,高考主要考察Series和Data…

Milvus向量数据库管理工具[Attu]实践

Attu是一款专为Milvus向量数据库打造的开源数据库管理工具,提供了便捷的图形化界面,极大地简化了对Milvus数据库的操作与管理流程。阿里云Milvus集成了Attu,以便更加高效地管理数据库、集合(Collection)、索引&#xf…

第四次论文问题知识点及问题

1、NP-hard问题 NP-hard,指所有NP问题都能在多项式时间复杂度内归约到的问题。 2、启发式算法 ‌‌启发式算法(heuristic algorithm)是相对于最优化算法提出的。它是一种基于直观或经验构造的算法,旨在以可接受的花费给出待解决…

树莓派3b安装ubuntu18.04服务器系统server配置网线连接

下载ubuntu镜像网址 img镜像,即树莓派官方烧录器使用的镜像网址 ubuntu18.04-server:ARM/RaspberryPi - Ubuntu Wiki 其他版本:Index of /ubuntu/releases 下载后解压即可。 发现使用官方烧录器烧录配置时配置wifi无论如何都不能使用&am…

GO网络编程(三):海量用户通信系统1:登录功能初步

一、准备工作 需求分析 1)用户注册 2)用户登录 3)显示在线用户列表 4)群聊(广播) 5)点对点聊天 6)离线留言 主界面 首先,在项目根目录下初始化mod,然后按照如下结构设计目录: 海量用户通信系统/ ├── go.mod ├── client/ │ ├──…

【C++】基于红黑树封装set和map

🚀个人主页:小羊 🚀所属专栏:C 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 前言一、更高维度的泛型二、模版参数三、比较逻辑的重写四、迭代器4.1 const迭代器4.2 重载4.3 - -重载 五、完整代…

阿里P8面试官推荐学习的11大专题:java面试精讲框架文档

本篇文章给大家分享一波,阿里P8面试官推荐学习的11大专题:java面试精讲框架文档,主要包含11大块的内容:spring、springcloud、netty、zookeeper、kafka、Hadoop、HBASE、Cassandra、elasticsearch、spark、flink;希望大…

【C++入门篇 - 3】:从C到C++第二篇

文章目录 从C到C第二篇new和delete命名空间命名空间的访问 cin和coutstring的基本使用 从C到C第二篇 new和delete 在C中用来向系统申请堆区的内存空间 New的作用相当于C语言中的malloc Delete的作用相当于C语言中的free 注意:在C语言中,如果内存不够…