文章目录
一、GPIO中四个关键器件介绍
1.1、保护二极管
1.2、P-MOS管和N-MOS管
1.3、上拉电阻和下拉电阻
1.4、TTL肖特基触发器
二、GPIO的8种工作模式
2.1、模拟输入
2.2、浮空输入
2.3、下拉输入
2.4、上拉输入
2.5、开漏输出
2.6、推挽输出
2.7、复用开漏输出
2.8、复用推挽输出
三、推挽和开漏的总结
3.1、推挽结构和推挽电路
3.2、开漏知识
四、外设的GPIO配置
4.1、高级定时器TIM1/TIM8
4.2、通用定时器TIM2/3/4/5
4.3、USART
4.4、SPI
4.5、I2S
4.6、I2C
4.7、BxCAN
4.8、USB
4.9、全速USB OTG引脚配置
4.10、SDIO
4.11、ADC/DAC
4.12、FSMC
4.13、其它I/O功能
图(1)中①所示的为两个保护二极管。这两个保护二极管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。尽管有这样的保护,并不意味着STM32的引脚能直接外接大功率驱动器件,如直接驱动电机,要么电机不转,要么导致芯片烧坏,必须要加大功率及隔离电路驱动。
图(1)中②所示的为 P-MOS 管和 N-MOS 管。GPIO引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出模式”结构。在输出模式部分,线路经过一个由P-MOS和N-MOS管组成的单元电路。这个结构使GPIO具有了“推挽输出”和“开漏输出”两种模式,这两种模式下面会详细介绍。
图(1)中③所示的为上拉电阻和下拉电阻。其中VDD为I/O引脚和内部调压器(稳压)的电压,是设备的工作电压,STM32的数据手册为2.0v~3.6v,这里就当3.3V好了,无关紧要。VDD所连的电阻为上拉电阻,当开关打开时,其输出就是高电平。VSS为电路公共地端电压,一般接GND。VSS所连的电阻为下拉电阻,当开关打开时,其输出就是低电平。
图(1)中④所示的为TTL肖特基触发器。信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。补充:当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;当输入在正负向阈值电压之间,输出不改变。
GPIO Mode | Description |
GPIO_Mode_AIN | 模拟输入 |
GPIO_Mode_IN_FLOATING | 浮空输入 |
GPIO_Mode_IPD | 下拉输入 |
GPIO_Mode_IPU | 上拉输入 |
GPIO_Mode_Out_OD | 开漏输出 |
GPIO_Mode_Out_PP | 推挽输出 |
GPIO_Mode_AF_OD | 复用开漏输出 |
GPIO_Mode_AF_PP | 复用推挽输出 |
模拟输入模式(GPIO_Mode_AIN)关闭了TTL肖基特触发器,不接上、下拉电阻,经由另一线路把电压信号传送到片上外设模块。如传送至ADC模块,由ADC采集电压信号。所以使用ADC外设的时候,必须设置为模拟输入模式。在模拟输入模式下,输出缓冲器被禁止,读取输入数据寄存器为0。 补充:类似地,当GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构,而是直接输出到引脚。
浮空输入模式(GPIO_Mode_IN_FLOATING)在芯片内部既没有接上拉,也没有接下拉电阻,经由TTL肖基特触发器输入。配置成这个模式直接用电压表测量其引脚电压为1点几伏,这是个不确定值。由于其输入阻抗较大,一般把这种模式用于标准的通信协议如I2C、USART的接收端。在浮空输入模式下,输出缓冲器被禁止,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。
下拉输入模式(GPIO_Mode_IPD),I/O端口的电平信号通过TTL肖基特触发器后,进入输入数据寄存器。在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平则为高电平。在下拉输入模式下,输出缓冲器被禁止,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。
上拉输入模式(GPIO_Mode_IPU),I/O端口的电平信号通过TTL肖基特触发器后,进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平则为低电平。 在上拉输入模式下,输出缓冲器被禁止,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态。
开漏输出模式(GPIO_Mode_Out_OD),上方的P-MOS管完全不工作。如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出接地,若控制输出为1(它无法直接输出高电平)时,则P-MOS管和N-MOS管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。正常使用时必须外部接上拉电阻,等效电路见图(7)。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平。在开漏输出模式下,施密特触发输入被激活,弱上拉和下拉电阻被禁止,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输入数据寄存器的读访问可得到I/O状态(注意:I/O端口的电平不一定是输出的电平)。
推挽输出模式(GPIO_Mode_Out_PP),是根据这两个MOS管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS管导通,P-MOS关闭,对外输出低电平。当引脚高低电平切换时,两个MOS管轮流导通,P管负责灌电流,N管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。推挽输出的低电平为0V,高电平为3.3V,推挽输出模式时的等效电路见图(9)。 在推挽输出模式下,施密特触发输入被激活,弱上拉和下拉电阻被禁止,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器,对输出数据寄存器的读访问得到最后一次写的值(注意:此时I/O端口的电平一定是输出的电平)。
对于相应的复用模式,则是根据GPIO的复用功能来选择的,如果用在IC、SMBUS这些需要线与功能的复用场合,就使用复用开漏模式(GPIO_Mode_AF_OD)。
当I/O端口被配置为复用功能时:
- 在开漏或推挽式配置中,输出缓冲器被打开
- 内置外设的信号驱动输出缓冲器(复用功能输出)
- TTL肖基特触发输入被激活
- 弱上拉和下拉电阻被禁止
- 在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器
- 开漏模式时,读输入数据寄存器时可得到I/O口状态
- 在推挽模式时,读输出数据寄存器时可得到最后一次写的值
GPIO的引脚用作串口的输出,则使用复用推挽输出模式(注:输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的)。
推挽结构一般是指两个参数相同的三极管或MOS管分别受两互补信号的控制,总是在一个三极管或MOS管导通的时候另一个截止。高低电平由输出电平决定。
推挽电路是两个参数相同的三极管或MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
推挽输出模式一般应用在输出电平为0和3.3V而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,一般习惯使用推挽输出模式。
开漏输出只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(20mA以内)。
开漏输出一般应用在I2C、SMBUS通信等需要“线与”功能的总线电路中。除此之外,还用在电平不匹配的场合,如需要输出5V的高电平,就可以在外部接一个上拉电阻,上拉电源为5V,并且把GPIO设置为开漏模式,当输出高阻态时,由上拉电阻和电源向外输出5V的电平,具体见图(12)。
此图内容只适用于小容量、中容量和大容量产品
- 此图内容只适用于互联型产品
- 如果另一个共享的外设要使用OTG_FS_VBUS引脚(PA9)或把它作为通用I/O口,必须激活PHY的断电模式(清除OTG_FS_GCCFG寄存器的位16)
ADC输入引脚必须配置为模拟输入