其他分享
首页 > 其他分享> > STM32F3 GPIO的八种模式及工作原理

STM32F3 GPIO的八种模式及工作原理

作者:互联网

一、GPIO简介

    GPIO(英语:General-purpose input/output),通用型之输入输出的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32芯片的GPIO被分成很多组,每组有16个引脚,所有的GPIO引脚都有基本的输入输出功能。
    最基本的输出功能是由STM32控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。
    最基本的输入功能是检测外部电平,如把GPIO引脚连接到按键,通过电平高低区分按键是否被按下。

二、GPIO的工作模式

  1. 4种输入模式
  1. 4种输出模式
  1. 3种最大输出速度

三、GPIO框图剖析


我们所用到的每一个GPIO其内部结构都是这样,分别对应着GPIO的八种模式 这里我们简单的介绍下:

  1. 浮空输入模式

    注意:浮空输入模式下,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的

  2. 上拉输入模式

    注意:上拉输入模式下,IO口默认为高电平

  3. 下拉输入模式

    注意:下拉输入模式下,IO口默认为低电平

  4. 模拟输入模式

    注意:模拟输入模式下,信号不经过施密特触发器,直接直接进入ADC模块,所以CPU不能读取输入寄存器上的引脚状态。除了ADC和DAC要将 IO 配置为模拟通道之外其他外设功能一律 要配置为用功能模式。

  5. 开漏输出模式

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

  6. 推挽输出模式(带上拉)

    注意:在推挽输出模式时,N-MOS管和P-MOS管都工作,如果控制输出为0,则P-MOS管关闭,N-MOS管导通,若控制输出为1,则P-MOS管导通N-MOS管关闭。

  7. 复用开漏输出

    注意:复用开漏输出下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,

  8. 复用推挽输出(带上拉)

    注意:复用推挽输出下,GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效; 输出的高低电平的来源于其它外设,
    输出模式下施密特触发器是打开的,所以mcu是可以读取到I/O口的实际状态。

四、 寄存器介绍

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。

  1. 配置模式CRL和CRH寄存器

    从图中可以看出配置GPIO的模式需要4位进行配置,分辨是两位CNFy和两位MODEy进行配置,因为每组GPIO都有16个引脚,而STM32是32位的,所以一个寄存器无法完成一组GPIO的配置,其中CRL配置 0 ~ 7 引脚,CRH配置 8 ~ 15 引脚。
//配置PB5为上拉输入
GPIOB->CRH &= 0XFF0FFFFF; //清掉这5引脚位原来的设置,同时也不影响其他位的设置
GPIOB->CRH |= 0X00800000; // 配置PB5上拉输入
GPIOB->ODR= 1<<5; //PB5 上拉

//配置PB12为推挽输出
GPIOB->CRH &= 0XFFF0FFFF; //清掉这12引脚位原来的设置,同时也不影响其他位的设置
GPIOB->CRH |= 0X00030000; // 配置PB12推挽输出

  1. 端口输入数据寄存器IDR

  2. 端口输出数据寄存器ODR

  3. 端口位设置/清除寄存器BSRR

  4. 端口位清除寄存器BRR

  5. 端口配置锁定寄存器LCKR

五、编写程序

上面介绍了GPIO的8中工作模式以及GPIO的寄存器使用,那么在控制GPIO之前需要配置GPIO的工作模式,这是STM32和51单片存在区别的地方。51单片的引脚功能是确定的,而STM32的引脚都是可以复用的,程序配置GPIO的方式有两种,一种是通过库文件的方法进行配置,另一种是通过寄存器进行配置,由于库文件的配置方式比较简单,网上也有很多文章讲解,这里我以寄存器为例进行学习。
注意:STM32的所用引脚都可以用于中断
程序是基于之前创建的项目模板(寄存器版)中进行更改即可,没创建过STM32项目的小伙伴浏览之前的STM32新建模板之库文件STM32新建模板之库文件

#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

	}
}

参考文献

STM32F4 GPIO八种模式及工作原理详解:https://blog.csdn.net/as480133937/article/details/98063549
STM32-GPIO详解:https://blog.csdn.net/dnfestivi/article/details/104984813
《STM32中文参考手册》

标签:输出,引脚,MOS,八种,寄存器,GPIO,输入,STM32F3
来源: https://www.cnblogs.com/jzcn/p/15772392.html