一、GPIO简介
GPIO(英语:General-purpose input/output),一般型输入输出的缩写,简单来说就是STM32可控引脚,STM32芯片的GPIO引脚与外部设备连接,实现与外部通信、控制和数据采集的功能。STM32芯片的GPIO分为多组,每组有16个引脚,全部GPIO引脚具有基本的输入输出功能。 最基本的输出功能是由STM32控制引脚输出高低电平,实现开关控制GPIO引脚接入LED灯,可以控制LED灯亮灭,引脚接入继电器或三极管,可通过继电器或三极管控制外部大功率电路的通断。 最基本的输入功能是检测外部电平,如把手GPIO将引脚连接到按钮上,区分按钮是否按下电平。
二、GPIO的工作模式
4种输入模式 GPIO_Mode_IN_FLOATING 浮空输入 GPIO_Mode_IPU 上拉输入 GPIO_Mode_IPD 下拉输入 GPIO_Mode_AIN 模拟输入 4种输出模式 GPIO_Mode_Out_OD 泄漏输出(上拉或下拉) GPIO_Mode_AF_OD 复用开漏输出(上拉或下拉) GPIO_Mode_Out_PP 推拉输出(上拉或下拉) GPIO_Mode_AF_PP 复用推挽输出(带上拉或下拉) 三种最大输出速度 2MHZ 10MHZ 50MHZ
三、GPIO框图剖析
我们用的每一个GPIO它的内部结构是这样对应的GPIO的八种模式 这里我们简单介绍一下: : IO当引脚电压高于引脚电压时,两个引脚上下两侧的二极管用于防止引脚外部过高和过低的电压输入VDD_FT当引脚电压低于时,当引脚电压低于VSS当下二极管导通时,防止异常电压引入芯片导致芯片烧毁 上拉和下拉电阻(输入驱动器):控制引脚默认状态的电压。打开上拉时,引脚默认电压为高电平,打开下拉时,引脚默认电压为低电平 触发器(输入驱动器):当输入电压高于正阈值电压时,输出为高;当输入电压低于负阈值电压时,输出为低;IO触发器后,模拟信号转换为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因 :信号由P-MOS管和N-MOS管,根据两个MOS管道的工作模式,使GPIO推拉输出和漏输出模式 P-MOS管道高电平导通,低电平关闭,下方N-MOS低电平导通,高电平关闭 注意: VDD_FT 代表IO口,兼容3.3V和5V,如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果如果没有如果没有如果没有如果如果没有如果没有如果没有如果没有如果没有如果没有如果如果没有如果没有如果没有如果没有如果如果没有如果没有如果没有如果没有如果没有如果没有如果如果没有如果没有如果没有如果没有如果如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有如果没有FT,这意味着只支持3.3V 。在芯片手册中可以查看支持5V的引脚:
- 浮空输入模式
注:浮空输入模式下,I/O电平状态不确定,完全由外部输入决定;如果引脚悬挂(无信号输入),读取端口的电平不确定
- 上拉输入模式
注:在上拉输入模式下,IO默认为高电平
- 下拉输入模式
注意:下拉输入模式下,IO口默认为低电平
- 模拟输入模式
注:在模拟输入模式下,信号直接进入ADC模块,所以CPU输入寄存器上的引脚状态不能读取。ADC和DAC要将 IO 除模拟通道外,所有其他外设功能道之外 配置为功能模式。
- 泄漏输出模式
注:只有在泄漏输出模式下N-MOS管理工作,如果我们控制输出为0,P-MOS管关闭,N-MOS管导通,使输出低电平,如果控制输出为1,P-MOS管和N-MOS管道关闭,输出指令不起作用,而是由I/O端口外部的上拉或下拉决定,如果没有上拉或下拉 IO嘴是悬挂的。
- 推拉输出模式(带上拉)
注:推拉输出模式时,N-MOS管和P-MOS管都工作,如果控制输出为0,P-MOS管关闭,N-MOS如果控制输出为1,则管导通P-MOS管导通N-MOS管关闭。
- 复用开漏输出
注:复用开漏输出,GPIO输出数据寄存器用于其他外设GPIOx_ODR无效; 输出的高低电平来自其他外设,
- 复用推挽输出(带上拉)
:复用推挽输出,GPIO输出数据寄存器用于其他外设GPIOx_ODR无效; 输出的高低电平来自其他外设, 施密特触发器在输出模式下打开,因此mcu可读取I/O口腔的实际状态。
:它可以输出强、高、低电平,连接数字设备。推拉结构一般是指两个三极管分别由两个互补信号控制,总是在一个三极管导通时另一个截止日期。 :可输出强低电平。高电平必须通过外部电阻提高才能实现高电平的输出。适用于电流驱动,其吸收电流的能力相对较强(一般为20)ma以内)。
- 本质区别在于F4系列采用了Cortex-M4内核 而F1系列采用Cortex-M3内核 F1系列(M3)IO口基本结构: F4系列(M4)IO口基本结构:
四、 寄存器介绍
STM32 的每个 IO 端口都有 7 控制寄存器,它们分别是:配置模式 2 个 32 位置端口配有寄存器 CRL 和 CRH;2 个 32 位数据寄存器 IDR 和 ODR;1 个 32 位置/复位寄存器BSRR;一个 16 复位寄存器的位置 BRR;1 个 32 位的锁存寄存器 LCKR;这里我们只介绍几个常用的寄存器,我们常用的 IO 只有端口寄存器 4 个:CRL、CRH、IDR、ODR。
- 配置模式CRL和CRH寄存器
从图中可以看出配置GPIO模式需要4位来配置,分辨是两位CNFy和两位MODEy配置,因为每组GPIO还有16个引脚STM32位于32位,因此寄存器无法完成一组GPIO配置,其中CRL配置 0 ~ 7 引脚,CRH配置 8 ~ 15 引脚。 例如,我们必须设置它 PORTB 的 12 位为推挽输出 ,5 位于上拉输入。
//配置PB5为上拉输入 GPIOB->CRH &= 0XFF0FFFFF; ///清除5引脚位置的原始设置,不影响其他位置的设置 GPIOB->CRH |= 0X00800000; // 配置PB5上拉输入 GPIOB->ODR= 1<<5; //PB5 上拉 //配置PB12为推挽输出 GPIOB->CRH &= 0XFFF0FFFF; ///清除12引脚位置的原始设置,不影响其他位置的设置 GPIOB->CRH |= 0X00030000; // 配置PB12推挽输出
- 端口输入数据寄存器IDR
- 端口输出数据寄存器ODR
- 端口位设置/清除寄存器BSRR
- 端口位清除寄存器BRR
- 端口配置锁定寄存器LCKR
五、编写程序
上面介绍了GPIO的8中工作模式以及GPIO的寄存器使用,那么在控制GPIO之前需要配置GPIO的工作模式,这是STM32和51单片存在区别的地方。51单片的引脚功能是确定的,而STM32的引脚都是可以复用的,程序配置GPIO的方式有两种,一种是通过库文件的方法进行配置,另一种是通过寄存器进行配置,由于库文件的配置方式比较简单,网上也有很多文章讲解,这里我以寄存器为例进行学习。 :STM32的所用引脚都可以用于中断 程序是基于之前创建的项目模板(寄存器版)中进行更改即可,没创建过STM32项目的小伙伴浏览之前的STM32新建模板之库文件和STM32新建模板之库文件。
- 更改main.c文件为一下内容即可
#include "stm32f10x.h"
#include "sys.h"
/*------------------------------------------------------------ 主函数 ------------------------------------------------------------*/
int main()
{
RCC->APB2ENR|=0X0000001c;//先使能外设IO PORTa,b,c时钟
RCC->APB2ENR |= 1 << 12;
GPIOB->CRH=0X00030000; //设置GPIOB的12引脚为推挽输出
while (1)
{
delay_ms(100);
GPIOB->ODR = ~(1 << 12); //设置12引脚输出0
delay_ms(100);
GPIOB->ODR |= 1 << 12; //设置12引脚输出1
}
}
- 这是一个led闪烁的程序,编译下载运行即可