历史上的今天
返回首页

历史上的今天

今天是:2025年11月18日(星期二)

正在发生

2022年11月18日 | STM32入门系列-GPIO结构

2022-11-18 来源:zhihu

已经了解了STM32 GPIO的基本概念及引脚分类。现在来看下STM32 GPIO内部的结构是怎样的。IO端口位的基本结构如下图所示。

从图中可以看出GPIO内部结构还是比较复杂的,只要将这张GPIO结构图理解好,那么关于GPIO的各种应用模式将非常清楚。图中最右端I/O端口就是STM32芯片的引脚,其它部分都在STM32芯片内部。上图中我们将每部分都用红色数字标号了,按照顺序我们逐一讲解。

  • 保护二极管

引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT或VDD时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。

尽管STM32芯片内部有这样的保护,但并不意味着STM32的引脚就无所不能,如果直接将引脚连接大功率器件,比如电机,那么要么电机不转,要么烧坏芯片。如果要驱动一些大功率器件,必须要加大功率及隔离电路驱动。也可以说STM32引脚是用来做控制,而不是做驱动使用的。

  • 上下拉电阻

从图中可以看到,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。STM32 上下拉及浮空模式的配置是通过GPIOx_CRL和GPIOx_CRH寄存器控制的,大家在《STM32F1xx中文参考手册》查阅。STM32内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。

  • P-MOS和N-MOS管

GPIO引脚经过两个保护二极管后就分成两路,上面一路是“输入模式”,下面一路是“输出模式”。我们先讲输出模式,线路经过一个由P-MOS和N-MOS管组成的单元电路,这让GPIO引脚具有了推挽和开漏两种输出模式。所谓推挽输出模式,是根据P-MOS和N-MOS管的工作方式命名的。在该结构单元输入一个高电平时,P-MOS管导通,N-MOS管截止(可以将P-MOS当作NPN三极管,N-MOS当作PNP三极管来看就非常清楚),对外输出高电平(3.3V)。


在该单元输入一个低电平时,P-MOS管截止,N-MOS管导通, 对外输出低电平 (0V) 。如果当切换输入高低电平时,两个MOS管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。下图为推挽输出模式的等效电路。



在开漏输出模式时,不论输入是高电平还是低电平,P-MOS 管总处于关闭状态。当给这个单元电路输入低电平时,N-MOS 管导通,输出即为低电平。当输入高电平时,N-MOS 管截止,这个时候引脚状态既不是高电平,又不是低电平,我们称之为高阻态。如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。开漏输出模式等效电路图如下图所示。



在开漏输出模式中还有一个特点,引脚具有“线与”关系。就是说如果有很多个开漏输出模式的引脚接在一起,只要有一个引脚为低电平,其他所有管脚都为低,即把所有引脚连接在一起的这条总线拉低了。只有当所有引脚输出高阻态时这条总线的电平才由上拉电阻的 VDD 决定。如果 VDD 连接的是 3.3V,那么引脚输出的就是 3.3V,如果 VDD 连接的是 5V,那么引脚输出的就是 5V。因此如果想要让 STM32 管脚输出 5V,可以选择开漏输出模式,然后在外接上拉电阻的电源 VDD 选择 5V 即可,前提是这个 STM32 引脚是容忍 5V 的。开漏输出模式一般应用在 I2C、SMBUS 通讯等需要“线与”功能的总线电路中。还可以用在电平不匹配的场合中,就如上面说的输出 5V 一样。


推挽输出模式一般应用在输出电平为0-3.3V而且需要高速切换开关状态的场合。除了必须要用开漏输出模式的场合,我们一般选择推挽输出模式。要配置引脚是开漏输出还是推挽输出模式可以使用GPIOx_CRL和GPIOx_CRH寄存器, 寄存器详细内容可以参考《STM32F1xx 中文参考手册》“通用和复用I/O(GPIO和AFIO)”章节。

  • 输出数据寄存器

