STM32 GPIO的工作模式

发布者:HeavenlyWhisper最新更新时间:2024-07-17 来源: elecfans关键字:STM32  GPIO  工作模式 手机看文章 扫描二维码
随时随地手机看文章

一、前言

在之前围绕STM32的GPIO的基本结构进行了介绍,图1为STM32的5V容忍的GPIO口内部基本结构图,图2为GPIO的基本结构中各个模块部分的概述。


阅读GPIO基本结构的内容能够对GPIO的工作模式有更深的了解。 正是由于GPIO的结构中包含了多样性的电路和模块,因此进行合理的配置组合,就可以使得GPIO应用在不同的工作模式下进行工作。

wKgZomQ4vNeARQHuAAKJ_M8Lauw319.jpg

图1 STM32的5V容忍的GPIO内部基本结构

wKgZomQ4vNeAZLpnAASDapSE-Pw690.jpg

图2 GPIO基本结构包含的功能概述

二、工作模式概述

图3为STM32的GPIO工作模式概述图,从图中可以看出,GPIO端口的静态特征就是指芯片可供你选择的该GPIO的配置,只有通过对使用的GPIO端口进行合理的配置,那么才可以让GPIO处于某一种工作模式下实现合理的动态工作运行。

下一节我们就结合GPIO的基本结构来对不同工作模式下端口的特征及运行方式进行进一步的分析。

wKgaomQ4vNeABxzqAAUcYYGDL2A432.jpg

图3 GPIO工作模式概述

三、工作模式详述

接下来就对STM32的GPIO总共8种工作模式进行一个详细的介绍。

(1)、普通IO推挽输出

图4是普通IO推挽输出。 普通IO口推挽输出就是,对输出数据寄存器进行置0或置1操作,然后通过输出控制缓冲器对双MOS电路进行控制。 IO电平输出的双MOS电路通路同时由PMOS和NMOS组成,当输出控制端输出为1时,上方PMOS导通,下方NMOS截止,电流方向为VDD->PMOS->输出端,对外部引脚输出高电平; 当输出控制端输出为0时,上方PMOS截止,下方NMOS导通, 电流方向为VSS->NMOS->输出端,对外输出低电平。 此时对输入数据寄存器的读访问可得到I/O状态。

GPIO配置成输出模式时,可使用上拉、下拉或悬空模式。 但此时由于输出模式时引脚电平连接到输出数据寄存器,而输出数据寄存器对应引脚的位为0,即引脚初始化后默认输出低电平,所以在这种情况下,上拉只能起到小幅提高输出电流能力,但不会影响引脚的默认状态。

wKgZomQ4vNeACKAcAAJd7f4DIfI151.jpg

图4 普通IO推挽输出

(2)、普通IO开漏输出

图5是普通IO开漏输出。 普通IO开漏输出,就是在输出控制时,不使用双MOS电路中的PMOS,因此无法输出高电平,只有在输出低电平时,NMOS生效。 开漏输出时,只有NMOS工作,这样输出数据寄存器可控制I/O输出高阻态或低电平。 如果要输出高电平,则需要在芯片内部配置上拉电阻(弱上拉)或者在芯片IO外部连接上拉电阻。 此时对输入数据寄存器的读访问可得到I/O状态。

使用开漏输出时,可以实现以下功能:

1)提高IO驱动能力。 MCU的IO口对外驱动的能力很小,即使使用芯片内部的上拉电阻,由于内部上拉阻值很大,驱动能力也有限。 因此使用开漏输出时,可以在IO口外部连接上拉电阻,此时驱动电流芯片由外部上拉电阻电源提供,这样提高驱动和带负载能力

2)电平转换。 如MCU只能对外输出3.3v,但由于GPIO管脚是5v容忍的,输出高电平可以通过外部电源提供,外部电源如果是5v。 此时可以对外输出5v。

3)线与。 多个开漏的引脚可以直接并在一起使用,统一接一个合适的上拉电阻,就可以实现“逻辑与”关系,即当所有引脚均输出高电平时,输出才为高电平,若任一引脚输出低电平,则输出低电平。

wKgZomQ4vNeACwhhAAIyROVMhu8235.jpg

图5 普通IO开漏输出

(3)、复用功能推挽输出

图6是复用功能推挽输出。 GPIO不仅仅可以用作普通的 IO 口输出,还可以作为芯片上其他外设的特殊功能引脚,有些引脚可能可以用作多种不同功能,这种就叫做GPIO的复用,具体用作哪种功能,需要根据使用进行相应的配置。 使用成复用功能时,GPIO就不会经过输出数据寄存器输出,而是直接通过芯片上的具体外设功能电路输出到输出控制缓冲器。 此时通过读输入数据寄存器可获取I/O实际状态,但一般直接用外设的寄存器来获取该数据信号。

使用GPIO复用功能时,当配置成推挽输出,这样片上外设就可以输出高电平或者低电平,例如将GPIO配置成串口USART输出TXD管脚。

需要注意的是,如果需要实现DAC模拟输出,那么也需要将管脚配置成复用功能,但是此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构了,在GPIO结构框图的右下角处,模拟信号直接输出到引脚。

