STM32——GPIO

  • Post author:
  • Post category:其他


一、STM32F10x——GPIO

1、一个标准I/O端口的基本结构

一个能容忍5V电压的GPIO端口结构,与上面的区别就在于红色框框所示:

2、器件作用

(1)保护二极管

防止引脚外部过高或过低的电压输入。当引脚电压高于VDD时,上方的二极管导通,防止过高电压进入芯片内部烧坏芯片;当引脚电压低于VSS时,下方的二极管导通,防止电压过低,从芯片内部汲取电流。

(2)

施密特触发器



具有滤波作用,可作为波形整形电路,能将模拟信号波形整形为数字电路能够处理的方波波形。

3、GPIO端口模式及配置


(1)通用输出模式:需要配置是推挽输出还是开漏输出,需要配置最大输出速度,不需要配置弱上下拉电阻,此时输出的电平完全取决于输出寄存器的值;

(2)复用输出模式:需要配置是复用推挽输出还是复用开漏输出,需要配置最大输出速度,不需要配置弱上下拉电阻,此时输出的电平跟输出寄存器的值完全没关系,其输出的电平完全取决于外设的输出;

(3)输入模式:分为普通输入、模拟输入和复用输入

普通输入需要配置上下拉电阻:弱上拉输入/弱下拉输入/浮空输入,不需要配置最大输出速度。

如果是浮空输入,那么输入寄存器的值是不确定的,除非GPIO外部接了上下拉电阻。而输出寄存器的值不需要关心,即原来输出寄存器是什么值就是什么值;

如果是弱下拉输入,那么输入寄存器在没有高电平信号输入进来,值恒定为0,除非外部接了强上拉电阻,会使输入寄存器在没有低电平信号输入进来时值恒定为1。而输出寄存器的值会在配置为弱下拉输入时变为0,此后也不会关心输入寄存器的值,即就算输入寄存器的值变化了也没有影响。

如果是弱上拉输入,那么输入寄存器在没有低电平信号输入进来,值恒定为1,除非外部接了强下拉电阻,会使输入寄存器在没有高电平信号输入进来时值恒定为0。而输出寄存器的值会在配置为弱上拉输入时变为1,此后也不会关心输入寄存器的值,即就算输入寄存器的值变化了也没有影响。

模拟输入:只需要配置输入为模拟输入即可,其输入的信号不会经过施密特触发器,并且不会经过输入寄存器而是直接进入到外设中,因此此时输入寄存器、输出寄存器的值都不需要关心。

4、默认情况

(1)当芯片复位后,所有端口引脚都被配置成

浮空输入

模式,除了JTAG 引脚:

PA15: JTDI in PU(输入上拉模式)

PA14: JTCK in PD(输入下拉模式)

PA13: JTMS in PU

PB4: NJTRST in PU

(2)当配置为输出模式,却没有对输出类型(推挽/开漏)进行配置,则

默认为推挽输出;

若没有写入任何数据进入输出数据寄存器,那么输出数据寄存器默认都为0,即配置为输出模式后,没有进行任何操作时,

输出默认是为低电平的。

(3)在每个 APB2 时钟周期都会在GPIO引脚上捕获数据到输入数据寄存器。因此尽管配置了引脚为输出模式,但是仍然可以获取输入信号的值。

5、外部中断/唤醒线

所有端口都具有外部中断的能力,要使用外部中断线,端口必须配置为输入模式。

6、输入模式

7、输出模式

8、复用功能模式

GPIO端口有四种模式:输入模式、通用输出模式、复用功能模式、模拟模式。使用哪种模式由GPIO  端口模式寄存器 (GPIOx_MODER) (x = A..I) 进行配置。

基本结构

二、输出模式

输出缓冲器被打开,

施密特触发器输入也被打开

,因此在输出模式下,输入数据寄存器依然每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样,可对输入数据寄存器进行读访问来获取 I/O 状态。

我们可对置位复位寄存器进行写数据或者直接对输出数据寄存器进行写数据来将电平输入到输出控制中,在输出控制中其实里面还有个

反相器。

1、对于

推挽输出

,PMOS和NMOS都有效,轮流工作:


(1)当输出数据寄存器输出高电平,则引脚也输出高电平


(2)当输出数据寄存器输出低电平,则引脚也输出低电平

