STM32 GPIO相关内容整理

GPIO简介

首先说一下GPIO是什么意思,GPIO是 General Purpose Input Output 的简称,直接翻译过来:通用输入输出
它起到的作用跟C语言里的printf();Scanf();有些类似,只不过GPIO输入输出的是高低电平。

GPIO功能

简单了解GPIO的功能后,下一步就是解决如何去使用GPIO的问题了。在STM32中每一个GPIO端口都是由7个寄存器来控制的,分别是:

1.端口配置寄存器:CRL和CRH,这两个寄存器负责每个IO口的工作模式以及输出的速率,工作模式稍后有总结。其中CRL控制低8位输出口,CRH控制高8位输出口。
2.数据寄存器:IDR和ODR,IDR是查看引脚电平状态用的寄存器,ODR是引脚电平输出的寄存器。
3.置位/复位寄存器:BSRR
4.16位复位寄存器:BRR
5.锁存寄存器:LCKR

这七个寄存器中除了BRR是16位,其他六个都是32位的。GPIO的工作模式也有八种:
1、输入浮空
2、输入上拉
3、输入下拉
4、模拟输入
5、开漏输出
6、推挽输出
7、推挽式复用功能
8、开漏复用功能

IO端口位基本结构如下:
端口结构图
在这里先简单的对电路图做个介绍:
VCC:接入电路的电压;

VDD:器件内工作电压;

VSS:公共接地端电压。

保护二极管:IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。当引脚电压高于VDD时,上方的二极管导通;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。但是尽管如此,还是不能直接外接大功率器件,须加大功率及隔离电路驱动,防止烧坏芯片或者外接器件无法正常工作;

P-MOS管和N-MOS管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式。这里的电路会在下面很详细地分析到;

TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号;

浮空输入模式

在这里插入图片描述
浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

上拉输入模式

在这里插入图片描述
上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。

下拉输入模式

在这里插入图片描述
下拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在低电平;并且在I/O端口输入为高电平的时候,输入端的电平也还是高电平。

模拟输入模式

在这里插入图片描述
模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等等。

开漏输出模式

在这里插入图片描述
开漏输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经N-MOS管,最终输出到I/O端口。这里要注意N-MOS管,当设置输出的值为高电平的时候,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口外部的上拉或者下拉决定;当设置输出的值为低电平的时候,N-MOS管处于开启状态,此时I/O端口的电平就是低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,I/O端口的电平不一定是输出的电平。

开漏复用输出模式

在这里插入图片描述
开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

推挽输出模式

在这里插入图片描述
推挽输出模式下,通过设置位设置/清除寄存器或者输出数据寄存器的值,途经P-MOS管和N-MOS管,最终输出到I/O端口。这里要注意P-MOS管和N-MOS管,当设置输出的值为高电平的时候,P-MOS管处于开启状态,N-MOS管处于关闭状态,此时I/O端口的电平就由P-MOS管决定:高电平;当设置输出的值为低电平的时候,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。同时,I/O端口的电平也可以通过输入电路进行读取;注意,此时I/O端口的电平一定是输出的电平。

推挽复用输出模式

在这里插入图片描述
推挽复用输出模式,与推挽输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。

补充一下:
开漏输出 :只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内);
推挽输出 :可以输出强高、低电平,连接数字器件。

GPIO输出初始化

基本思路:时钟使能——寄存器清零——设置输出模式——设置输出电平
以正点原子F103RCT6 Mini开发板点亮小灯实验代码节选为例(寄存器版代码):

RCC->APB2ENR|=1<<2; 	 //使能 PORTA 时钟
RCC->APB2ENR|=1<<5; 	 //使能 PORTD 时钟
GPIOA->CRH&=0XFFFFFFF0;  //寄存器清零
GPIOA->CRH|=0X00000003;	 //PA8 推挽输出
GPIOA->ODR|=1<<8;		 //PA8 输出高
GPIOD->CRL&=0XFFFFF0FF;
GPIOD->CRL|=0X00000300;  //PD.2 推挽输出
GPIOD->ODR|=1<<2;        //PD.2 输出高

GPIO输入初始化

以正点原子F103RCT6 Mini开发板点按键实验代码节选为例(寄存器版代码):

RCC->APB2ENR|=1<<2;     //使能 PORTA 时钟
RCC->APB2ENR|=1<<4;     //使能 PORTC 时钟
JTAG_Set(SWD_ENABLE);   //关闭 JTAG,开启 SWD
GPIOA->CRL&=0XFFFFFFF0; //PA0 设置成输入
GPIOA->CRL|=0X00000008;
GPIOA->CRH&=0X0FFFFFFF; //PA15 设置成输入
GPIOA->CRH|=0X80000000;
GPIOA->ODR|=1<<15;      //PA15 上拉,PA0 默认下拉
GPIOC->CRL&=0XFF0FFFFF; //PC5 设置成输入
GPIOC->CRL|=0X00800000;
GPIOC->ODR|=1<<5;       //PC5 上拉

Guess you like

Origin blog.csdn.net/qq_36535414/article/details/114921237