用于复用功能时,可使用上拉、下拉或者浮空模式。 在这种情况下,初始化后引脚默认输出低电平,上拉只起到小幅提高输出电流能力,并不会影响引脚的默认状态。

wKgaomQ4vNeAIH-UAAI8cCT6ziI825.jpg

图6 复用功能推挽输出

(4)、复用功能开漏输出

图7是复用功能开漏输出。 复用功能开漏输出时,GPIO就不会经过输出数据寄存器输出,而是直接通过芯片上的具体外设功能电路输出到输出控制缓冲器。 此时通过读输入数据寄存器可获取I/O实际状态,但一般直接用外设的寄存器来获取该数据信号。

复用开漏输出的功能和普通IO开漏输出功能一致,因此GPIO用作复用功能管脚如果要输出高电平,则需要在芯片内部配置上拉电阻(弱上拉)或者在芯片IO外部连接上拉电阻。 例如将GPIO配置成I2C信号线的时钟管脚SCL和数据管脚SDA。

wKgaomQ4vNeADcBXAAJD9bSmquU484.jpg

图7 复用功能开漏输出

(5)、带上拉输入

图8为GPIO带上拉电阻输入,需要将端口配置为独立的上拉电阻。 可以看到,输入路径经过施密特触发器后,当端口配置为普通IO输入时,该输入路径进入到输入数据寄存器,因此就可以通过输入数据寄存器读取IO口的电平状态,例如将IO口连接按键,读取外部按键的电平状态; 当端口配置成复用功能时,输入路径会直接连接到芯片上具体的外设中去,例如将端口配置成串口USART,那么该IO口就是串口的接收RXD管脚。

输入上拉模式下,GPIO端口悬空无输入信号时,输入端的电平可以默认保持在高电平; 而当输入信号低电平时,IO口读取的电平就是低电平; 当输入信号高电平时,IO口读取的电平自然就是高电平。

wKgZomQ4vNeAMzwjAALIZwedFK0705.jpg

图8 GPIO带上拉输入

(6)、带下拉输入

图9为GPIO带下拉电阻输入,需要将端口配置为独立的下拉电阻。 可以看到,输入路径经过施密特触发器后,当端口配置为普通IO输入时,该输入路径进入到输入数据寄存器,因此就可以通过输入数据寄存器读取IO口的电平状态,例如将IO口连接按键,读取外部按键的电平状态; 当端口配置成复用功能时,输入路径会直接连接到芯片上具体的外设中去,例如将端口配置成串口USART,那么该IO口就是串口的接收RXD管脚。

输入下拉模式下,GPIO端口悬空无输入信号时,输入端的电平可以默认保持在低电平; 而当输入信号高电平时,IO口读取的电平就是高电平; 当输入信号低电平时,IO口读取的电平自然就是低电平。

wKgaomQ4vNeADnC0AALELpeHEpE328.jpg

图9 GPIO带下拉输入

(7)、浮空输入

图10为GPIO浮空输入。 输入浮空模式下,指的是该IO口既不配置接上拉电阻也不配置接下拉电阻。 如果该引脚悬空的情况无信号输入时,该端口的电平是不确定的。 当有电平信号进入IO时,IO电平状态是完全由外部输入决定,MCU复位上电后,默认为浮空输入模式。

wKgZomQ4vNeAJNaIAALM9KaLyl0792.jpg

图10 GPIO浮空输入

(8)、模拟输入

图11为GPIO模拟输入。 当 STM32需要进行 AD( 模数 ) 转换采样时,需要把引脚设置为模拟输入模式,模拟输入模式下,不需要连接上拉和下拉电阻,因为GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的。 这个时候即使在配置了上拉或下拉电阻,也不会影响到模拟信号的输入。

同时输入信号不再经过TTL施密特触发器,可将外部电压信号直接输入到内部的ADC 外设中去。 因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的、连续变化的模拟信号,信号源输入必须在施密特触发器之前。

需要注意到的是,由于模拟输入不接上下拉电阻,也不经过输入的TTL施密特触发器,同时不像输出功能需要经过输出控制缓冲器,因此在芯片上少连接了很多器件,当芯片有不用的管脚时,可以考虑配置成模拟输入以节省功耗。

wKgaomQ4vNeARd84AALmY8NS_yM167.jpg

图11 模拟输入

四、总结

本篇在STM32的GPIO的基本结构的基础上,进一步对GPIO的各种工作模式进行介绍,为GPIO选择不同的模式配置就可以让GPIO在实际使用运行过程中扮演不同的角色,在下一篇将继续介绍GPIO基础知识篇之寄存器原理。


关键字:STM32  GPIO  工作模式 引用地址:STM32 GPIO的工作模式

上一篇:STM32关全局中断的方法 STM32中断类型
下一篇:STM32 CubeMx的安装教程

推荐阅读最新更新时间:2024-11-07 10:20