2、对于

开漏输出

,PMOS不激活,NMOS有效


当输出数据寄存器输出高电平,则引脚处于高阻态:

PMOS无效,而此时NMOS又是截止状态,此时如果没有加上拉/下拉电阻,则输出高阻态相当于断路。


当输出数据寄存器输出低电平,则引脚也输出低电平:

PMOS无效,NMOS导通,引脚接地输出低电平。


一般开漏输出会接上拉电阻,这个电阻可以是单片机内部的,也可以是外接的

。这样,当输入IN为低电平时,NMOS关闭,由于接了上拉电阻,输出OUT为高电平。开漏输出常用于I2C等双向通信接口(通信线路上的信号可以往两个方向走),以I2C为例,总线接上拉电阻,总线上的设备在默认情况下都没有输出,总线处于高电平状态,一旦有任一个设备输出低电平,整个总线都被拉低,其它设备都可以读到这个低电平。

三、模拟模式


输出缓冲器被禁止



施密特触发器输入停用

,I/O 引脚的每个模拟输入的功耗变为零。

施密特触发器的输出被强制处理为恒定值 (0)



弱上拉和下拉电阻被关闭



对输入数据寄存器的读访问值为“0”。


注意: 在模拟配置中, I/O  引脚不能为 5 V  容忍。

我们可以从IO引脚输入模拟信号到片上外设(例如ADC),也可以从片上外设输出模拟信号到IO引脚。

四、复用功能模式

当配置为复用功能模式时,引脚的控制权就完全交由片上外设控制,此时引脚即可输入也可输出。因此我们需要配置推挽或开漏、上拉或下拉或无上拉下拉。

六、GPIO的引脚速度

GPIO 引脚速度: GPIO_Speed_2MHz     (10MHz, 50MHz) ;

又称输出驱动电路的响应速度:(芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,

达到最佳的噪声控制和降低功耗的目的

。)

可理解为:

输出驱动电路的带宽

:即一个驱动电路可以不失真地通过信号的最大频率。

如果一个信号的频率超过了驱动电路的响应速度,就有可能信号失真。(信号频率为10MHz,而你配置了2MHz的带宽,则10MHz的方波很可能就变成了正弦波。就好比是公路的设计时速,汽车速度低于设计时速时,可以平稳地运行,如果超过设计时速就会颠簸,甚至翻车。)

如果GPIO驱动电路的响应速度相对于信号频率太快,会导致功耗加大、噪声加大,会影响正常信号的传输和识别。


关键

: GPIO的引脚速度跟应用相匹配,速度配置越高,噪声越大,功耗越大。

带宽速度高的驱动器耗电大、噪声也大,带宽低的驱动器耗电小、噪声也小。使用合适的驱动器可以降低功耗和噪声

比如:高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的EMI性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。关键是GPIO的引脚速度跟应用匹配(推荐10倍以上)。

比如:

I2S传输采样速率为46.875KHz×2=93.7KHz,使用2M既可以保证通讯又可以有效减小噪声

① USART串口,若最大波特率只需115.2k,那用2M的速度就够了,既省电也噪声小。

② I2C接口,若使用400k波特率,若想把余量留大些,可以选用10M的GPIO引脚速度。

③ SPI接口,若使用18M或9M波特率,需要选用50M的GPIO的引脚速度。

(2). GPIO的翻转速度指:输入/输出寄存器的0 ,1 值反映到外部引脚(APB2上)高低电平的速度.手册上指出GPIO最大翻转速度可达18MHz。

@通过简单的程序测试,用示波器观察到的翻转时间:  是综合的时间,包括取指令的时间、指令执行的时间、指令执行后信号传递到寄存器的时间(这其中可能经过很多环节,比如AHB、APB、总线仲裁等),最后才是信号从寄存器传输到引脚所经历的时间。

如:有上拉电阻,其阻值越大,RC延时越大,即逻辑电平转换的速度越慢,功耗越大。

(3).GPIO 输出速度:与程序有关,(程序中写的多久输出一个信号)。

2、GPIO口设为输入时,输出驱动电路与端口是断开,所以输出速度配置无意义。

3、在复位期间和刚复位后,复用功能未开启,I/O端口被配置成浮空输入模式。

4、所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。

5、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。



版权声明:本文为zjy0926原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。