STM32-GPIO工作方式

2024.1.31补充1.1、1.6部分细节

肖特基触发器和施密特触发器是一样的。TTL肖特基触发器是什么?_肖基特触发器-CSDN博客

 

一、GPIO的八种输入输出模式

GPIO端口的每个位可以由软件分别配置成八种输入输出模式。

1.1输入浮空模式

下图黄色区域是该种模式电路,此时上拉和下拉电阻的开关打开,施密特触发器打开。

在I/O口写入电平->进入输入驱动器->通过施密特触发器->进入输入数据寄存器,CPU读出

 输入浮空一般多用于外部按键输入。在输入浮空状态下,I/O口的电平状态不确定,由外部决定。

同时I/O端口还有两个保护二极管,那他们有什么作用呢?

在芯片的内部有些线路承受的电压有限(既不能承受过高的电压,又不能承受过低的电压),那两个保护二极管也就是保护电路的作用。

当有一些电压波动进入I/O口时,若电压大于VDD时,则上方保护二极管导通,波动电压被VDD吸收;当波动电压小于VSS时,下方保护二极管导通,波动电压被VSS吸收。

这两个二极管仅能在瞬间电压波动时起保护作用,当长时间接入高电压或者低电压依旧会损坏芯片。(不同的引脚承受的电压也不同,需要自己查手册)

施密特触发器是用来稳定电平,有时外部输入的电压并不稳定(不是标准的3.3V或者0V),

1.2输入上拉模式

基本结构和输入浮空模式差不多,区别在于此时输入上拉电阻的开关闭合。

由于上拉电阻的存在,可以把I/O口上的不确定的信号上拉至高电平,也就是说此种模式下I/O口默认为高电平。

1.3输入下拉模式

基本结构和输入浮空模式差不多,区别在于此时输入下拉电阻的开关闭合。

由于下拉电阻的存在,可以把I/O口上的不确定的信号拉低至低电平,也就是说此种模式下I/O口默认为低电平。

1.4输入模拟模式

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块。

1.5开漏输出

CPU在输出数据寄存器写入电平->输出控制电路。

只能输出强低电平,高电平需要上拉电阻拉高。

当写入高电平时,N-MOS管截止导致I/O口的电平不是高电平,而是由外部的上拉或下拉电阻决定。也就是说输出电平由外接的上拉或者下拉电阻确定。同时I/O口电平也可以由输入工作模式读取进去。

当写入低电平时,此时N-MOS管处于导通状态,I/O口的电平会被N-MOS管拉低至Vss(低电平),也就是说此时I/O口输出低电平。同时I/O口电平也可以由输入工作模式读取进去。

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

以下为具体实现结构:

输入高电平时,经过反相器,此时G点为低电平,UG=US,MOS管截止,输出电压由VDD决定,输出高电平;

输入低电平时,经过反相器,此时G点为高电平,UG>US,MOS管导通,输出电压被拉低至Vss(低电压);

图中N-MOS管中的二极管是寄生二极管,起到保护MOS管的作用。当DS极之间的电压过高时,这个寄生二极管会反向击穿,让大电流流入地中,从而保护了MOS管。

详解请看:MOS管知识通俗易懂教程 - 知乎

1.6推挽输出

不需要上拉电阻即可实现高低电平的输出,可作为双向I/O口使用。

可以输出强高低电平,基本结构和开漏输出类似。

对于推挽输出控制电路输出为“1”时,P-MOS导通,N-MOS截止,I/O口输出高电平;

当控制电路输出为“0”时,P-MOS截止,N-MOS导通,I/O口输出低电平;

同时I/O口电平也可以由输入工作模式读取进去。

以下为具体实现结构:

输入高电平时,经过反相器,此时G点为低电平,NMOS管UG=US,NMOS管截止,而PMOS管Ugs>0,PMOS管导通,输出高电平(被VDD拉高);

输入低电平时,经过反相器,此时G点为高电平,PMOS管US=UG,PMOS管截止,而NMOS管UG>US,NMOS管导通,输出电压被拉低至Vss(低电压);

需要注意的是:

推挽输出是由来自芯片的电压驱动,开漏输出是由来自外部的电压源驱动。

看似开漏输出有些缺点,但也是他的优点,它可以驱动需要大电压的元件,更加的灵活。

 

推挽输出开漏输出
高电平

P-MOS导通,N-MOS断开

输出高电平

P-MOS导通,N-MOS断开

输出电压由外部电路决定

低电平

P-MOS断开,N-MOS导通

输出低电平

P-MOS断开,N-MOS导通

输出低电平

优点

不需要外接电源

直接输出高电压

配合外接电压源,灵活使用
缺点

只能输出来自芯片的高电压

(3.3V)

无法输出高电平,需要外接电源

1.7开漏复用输出

