STM32的GPIO(通用输入输出)有什么用?
STM32的GPIO(通用输入/输出)支持多种工作模式,每种模式都有其特定的应用场景。下面将详细讲解STM32 GPIO的几种主要工作模式及其运行方式:
模拟输入 (GPIO_Mode_AIN): 在此模式下,GPIO引脚关闭了TTL肖特基触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块,如传送至ADC模块,由ADC采集电压信号。使用ADC外设时,必须设置为模拟输入模式。浮空输入 (GPIO_Mode_IN_FLOATING): 配置成此模式时,芯片内部既没有接上拉,也没有接下拉电阻,经由TTL肖特基触发器输入。由于其输入阻抗较大,一般把这种模式用于标准的通信协议如I2C、USART的接收端。下拉输入 (GPIO_Mode_IPD): 在此模式下,I/O端口的电平信号通过TTL肖特基触发器后,进入输入数据寄存器。在I/O端口悬空(无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平时,输入端的电平则为高电平。上拉输入 (GPIO_Mode_IPU): 在此模式下,I/O端口的电平信号通过TTL肖特基触发器后,进入输入数据寄存器。但是在I/O端口悬空(无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平时,输入端的电平则为低电平。开漏输出 (GPIO_Mode_Out_OD): 在此模式下,上方的P-MOS管完全不工作。控制输出为0(低电平)时,N-MOS管导通,使输出接地。控制输出为1(高电平)时,P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。正常使用时必须外部接上拉电阻。推挽输出 (GPIO_Mode_Out_PP): 在此模式下,输入高电平时,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而输入低电平时,N-MOS管导通,P-MOS关闭,对外输出低电平。推挽输出的低电平为0V,高电平为3.3V。复用开漏输出 (GPIO_Mode_AF_OD): 类似于开漏输出模式,但输出的高低电平的来源不是CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的。复用推挽输出 (GPIO_Mode_AF_PP): 类似于推挽输出模式,但输出的高低电平的来源不是CPU直接写输出数据寄存器,而是利用片上外设模块的复用功能输出来决定的。我在高职教STM32——09GPIO入门之按键控制
大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。 对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感 的想法。在这里,我准备陆续把自己花了很多心思设计的教学设计分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!#我要上微头条# #STM32# #单片机系统与管理#
引言
在LED 项目中我们已经体验了GPIO 的强大之处。STM32 芯片除去晶振输入、电源输入、BOOT 引脚,剩下的均为GPIO 引脚。
每个GPIO 引脚可配置为8 种模式,而LED 项目我们只用了“推挽输出”这个模式。除此之外,所有的GPIO 引脚都可以用作外部中断源的输入,不同的引脚还有相应的复用和重映射功能,这些功能的应用需要我们在后续项目中逐步探索。
主要任务: 以按键这种典型的输入设备为例,着重分析GPIO 的模式配置。
本讲参考资料: 《STM32F10xxx 参考手册》、《STM32 固件函数库用户手册》
PS:本人给学生上课选用的洋桃工作室的“洋桃1号”STM32开发板,因此本文所使用的部分图片资料来自厂家,特此声明。
一、细说GPIO的硬件结构和功能——深入了解GPIO 外设及各种应用模式
GPIO结构概览通过GPIO 硬件结构框图,就可以从整体上深入了解GPIO 外设及它的各种应用模式。该图最右端代表STM32 芯片引出的GPIO 引脚,其余部件都位于芯片内部。
GPIO硬件结构框图
GPIO工作模式概览学习GPIO 的8 种模式配置,首先需要根据功能框图分析数据和信号的传输通路,并弄清楚传输通道上各种控制机制的硬件组成及其控制原理。其次,再查看手册中相关寄存器的说明,这样就可以全面掌握该功能模块的操作原理。
GPIO的8种工作模式对比
GPIO基本结构分析 保护二极管GPIO引脚上的保护二极管
当引脚电压高于VDD 时,上方的二极管导通;当引脚电压低于VSS 时,下方的二极管导通。这样就可以防止不正常电压引入芯片导致芯片烧毁。
尽管有这样的保护,并不意味着STM32 的引脚能直接外接大功率驱动器件,如直接驱动电机,强制驱动要么电机不转,要么导致芯片烧坏,必须要加大功率及隔离电路驱动。
MOS管与推挽输出GPIO的推挽输出结构
推挽输出模式一般应用在输出电平为0V和3.3V而且需要高速切换开关状态的场合。在STM32 的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。
推挽等效电路结构
在该结构中输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。
当引脚高低电平切换时,两个管子轮流导通,P-MOS负责灌电流,N-MOS负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。
MOS管与开漏输出开漏输出一般应用在I2C、SMBUS通讯等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出5V的高电平,就可以在外部接一个上拉电阻,上拉电源为5V,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V的电平。
开漏等效电路结构
开漏输出与推挽输出的结构类似,但只有下拉的N-MOS管,而没有上拉的P-MOS管。
在该结构中输入低电平时,经过反向后,N-MOS 管导通,对外输出低电平;而如果在该结构中输入高电平时,N-MOS 管截止,这样既不输出高电平,也不输出低电平,为高阻态。因此,在实际应用中,通常要外接合适的上拉电阻。
开漏输出具有“线与”特性,即多个开漏模式引脚连在一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平。
输出数据寄存器GPIO硬件结构中的输出数据寄存器
前面提到的双MOS管结构电路的输入信号, 是由GPIO“输出数据寄存器GPIOx_ODR”提供的,因此通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。
而“置位/复位寄存器GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。
复用功能输出GPIO硬件结构中的复用功能输出
“复用”是指STM32的其它片上外设对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。
从其它外设引出来的“复用功能输出信号”与GPIO本身的数据寄存器都连接到双MOS管结构的输入中,通过图中的梯形结构作为开关切换选择。
输入数据寄存器GPIO硬件结构中的输入数据寄存器
GPIO引脚经过内部的上、下拉电阻,可以配置成上/下拉输入,然后再连接到施密特触发器,信号经过触发器后,模拟信号转化为0、1 的数字信号,然后存储在“输入数据寄存器GPIOx_IDR”中,通过读取该寄存器就可以了解GPIO引脚的电平状态。
复用功能输入GPIO硬件结构中的复用功能输入
与“复用功能输出”模式类似,在“复用功能输入”模式时,GPIO引脚的信号传输到STM32其它片上外设,由该外设读取引脚状态。
模拟输入GPIO硬件结构中的模拟输入
当GPIO引脚用于ADC 采集电压用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
类似地,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构,模拟信号直接输出到引脚。
GPIO工作模式小结固件库中对GPIO8中工作模式的描述
综上所述,GPIO的结构决定了GPIO的工作模式。在固件库中,GPIO总共有8种细分的工作模式,稍加整理可以大致归类为以下三类:
输入模式(模拟/浮空/上拉/下拉)① 在输入模式时,施密特触发器打开,输出被禁止,可通过输入数据寄存器GPIOx_IDR读取I/O状态。② 上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。③ 浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候用这个模式。④ 模拟输入则用于ADC采集。输出模式(推挽/开漏)① 在输出模式中,推挽模式时双MOS管以轮流方式工作,输出数据寄存器GPIOx_ODR可控制I/O输出高低电平。② 开漏模式时,只有N-MOS管工作,输出数据寄存器可控制I/O输出高阻态或低电平。③ 输出速度可配置为2MHz/10MHz/50MHz的选项。此处的输出速度即I/O支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。④ 在输出模式时施密特触发器是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。复用功能(推挽/开漏)复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器GPIOx_ODR无效;输入可用,通过输入数据寄存器可获取I/O实际状态,但一般直接用外设的寄存器来获取该数据信号。二、按键硬件分析——看懂按键原理图和消抖原理
电路板上的按键核心板上的两个独立按键
按键部分原理图核心板上独立按键的原理图
按键按下时,其对应端口为低电平;反之,未按下时,端口上应为高电平。因此,GPIO 选择“浮空输入模式”(或“上拉输入模式”)。
按键消抖按键机械触点断开、闭合时,由于触点的弹性作用,按键开关不会马上稳定接通或一下子断开,使用按键时会产生图中的带波纹信号,需要消抖处理纹波,否则可能会引起误判。
按键按下和弹起时的抖动
硬件消抖在按键两端并联一个0.1uF的电容,利用电容充放电的延时,消除波纹。原理图上并没有这个电容,因此并未采取这种消抖方式。软件消抖程序上采用延时15ms即可,这种方法我们在学习51单片机的时候已经使用过。三、按键代码分析——继续探索固件库的用法
工程文件清单跟LED工程相比,本工程多了按键这种硬件外设。因此,在Hardware目录下添加key.h和key.c两个文件。
工程文件清单
将key.c文件添加进工程
配置工程环境由于按键用到的仍是GPIO外设,所以stm32f10x_conf.h头文件的配置与LED工程中的保持一致。
配置工程所需的外设库头文件
编写外设文件 key.ckey.c源码
key.hkey.h源码
main.c文件main.c源码解读
关于实现LED电平翻转使用库函数实现LED电平翻转
这段代码首先调用了 GPIO_ReadInputDataBit()函数,读取KEY1端口的电平,然后再将这个读取到的电平取反,最后利用GPIO_WriteBit()函数写入到LED1的端口,从而实现了按下灯亮、松开灯灭的效果。
大家会发现,我们只不过要取反输出,这未免有点复杂了。在51单片机里可以直接利用“LED1= !LED1”就完成了,而在这里使用库的时候,竟然要先读取状态再算出反状态,最后再写入新状态。
能不能也像51单片机那样使用呢?答案是肯定的,我们需要采用CM3内核的位带操作方式来实现同样功能。位带操作这部分知识理解起来会有些难度,有兴趣的同学可以在B站或西瓜视频中搜索“STM32位带操作”进行学习,本课程不涉及这部分内容。
四、项目小结与拓展——总结梳理,举一反三
项目要点梳理同LED的工程,为了使工程更加有条理,我们把按键相关的代码独立分开存储,方便以后移植。在“工程模板”之上新建“key.c”及“key.h”文件,这些文件不属于STM32标准库的内容,是由我们自己根据应用需要编写的。
本工程的几个要点
实验效果验证KEY1按键控制LED1
无锁存效果:按住KEY1不放,LED1亮,松开KEY1,LED1灭。如此可重复。有锁存效果:按一下KEY1松手,LED1亮,再按一下KEY1松手,LED1灭。如此可重复。(本教程完)
相关问答
用C语言实现 GPIO控制 LED 模拟 打地鼠游戏?在一个二维数组中,存放标记。设置难度:分:一次只显示一个一次只显示二个一次只显示三个对应产生2*N个随机数,对应(x,y),设置为1,其它空的设置为0.大概的...
stm32f1的 gpio 有多少种输出工作模式?stm32f1的gpio有四种输出工作模式:-开漏输出(GPIO_Mode_Out_OD)-开漏复用功能(GPIO_Mode_AF_OD)-推挽式输出(GPIO_Mode_Out_PP)-推挽...
树莓派 python用 GPIO模拟 I2C读取霍尔传感器 - OSCHINA - 中...树莓派python用GPIO模拟I2C读取霍尔传感器用树莓派读霍尔传感器(TLI493DA2B6HTSA1)的寄存器值,程序是在网上找大佬的移植过来的,但是跑起来老是会报错...
STM32硬件配置通常使用什么模式?总有8种模式,4种输出,4中输入,请参看官方的固件库GPIO_Mode_AIN模拟输入GPIO_Mode_IN_FLOATING浮空输入GPIO_Mode_IPD下拉输入GPIO_Mod...
mcu的常用外设和功能?MCU(微控制器单元)的常用外设和功能包括:1.通用输入/输出(GPIO):用于连接和控制外部设备,如按钮、LED等。2.串行通信接口(SPI、I2C、UART):用于与...MCU(...
gpio 传输方式?GPIO支持4种输入模式(浮空输入、上拉输入、下拉输入、模拟输入)和4种输出模式(开漏输出、开漏复用输出、推挽输出、推挽复用输出)。GPIO支持4种输入模式(浮空...
单片机SPI编程?1.定义三个gpio:p0-sclk,p1-sdi,p2-sdo;p0用于模拟spi的clock,p1用于接收数据,p2用于f发送数据;硬件上单片机A的p0接单片机B的p0,A的p1接B的p2,...
模拟 量数字量的接法?1。确定一个标准信号(4-20或0-10V)。2。选择一个模拟量输入模块,按模块上的接线方式把线接好,并选择是电流输入还是电压输入。3。这时的标准信号就会通过...
两款芯片硬件都支持SPI通信,如何实现两芯片之间的数据通信啊...三总线SPI中,片选信号被硬件拉低,适用于只有一个从设备的情况,占用单片机的三个GPIO口。三总线SPI的接口连接方式如下图所示。四总线SPI四总线SPI主要由四根线...
广数928g72编程实例及解释?广数928G72是一款数控系统,可以用于加工各种类型的数控机床,如CNC车床、铣床、加工中心等。在广数928G72编程中,以下是一个简单的实例:假设我们要加工一个外...