历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2021年11月09日 | GPIO简介

2021-11-09 来源:eefocus

一、GPIO是什么

GPIO(general porpose intput output):通用输入输出端口的简称。可以通过软件控制其输出和输入。stm32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通信,控制以及数据采集的功能。


二、STM32引脚分类

电源管脚: 引脚图中的 VDD、VSS、VREF+、VREF-、VSSA、VDDA 等都属于电源引脚。


晶振管脚:引脚图中的 PC14、PC15 和 OSC_IN、OSC_OUT 都属于晶振引脚,不过它们还可以作为普通引脚使用。


复位管脚: 引脚图中的 NRST 属于复位引脚,不做其他功能使用。


下载引脚:引脚图中的 PA13、PA14、PA15、PB3 和 PB4 属于 JTAG 或SW 下载引脚。不过它们还可以作为普通引脚或者特殊功能使用,具体的功能可以查看芯片数据手册,里面都会有附加功能说明。当然,STM32 的串口功能引脚也是可以作为下载引脚使用。

T BOOT  引脚:引脚图中的 BOOT0 和 PB2(BOOT1)属于 BOOT 引脚,PB2 还可以作为普通管脚使用。在 STM32 启动中会有模式选择,其中就是依靠着 BOOT0和 BOOT1 的电平来决定。


GPIO管脚:引脚图中的 PA、PB、PC、PD 等均属于 GPIO 引脚。从引脚图可以看出,GPIO 占用了 STM32 芯片大部分的引脚。并且每一个端口都有 16 个引脚,比如 PA 端口,它有 PA0-PA15。其他的 PB、PC 等端口是一样的。


三、GPIO内部结构

图中最右端 I/O 端口是STM32 芯片的引脚,其它部分都在 STM32 芯片内部


(1)、保护二极管


引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。

当引脚电压高于 VDD_FT 或 VDD 时,上方的二极管导通吸收这个高电压。

当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。


(2)、上下拉电阻


上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。


当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。


将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。


STM32 上下拉及浮空模式的配置是通过GPIOx_CRL 和 GPIOx_CRH 寄存器控制的。


STM32 内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。


(3)、P-MOS 和 和 S N-MOS 


GPIO 引脚经过两个保护二极管后就分成两路,

上面一路是“输入模式”,下面一路是“输出模式”。

输出模式,线路经过一个由 P-MOS 和 N-MOS管组成的单元电路,这让 GPIO 引脚具有了推挽和开漏两种输出模式。


推挽输出模式,是根据 P-MOS 和 N-MOS 管的工作方式命名的。