前面提到的双 MOS 管结构电路的输入信号,是由 GPIO“输出数据寄存器GPIOx_ODR”提供的, 因此我们通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。而“置位/复位寄存器 GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。

  • 复用功能输出

由于STM32的GPIO引脚具有第二功能,因此当使用复用功能的时候,也就是通过其他外设复用功能输出信号与GPIO数据寄存器一起连接到双MOS管电路的输入,其中梯形结构是用来选择使用复用功能还是普通IO口功能。例如我们使用USART串口通讯时,需要用到某个GPIO引脚作为通讯发送引脚,这时候就可以把该GPIO引脚配置成USART串口复用功能, 由串口外设控制这个脚,发送数据。

  • 输入数据寄存器

输入数据寄存器是由IO口经过上下拉电阻、肖特基触发器引入。当信号经过触发器,模拟信号将变为数字信号0或1,然后存储在输入数据寄存器中,通过读取输入数据寄存器GPIOx_IDR就可以知道IO口的电平状态。

  • 复用功能输入

此模式与前面讲解的复用功能输出类似。在复用功能输入模式时,GPIO引脚的信号传输到STM32其他片上外设,由该外设读取引脚的状态。同样,如我们使用USART串口通讯时,需要用到某个GPIO引脚作为通讯接收引脚,这个时候就可以把该GPIO引脚配置成USART串口复用功能, 使USART可以通过该通讯引脚的接收远端数据。

  • 模拟输入输出

当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的, 因为经过施密特触发器后信号只有0、1两种状态,ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。类似地,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构了,模拟信号直接通过管脚输出


推荐阅读

史海拾趣

HM International公司的发展小趣事

机顶盒,全称为数字视频变换盒,是现代家庭娱乐中不可或缺的重要设备。从广义上讲,任何与电视机连接的网络终端设备均可视为机顶盒,其发展历程涵盖了从模拟频道增补器到数字卫星、地面及有线电视机顶盒的广泛范畴。而从狭义角度看,机顶盒特指那些具备数字处理能力的设备,如IPTV机顶盒、DVB-S卫星机顶盒、DVB-T地面机顶盒及DVB-C有线电视机顶盒等。

机顶盒的核心功能在于接收并转换数字电视信号,使之能在传统或智能电视上播放。它不仅能接收来自有线电缆、卫星天线及宽带网络的信号,还能提供电子节目指南、网页浏览等增值服务。通过机顶盒,用户能够享受到高清乃至4K超高清的电视节目,体验更为细腻的画面和震撼的音效。此外,机顶盒还具备网络交互能力,支持在线购物、观看网络视频、玩游戏等多元化活动,使电视机从单向接收信息的设备转变为智能互动终端。

随着技术的不断进步,机顶盒正朝着高清化、智能化方向发展。未来,机顶盒将不仅限于基本的信号接收与解码功能,还将融入更多智能推荐、语音识别等先进技术,为用户提供更加个性化、便捷的娱乐体验。总之,机顶盒作为连接电视与互联网的桥梁,正以其丰富的功能和广泛的应用场景,不断满足用户日益增长的娱乐需求。

Firadec公司的发展小趣事

背景:随着全球环保意识的增强,绿色电子产品成为了市场的新宠。Firadec公司积极响应环保号召,致力于开发绿色电子产品。

发展:公司投入大量资源研发环保材料和生产工艺,成功推出了一系列符合环保标准的电子产品。同时,Firadec还建立了完善的回收体系,对废旧电子产品进行回收再利用。

影响:环保和可持续发展的理念不仅提升了Firadec公司的品牌形象,也为其赢得了更多消费者的青睐。公司因此在绿色电子产品市场中占据了领先地位。

EFINIX公司的发展小趣事

