STM32——GPIO

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、GPIO简介

GPIO(General Purpose Input Output)通用输入输出口,可配置为八种输入输出模式,引脚电平为0V~3.3V(部分引脚可容忍5V)。STM32芯片的GPIO被分成很多组,每组有16个引脚,所有的GPIO引脚都有基本的输入输出功能
输出模式下可控制端口输出高低电平,以驱动LED ,控制蜂鸣器,模拟通信协议输出时序(I2C,SPI)等。
输入模式下可读取端口的高低电平或电压,以读取按键输入,外接模块电平信号输入,ADC电压采集,模拟通信协议接收数据等。

二、基本结构

图一(系统结构图)
图1
如图所示,所有的GPIO都是挂载在APB2外设总线上的。(所以在使用GPIO时使用APB2相关的函数)
void RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE );
图二
图二
GPIO外设的名称按照GPIOA,GPIOB,GPIOC等命名。
每个GPIO都有16个引脚
寄存器是特殊的储存器,内核通过APB2总线对寄存器进行读写,完成输出读写电平的功能。
(stm32是32位的单片机,每个寄存器都有32位,但端口只有16位,此寄存器只有低16位有对应端口)
图三
在这里插入图片描述
在这里插入图片描述
若输入电流大于3.3V,上二极管就会导通,防止过大电流对GPIO的伤害。电流小于0V时同理。

因为引脚是外界输入,虽然为数字信号,但信号传输时可能失真,此时施密特触发器解决
施密特触发器:当输入高于某一阈值时为高,低于某一于是时为低(并不是在上限上就是高电平,在上限下就是低电平,而是高于上限后处于高,直到再次低于下限时为低

寄存器介绍
想要单独控制某一端口而不影响其他端口,需要一些特殊的方式

第一种方式:通过按位与和按位或的方式更改某一位,最后再将数据写回去,C语言中就是 &= 和 |= 的操作 (麻烦、效率低)

第二种方式(主用):设置位设置和位清除寄存器,如果需要设置,那么就在位设置寄存器某一位写1。如果需要清除,那么就在位清除寄存器写0。这样内部电路就会帮我们处理(通过库函数实现)。

第三种方式:通过寻址的方式配置寄存器,暂时不会用到(如51就是这种方法)。

三、GPIO工作模式

在这里插入图片描述

一,浮空,上拉,下拉输入模式

上拉,下拉电阻提供默认输入。(电阻阻值大,为弱上拉,下拉模式,防止干扰正常输入)
上拉模式为默认输入为高电平,下拉模式默认输入低电平。
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。外部输入时0读出的就是0,外部输入时1读出的就是1。当引脚处于浮空状态时,极不稳定

二,模拟输入模式

当GPIO引脚用于ADC采集电压的输入通道时,用作"模拟输入"功能,此时信号不经过施密特触发器,直接直接进入ADC模块,并且输入数据寄存器为空 ,CPU不能在输入数据寄存器上读到引脚状态
当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出

除了 ADC 和 DAC 要将 IO 配置为模拟通道之外其他外设功能一律 要配置为复用功能模式
复用功能输入接收数字量,接在触发器后方。

三,开漏输出模式

在开漏输出模式时,只有N-MOS管工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1时,高电平,则P-MOS管和N-MOS管都关闭,输出指令就不会起到作用,此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定 如果没有上拉或者下拉 IO口就处于悬空状态。

作用:(i)、可以作为通信协议的驱动方式(比如I2C通信的引脚就是使用开漏模式),在多机通信的情况下,这个模式可以避免各个设备的相互干扰

(ii)、可以用于输出5V的电平信号,比如在IO口外接一个上拉电阻到5V的电源

    当输出低电平时,由内部的N-MOS直接接VSS

    当输出高电平时,由外部的上拉电阻拉高至5V

这样就可以输出5V的电平信号,用于兼容一些5V电平的设备

四,推挽输出模式

在推挽输出模式时,N-MOS管和P-MOS管都工作,如果我们控制输出为0,低电平,则P-MOS管关闭,N-MOS管导通,使输出低电平,I/O端口的电平就是低电平,若控制输出为1 高电平,则P-MOS管导通N-MOS管关闭,使输出高电平,I/O端口的电平就是高电平, 外部上拉和下拉的作用是控制在没有输出时IO口电平。

总结:这种模式高低电平都有较强驱动能力,STM32对IO口具有绝对的控制权,高低电平都由STM32说了算。

五,复用开漏输出

GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同。

六,复用推挽输出

GPIO复用为其他外设(如 I2C),输出数据**寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,施密特触发器打开,**输入可用,通过输入数据寄存器可获取I/O实际状态 除了输出信号的来源改变 其他与开漏输出功能相同。

开漏输出和推挽输出的区别:

推挽输出:

可以输出强高低电平,连接数字器件

推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止.

开漏输出:

可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极. 需要外接上拉电阻,才能实现输出高电平 合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);

在使用任何一种开漏模式时,都需要接上拉电阻,否则只能输出低电平。

GPIO模式总结

在 STM32 中选用 IO 模式
(1) 浮空输入_IN_FLOATING ——浮空输入,可以做 KEY 识别, RX1
(2)带上拉输入_IPU——IO 内部上拉电阻输入
(3)带下拉输入_IPD—— IO 内部下拉电阻输入
(4) 模拟输入_AIN ——应用 ADC 模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO 输出 0 接 GND, IO 输出 1,悬空,需要外接上拉电阻,才能实现输出
高电平。当输出为 1 时, IO 口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样 IO 口也就可以
由外部电路改变为低电平或不变。可以读 IO 输入电平变化,实现 C51 的 IO 双向功能
(6)推挽输出_OUT_PP ——IO 输出 0-接 GND, IO 输出 1 -接 VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C 的 SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值