可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用IO口使用),端口必须配置成复用功能输出模式(推挽或开漏),同时得到高电平也需要上拉电阻。

1.8推挽复用输出

GPIO口被用作第二功能时的配置的情况。

 二、GPIO相关配置寄存器

stm32共有七组GPIO,分别为GPIOA~GPIOG;

每组GPIO共有16个I/O口,例如GPIOA0~GPIOA15;

每组GPI/O端口有:

两个32位配置寄存器

  • GPIOx_CRL:端口配置低寄存器
  • GPIOx_CRH:端口配置高寄存器

两个32位数据寄存器 

  • GPIOx_IDR:端口输入寄存器
  • GPIOx_ODR:端口输出寄存器

一个32位置位/复位寄存器

  • GPIOx_BSRR:端口位设置/清除寄存器

一个16位复位寄存器

  • GPIOx_BRR:端口位清除寄存器

一个32位锁定寄存器

  • GPIOx_LCKR:端口配置锁存寄存器

 每组I/O口含有上面的七个寄存器,进而控制每组I/O的16个I/O口。

2.1端口配置寄存器 

上面的两个32位端口配置寄存器(GPIOx_CRL和GPIOx_CRH)他们每四位才能控制一个I/O口,也就是说一个32位端口配置寄存器能控制32/4=8个I/O口,两个32为端口配置寄存器才能控制每组I/O的16个I/O口。

假设是GPIOA,CRL控制低八位(PA0~PA7),CRH控制高八位(PA8~PA15)

2.1.1端口配置低寄存器(GPIOx_CRL)

可以看到上图有16个小方块, 每个小方块包含两位,则两个小方块控制一个I/O口。

 这四位中MODE0[1:0]控制输入输出的模式及输出模式的端口速率(看下图),看其英文MODE就是模式的意思。

 CNF0[1:0]控制输入输出的哪种模式(看下图)

 需要指出的是在输入模式下1 0 到底是上拉还是下拉模式,涉及到后面的寄存器,这里不做分析。

但是可以看下图先了解一下

 2.1.2端口配置高寄存器(GPIOx_CRH)

CRL和CRH的作用是一样的,区别在于CRH控制标号为8~15的I/O口。

2.2端口数据输入寄存器(GPIOx_IDR)

IDR寄存器的低16位,每个位控制该组I/O的16个I/O口,每个位对应的是此I/O口的输入电平是高电平还是低电平。

 2.3端口数据输出寄存器(GPIOx_ODR)

和IDR类似,ODR寄存器的低16位,每个位控制该组I/O的16个I/O口,每个位对应的是此I/O口的输出电平是高电平还是低电平。

前面提过,ODR寄存器还可以配置在输入模式下是上拉还是下拉,在输入模式下ODR可以配置成上拉或者下拉模式,在输出模式下可以配置I/O口的输出电平。

 2.4端口位设置/清除寄存器(GPIOx_BSRR)

这个寄存器也可以配置I/O口输出是高电平还是低电平,它的低16位,可以设置I/O口输出模式。

假如设置为1,则对应的ODR寄存器的位为1,设置为0,则不对ODR寄存器对应的位产生任何影响。

而高16位则相反:

那么这样一来好像端口位设置/清除寄存器也能达到控制输出电平的目的?

前面我们学过原理图,CPU首先写入端口位设置/清除寄存器,然后由它达到控制端口数据输出寄存器的目的。

 有些人觉得多此一举,明明都可以通过端口数据输出寄存器设置输出电平了为什么还要搞一个“太上皇”控制它呢?

欸,在某些实时场景里面大有作为!

我是初学者,不甚清除,看这个:

STM32F10x系列GPIO寄存器BRR、BSRR、ODR、IDR的使用理解(1) - 知乎

https://www.cnblogs.com/shangdawei/p/4723941.html

2.5端口位清除寄存器(GPIOx_BRR)

BRR寄存器实际上作用不是很大,作用和BSRR高16位的作用是一样的。所以在实际的使用过程中,我们通常使用BSRR的低16位,和BRR的低16位(所以BSRR的高16位不经常使用)

2.6端口配置锁存寄存器(GPIOx_LCKR)

用的比较少,暂时先不作讨论

 三、stm32引脚说明

3.1端口复用功能

stm32有144个引脚,前面知道他有112个I/O口,那这样对于资源的分配就太不合理了,比如用于外设的资源就非常少了,所以STM32的大部分端口都具有复用功能。

所谓复用,就是一些端口不仅仅可以做为通用IO口,还可以复用为一些外设引脚,比如PA9,PA10可以复用为STM32的串口1引脚。

作用:最大限度的利用端口资源

 3.2端口重映射功能

就是可以把某些功能引脚映射到其他引脚。比如串口1默认引脚是PA9,PA10可以通过配置重映射映射到PB6,PB7

作用:方便布线

待补充,待更新...

  • 36
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值