嵌入式进阶:STM32——GPIO
GPIO:GPIO是一种通用型输入输出,可以用来控制输入输出的STM32引脚,统称为GPIO。
STM32有多组GPIO,比如我们使用的芯片:STM32F103ZET6共有7组GPIO端口,他们分别是GPIOx(x从A-G),每组控制16个引脚,共有112个GPIO引脚。具体一个其他STM32芯片有多少组GPIO,可以去查看他们的对应的数据手册。
每个引脚的电平是0-3.3V,部分引脚最高可以兼容到5V。
GPIO的特点:
同型号,IO口的数量可能不一样。
快速翻转。最快可以达到每2个时钟周期翻转一次。(STM32F1系列最快可以达到50MHz的翻转速度)。
每个IO都可以作为外部中断。
支持8种工作模式。
GPIO的八种工作模式:
GPIO端口的每个位(引脚)可以由软件分别配置成8种模式,当然对同一个引脚同一时间只能处于某一种模式中。
- 输入浮空(Input floating)
- 输入上拉(Input pull-up)
- 输入下拉(Input-pull-down)
- 模拟输入(Analog)
- 通用开漏输出(Output open-drain)
- 通用推挽式输出(Output push-pull)
- 推挽式复用功能(Alternate function push-pull)
- 开漏复用功能(Alternate function open-drain)
每个I/O端口位可以自由编程,然而I/O端口寄存器必须按32位字被访问。
输出模式下可以控制端口输出高电平低电平,用于驱动LED、蜂鸣器等,如果是大功率器件(比如电机),还需要加上驱动器(小电流控制大电流)。
输入模式下可以读取端口的高低电平,用于读取外接按键、外接模拟信号的输入、ADC电压采集、模拟通信协议接受数据等。
GPIO电路图:
输出模式:推挽输出和开漏输出
1,输出缓冲器被激活。
2,推挽模式:输出寄存器上的 1 将激活P-MOS,输出高电平。0 将激活N-MOS,输出低电平。
3,开漏模式:PMOS永远关闭。 输出寄存器上的 0 激活N-MOS,而输出寄存器上的1 将端口置于高阻状态,所以外部必须要接上拉电阻。
4,施密特触发输入被激活。
5,弱上拉和下拉电阻被禁止。
6,出现在I/O脚上的数据在每个APB2时钟被采样到输入数据寄存器。
7,在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。
输出模式:复用输出
1,在开漏或推挽式配置中,输出缓冲器被打开。
2,内置外设的信号驱动输出缓冲器(复用功能输出)。
3,施密特触发输入被激活。
4,弱上拉和下拉电阻被禁止。
5,在每个APB2时钟周期,出现在I/O脚上的数据被采样到输入数据寄存器。
6,开漏模式时,读输入数据寄存器时可得到I/O口状态。
7,在推挽模式时,读输出数据寄存器时可得到最后一次写的值。
输入模式:
2个保护二极管的作用是保护我们的芯片不会由于电压过高或过低而烧毁。
VDD接电源(3.3V),VSS接地(0V)。如果IO引脚的输入电压高于VDD的值到一定程度,上方保护二极管导通,则引脚电压被拉低到VDD。如果IO引脚的输入电压(负电压)低于VSS到一定程度,则下方保护二极管导通,电压被拉高到VSS。
2个开关控制引脚没有输入的时候是上拉、下拉或浮空。当上面的开关闭合的时候,输入被拉高到高电平。当下面的开关闭合的时候,输入被拉低到低电平。如果两个都不闭合,输入就是浮空状态。两个同时闭合,就是费电了,不会这么做的。
施密特(图中翻译成肖特基触发器应该是翻译错误,英文版手册是TTL Schmitt trigger)触发器是包含正反馈的比较器电路,可以对信号进行波形整形。
从施密特触发器出来的数据,进入到输入数据寄存器中,我们就可以从中读取数据了。
GPIO相关的7个寄存器(重要)
GPIOx_CRL 端口配置低寄存器
GPIOx_CRH 端口配置低寄存器
GPIOx_IDR 输入数据接存钱
GPIOx_ODR 输出数据寄存器
GPIOx_BSRR 位设置/清除寄存器
GPIOx_BRR 位清除寄存器
GPIOx_LCKR 端口配置锁寄存器
每个GPIO端口有7个相关的寄存器:
GPIOx_CRL(端口配置低寄存器)
GPIOx_CRL(Port configuration register low),x可以是A-G。
该寄存器配置的每个GPIO的 0-7 这8个位,所以叫低寄存器。
MODE:每个端口有2个MODE位进行控制。
00:输入模式(复位后的状态)
01:输出模式,最大速度10MHz
10:输出模式,最大速度2MHz
11:输出模式,最大速度50MHz
CNF:每个端口有2个CNF位进行控制。
当MODE是00 (输入模式)
00:模拟输入模式
01:浮空输入模式(复位后的状态)
10:上拉/下拉输入模式
11:保留
当MODE>00(输出模式)
00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式
GPIOx_CRH(端口配置高寄存器)
GPIOx_CRH(Port configuration register high)。
该寄存器配置的是每个端口的 8-15引脚,配置方式和低位寄存器完全一样。
GPIOx_IDR(端口输入数据寄存器)
Port input data register
保留位始终读为0。剩下的分别对应每个引脚的输入值。
GPIOx_ODR(端口输出数据寄存器)
Port Output Data Register
保留位始终读为0。剩下的分别对应每个引脚的输出值。
GPIOx_BSRR(端口位设置/清除寄存器)
Port Bit Set/Reset Register
高16位是用来清除对应的数据输出寄存器的位(0-15)的值:设置为0不影响,设置为1会清除ODR对应的位的值(置为0)。
GPIOx_BRR(端口位清除寄存器)
低16位是用来设置对应的数据输出寄存器的位(0-15)的值:设置为0不影响,设置为1会设置ODR对应的位的值(置为1)。
这个寄存器具有了GPIOx_BSRR一半的功能:清除。
GPIOx_LCKR(端口配置锁定寄存器)
Port configuration lock register
该寄存器用来锁定端口位的配置。位[15:0]用于锁定GPIO端口的配置。在规定的写入操作期间,不能改变LCKP[15:0]。当对相应的端口位执行了LOCK序列后,在下次系统复位之前将不能再更改端口位的配置。
每个锁定位锁定控制寄存器(CRL,CRH)中相应的4个位(CNF2位和MODE2位)。
第16位用来激活锁定寄存器,必须按照规定的时序来操作才行: 写1 -> 写0 -> 写1 -> 读0 -> 读1。
对0-15位:
作者:梦星鱼