在该结构单元输入一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(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 寄存器。


(4)、输出数据寄存器

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


(5)、复用功能输出


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


(6)、输入数据寄存器


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


(7)、复用功能输入


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


(8)、模拟输入输出


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


四、GPIO的工作模式

通过 GPIO 内部的结构关系,决定了 GPIO 可以配置成以下几种模式。


4.1、输入模式(模拟、上拉、下拉、浮空)

在输入模式时,施密特触发器打开,输出被禁止。


可通过输入数据寄存器GPIOx_IDR 读取 I/O 状态。


输入模式可以配置为模拟、上拉、下拉以及浮空模式。上拉和下拉输入很好理解,默认的电平由上拉或者下拉决定。


浮空输入的电平是不确定的,完全由外部的输入决定,一般接按键的时候可以使用这个模式。


模拟输入则用于 ADC 采集。


4.2、输出模式(推挽/ / 开漏)

在输出模式中,推挽模式时双 MOS 管以推挽方式工作,输出数据寄存器GPIOx_ODR 可控制 I/O 输出高低电平。

开漏模式时,只有 N-MOS 管工作,输出数据寄存器可控制 I/O 输出高阻态或低电平。

输出速度可配置,有2MHz25MHz50MHz 的选项。此处的输出速度即 I/O 支持的高低电平状态最高切换频率,支持的频率越高,功耗越大,如果功耗要求不严格,把速度设置成最大即可。


在输出模式时,施密特触发器是打开的,即输入可用,通过输入数据寄存器 GPIOx_IDR 可读取 I/O 的实际状态。


4.3、复用功能(推挽/ / 开漏)

复用功能模式中,输出使能,输出速度可配置,可工作在开漏及推挽模式,但是输出信号源于其它外设,输出数据寄存器 GPIOx_ODR 无效;输入可用,通过输入数据寄存器可获取 I/O 实际状态,但一般直接用外设的寄存器来获取该数据信号。


4.4、模拟输入输出(上下拉无影响)

模拟输入输出模式中,双 MOS 管结构被关闭,施密特触发器停用,上/下拉也被禁止。其它外设通过模拟通道进行输入输出。通过对 GPIO 寄存器写入不同的参数,就可以改变 GPIO 的应用模式,再强调一下,要了解具体寄存器时一定要查阅《STM32F1xx 参考手册》中对应外设的寄存器说明。在 GPIO 外设中,通过设置“端口配置寄存器 GPIOx_CRL 和 GPIOx_CRH”可配置 GPIO 的工作模式和输出速度。CRH 控制端口的高八位,CRL 控制端口的低八位。

推荐阅读

史海拾趣

台湾固锝(GD)公司的发展小趣事
接入输入信号后,观察输出信号的变化情况,调整增益控制参数以观察其对输出信号的影响。
對餘科技(DIOFIT)公司的发展小趣事

在追求经济效益的同时,DIOFIT公司也积极履行社会责任,致力于环保事业。他们注重节能减排和资源循环利用,采用环保材料和生产工艺,降低产品对环境的污染。同时,DIOFIT公司还积极参与各类公益活动,为社会发展和环境保护贡献自己的力量。

Crystal Clear Technology公司的发展小趣事

面对全球电子市场的竞争压力,Crystal Clear Technology决定加快国际化步伐。公司先后在多个国家设立研发中心和生产基地,利用当地的资源和优势,提升产品的竞争力和生产效率。同时,公司还积极参与国际展览和交流活动,与国际同行建立广泛的合作关系,为公司的发展注入了新的活力。

欧密格光电(Amicc)公司的发展小趣事

Crystal Clear Technology自创立之初,便专注于研发新型显示技术。面对市场上日益增长的高清显示需求,公司投入大量资源进行技术研发,成功推出了一款具有高清晰度和广视角的显示屏产品。这一创新产品迅速获得市场认可,为Crystal Clear Technology打开了新的销售渠道,并奠定了公司在行业内的技术领先地位。

登丰微(GSTEK)公司的发展小趣事

歌普电子科技有限公司以自有品牌(GEPU歌普)创立于2006年,公司最初在台湾设立,随后逐步扩展至江苏和东莞,形成了跨区域的研发、生产和销售网络。公司自创立之初便专注于各式线对板连接器、板对板连接器、网络连接器等产品的研发与设计。通过不断的技术积累和市场需求洞察,歌普逐渐在连接器领域建立了自己的市场地位。

CET Technology公司的发展小趣事

CET Technology一直以来都高度重视产品质量和技术研发。为了保障产品的品质和可靠性,公司建立了完善的实验室体系,包括电磁兼容实验室、电气综合实验室等多个专业实验室。这些实验室配备了先进的实验仪器设备,为公司研发高品质产品提供了有力保障。近期,CET的实验室成功获得了CNAS实验室能力认证,这是对公司技术实力和质量管理水平的高度认可。此次认证将进一步提升CET在国际市场上的竞争力,为公司未来的发展奠定了坚实基础。

以上就是关于CET Technology公司在电子行业中的5个发展故事。这些故事展示了CET在技术创新、业务拓展、智慧化转型和品质保障等方面的努力和成果,也体现了公司在电子行业中的领先地位和影响力。

问答坊 | AI 解惑

几个硬件设计经验

鸡毛蒜皮之一:成本节约 现象一:这些拉高/拉低的电阻用多大的阻值关系不大,就选个整数5K吧 点评:市场上不存在5K的阻值,最接近的是4.99K(精度1%),其次是5.1K(精度5%),其 成本分别比精度为20%的4.7K高4倍和2倍。20%精度的电阻阻值只有1 ...…

查看全部问答>

汽车安全与维修~~有了问题,到这里来找找答案吧!

1. 汽车气囊注意事项 >> https://bbs.eeworld.com.cn/thread-715-1-51.html 2. 汽车转速传感器的维修 >>https://bbs.eeworld.com.cn/thread-455-1-51.html 3. 解析奥迪防盗器7位密码的秘密>>https://bbs.eeworld.com.cn/thread-432-1-50.html 4. ...…

查看全部问答>

求职英语(一):个人品质英语词汇大全

个人品质有用词汇able 有才干的,能干的 active 主动的,活跃的 adaptable 适应性强的 adroit 灵巧的,机敏的 aggressive 有进取心的 alert 机灵的 ambitious 有雄心壮志的 amiable 和蔼可亲的 amicable 友好的 analytical 善于分析的 ap ...…

查看全部问答>

viewdraw的库怎么加啊

想用viewdraw画电路导出网表作hspice住真,但是没有viewdraw的库  哪位大大给个库啊 谢谢了 fab100@163.com…

查看全部问答>

单片机时钟电路中的数码管驱动电路

.系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A-H端口上; (2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1-S8端口上; 动态数码 ...…

查看全部问答>

如何确定器件参数

我做的是一个单片开关电源,如图所示。U1用的是NCP1000,我要VO输出12V、100mA. 该如何设计变压器T2的参数,反馈绕组电压电流该确定为多少? 望高手指教…

查看全部问答>

关于模电数电的问题

最近在疯狂学习模电数电,感觉数电还可以,就是逻辑设计。但是模电实在太让我头大了,各种放大电路太抽象了,原理倒是能搞懂,只是到底是干嘛的根本不清楚,还要用各种分析方法去分析,根本记不住。请教各位大大,各位学习模电数电的时候是如何学习 ...…

查看全部问答>

如何精确线程循环周期

有个线程 while(1) {     f1();     Sleep(100); } 本来初衷是使这个线程每100毫秒循环一次,但是由于Sleep函数的不精确,以及f1()的执行时间不确定,因此,次线程循环周期总是不能精确到100毫秒,有没有什么方法能使此线 ...…

查看全部问答>

MC-1000中,如何对背光进行控制

在开发MC-1000中,想在程序一开启就把背光灯打开,用什么函数来控制打开背光呢,各位老大,请赐教。在线等。。。急。我用的时evc4.0开发平台。…

查看全部问答>

LM3S9B92烧写不成功及FLASH烧写次数限制

请问9b92 C1版本的FLASH是不是有烧写限制?是多少次?我在网上看到一些说是的100次左右,这说法是否正确? 同时能否解释下下面的问题?谢谢~~~ 我下载时提示“Could not power up debug port: Control/Status register reads 000000F0” 用JLINK ...…

查看全部问答>