为了加速Quantum™可编程加速器技术的商业化进程,EFINIX公司与中芯国际集成电路制造有限公司展开合作。中芯国际是世界领先的集成电路晶圆代工企业之一,其先进的制造能力为EFINIX公司提供了强有力的支持。双方合作仅用了不到六个月的时间,就成功交付了首批Quantum™可编程加速器产品样本,创造了行业内的里程碑。

Connector City公司的发展小趣事

随着国内市场的饱和,Connector City公司开始寻求海外市场的发展机遇。公司制定了详细的国际化战略,积极开拓海外市场,加强与国外客户的合作与交流。同时,公司还注重本土化运营,根据不同国家和地区的市场需求和文化差异,灵活调整产品设计和营销策略。通过不断拓展海外市场,公司的销售业绩实现了快速增长。

General Instrument Optoelectronics公司的发展小趣事
确保电源线没有损坏或接触不良。
Bud Industries公司的发展小趣事
通过外接音频处理器(如均衡器、效果器等)来进一步改善音质。

问答坊 | AI 解惑

用L3M ARM AD输入电压范围为0-3.3V,而ARM片内基准电压为3V,如何解决?

用L3M系列ARM的AD输入电压范围为0-3.3V,而ARM的片内基准电压为3V,有什么好方法?…

查看全部问答>

关于Intel IEGD9.1.1开发环境问题

近来在Inltel Atom平台N270上想搭配640x480 单6bit LVDS Panel,来实现CRT+LVDS双显功能,但发现Intel发布IGMA VGA驱动安装后,Panel不会显示,因此现想借助Intel IEGD9.1.1开发环境定制IEGD驱动,因此现想请各位好友告知哪里有IEGD9.1.1安装包,来 ...…

查看全部问答>

请教:单片机读取flash芯片上的命令数据?

我想实现一个功能,就是用一个单片机(如:AVR的),一个flash闪存芯片(容量大的,类似U盘上的那种),我想让单片机通过I/O接口读取放在flash芯片上的命令数据(一个2进制的文件?),然后经过单片机的CPU处理,执行命令,完成指定动作。目的:( ...…

查看全部问答>

触摸屏响应有问题???

原来用的小屏一切正常,触摸响应很快,现在使用了大屏,触摸响应很慢,采样次数下降了很多,这是怎么回事?? ps:大屏的触摸屏是好的,在linux下测试正常。wince下触摸优先级119…

查看全部问答>

关于宏的定义

uchar Printf_CHINESE32x32_ASC16x32(bit cr, uchar uRow, uchar uCol, char *fmt, ...); uchar dprintf(bit flag, uchar fontASC, fontCHI, uchar uRow, uchar uCol, char *fmt, ...); 如何定义一个宏,使这两个函数通用? #define   ...…

查看全部问答>

对论坛的博客的一些建议

本来打算记点东西给自己看的,但是必须选择系统给出的分类,选择板块发表.感觉不太合适.…

查看全部问答>

关于LM3S写管脚“~0”

见到一个帖子中关于写管脚“~0”用1代替说不行,有见到一个帖子说“~0”用1代替说行,那究竟行还是不行,这里给出完满的答案。 ============================================================ 看看函数原型 void GPIOPinWrite(unsigned long u ...…

查看全部问答>

3.5库的时钟初始化与SYSTICK实现延时的问题

新手求助。。。 使用3.5的库,根据描述。。库中默认为外部8mhz。我也就没设置。。然后进行systick初始化。。和延时函数定义。。但下到板子里。。定时不准。。已开始以为是延时函数的问题,后来把systick的初始化包括延时函数都放到其他历程中(此 ...…

查看全部问答>

基于MSP430单片机的称重式液位仪的设计

基于MSP430单片机的称重式液位仪的设计 时间:2011-10-06 18:06:36 来源: 作者: 1引言   液位测控仪是属于智能化仪器仪表的一种(指采用了微处理器的仪器仪表),其发展始于70年代[1]。它是一种集测量与控制于一体的智能化产品,适用于石 ...…

查看全部问答>