STM32使用printf丢失第一个字母的问
STM32使用printf函数给串口打印信息的执行步骤为: 1.重定向printf函数 给uart.c文件中增加如下函数: //重定向c库函数printf到USART1 int fputc(int ch, FILE *f) { /* 清SR寄存器中的TC标志 */ USART_ClearFlag(USART1,USART_FLAG_TC); /* 发送一个字节数据到USART1 */ USART_SendData(USART1, (uint8_t) ch); /* 等待发送完毕 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); return (ch
[单片机]
<font color='red'>STM32</font>使用printf丢失第一个字母的问
STM32平台下的FreeRTOS中断配置
Cortex-M 中断 Cortex-M 内核(STM32)的 MCU 提供了一个用于中断管理的嵌套向量中断控制器(NVIC)。Cotex-M3 的 NVIC 最多支持 240 个 IRQ(中断请求)、1 个不可屏蔽中断(NMI)、1 个 Systick(滴答定时器)定时器中断和多个系统异常。 Cortex-M 处理器有多个用于管理中断和异常的可编程寄存器,这些寄存器大多数都在 NVIC 和系统控制块(SCB)中,CMSIS 将这些寄存器定义为结构体。以 STM32F103 为例,打开 core_cm3.h,有两个结构体,NVIC_Type 和 SCB_Type,就存储了这些信息。 优先级分组定义 当多个中断来临的时候处理
[单片机]
STM32-(ADC,DMA,重映射)
STM32的高级功能应用 高级定时器功能框图 时钟源 高级定时器有四个时钟源可以选择: 1.内部时钟CK_INT 内部时钟源CK_INT主要来源于芯片内部,为72M,一般情况下我们都是使用内部时钟。当从模式控制寄存器TIMx_SMCR的SMS位等于000时则使用内部时钟。 2.外部时钟模式1:外部输入引脚TIx(1,2,3,4) 时钟信号输入引脚共有4个,分别是TI(1,2,3,4),及TIM_CH(1,2,3,4)具体使用那一路信号输入引脚,由TIM_CCMRx的位CCxS 配置,其中CCMR1控制TI1/2,CCMR2控制TI3/4. 3.外部时钟模式2:外部触发输入ETR 时钟信号来自定时器的特定输入通道TIMX_ETR
[单片机]
STM32-(ADC,DMA,重映射)
STM32的独立看门狗(IWDG)
一、什么是看门狗: 看门狗就是一种专用定时器。 二、看门狗的功能: 在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。 简单来说就是在系统跑飞(程序异常执行)的情况时,系统复位,程序重新执行。 -------------------------------------------------
[单片机]
<font color='red'>STM32</font>的独立看门狗(IWDG)
STM32外部中断处理流程及注意事项
STM32的外部中断是以组为单位,例如PA0、PB0、PC0、PD0、PE0、PF0、PG0共用外部中断0,我们再使用时从中选择一个座位外部中断0即可,其他中断类推。 外部中断包括EXTI0、EXTI1、EXTI2、EXTI3、EXTI4、EXTI9_5、EXTI15_10,Pin0--Pin4有各自独立的中断, Pin5--Pin9共用一个中断,Pin10--Pin15共用一个中断。 中断号 Pin脚 EXTI0 Pin0 EXTI1 Pin1 EXTI2 Pin2 EXTI3 Pin3 EXTI4 Pin4 EXTI9_5 Pin5--Pin9 EXTI15_10 Pin10--Pin15 外部中
[单片机]
stm32入门开发板选野火还是正点原子
两个可以说都是行业标杆。 不能说哪个比哪个更好,各有特色,适合自己就是最好的,同行之间都是相互参考去做的。 我从以下几个维度来对比下: 1.教程 2.代码 3.开发板价格 4.进阶 一、教程 两家教程都是完全开源的,大家对野火的教程好评比较多,开始几章由浅到深讲解地很好。 有些c基础不是很好的人也能跟上,能理解STM32的外设使用底层也是从寄存器配置进行代码二次封装来的。 后面一些章节似乎换了老师,讲解地更加偏向实际项目,站在初学者的角度,或许听起来有点费劲,但死磕也能学到不少东西。 正点原子的话正好相反,刚开始的几个章节可能对新手不是很友好,反而后半段更适合初学者。 对于初学者来说,其实不需要讲的多深入,最重要是能让
[单片机]
STM32L1xx的库函数有个Bug(stm32l1xx_gpio.c)
在使用STM32L151的时候遇到 GPIO_PinAFConfig(xx,xx,xx)函数无效,有时候还有导致程序HardFault的问题。之前遇到就使用直接寄存器操作避免了这个问题,这次出现了Hardfault,我想这得找找原因了,不然每次都得修改寄存器操作,麻烦的很。 文件“stm32l1xx_gpio.c”中关于GPIO_PinAFConfig 函数式这么定义的。 当使用的引脚号大于8 的时候会导致hardFault的发生。 void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF) { uint32
[单片机]
STM32-GPIO口设为外部中断时,中断函数名称
以A口为例,A0~A4中断函数名称为: void EXTI0_IRQHandler(void ); void EXTI1_IRQHandler(void ); void EXTI2_IRQHandler(void ); void EXTI3_IRQHandler(void ); A5~A9: void EXTI9_5_IRQHandler(void ); A10~A15: void EXTI15_10_IRQHandler(void );
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多开源项目推荐

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved