STM32GPIO相关知识总结、跑马灯寄存器配置及端口复用功能、端口映射功能详解

1 篇文章 0 订阅

GPIO相关知识总结及STM32GPIO跑马灯寄存器配置

一:端口概述
GPIO( general purpose intput output )是通用输入输出端口的简称,可以通过软件来控制其输入和输出。STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
在STM32中,每个I/O端口可以由软件配置成为输入/输出模式。复位期间或刚复位后,I/O端口被配置成浮空输入模式。所有的GPIO引脚有一个内部弱上拉和弱下拉,当配置为输入时,它们可以被激活或者是断开。
所有的端口都有外部中断的能力。
AF功能:对于复用功能,端口必须配置成复用功能输出模式。当软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。还可以进行软件重映射I/O复用功能。

二:GPIO基本结构
在这里插入图片描述
三: GPIO工作模式

1:输入模式
四种输入模式:上拉输入、下拉输入、浮空输入、模拟输入。
浮空输入(上下拉电阻没有打开,默认电平状态将不确定)
在这里插入图片描述上拉输入(开启上拉电阻,引脚默认高电平)
在这里插入图片描述下拉输入(开启下拉电阻,引脚默认低电平)

在这里插入图片描述模拟输入(不经过斯密特触发器)
在这里插入图片描述以上电路由右至左看:
I/O即GPIO的外接部分;
  在引脚上下连接保护二极管,当输入电压高于VDD时,上方二极管导通吸收此高电压;当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。 尽管STM32芯片内部有这样的保护,但并不意味着STM32的引脚就无所不能,如果直接将引脚连接大功率器件,比如电机,那么要么电机不转,要么烧坏芯片。如果要驱动一些大功率器件,必须要加大功率及隔离电路驱动。也可以说STM32引脚是用来做控制,而不是做驱动使用的。
  从图中可以看到,上拉和下拉电阻上都有一个开关,通过配置上下拉电阻开关,可以控制引脚的默认状态电平。当开启上拉时引脚默认电压为高电平,开启下拉时,引脚默认电压为低电平,这样就可以消除引脚不定状态的影响。当然也可以将上拉和下拉的开关都关断,这种状态我们称为浮空模式,一旦配置成这个模式,引脚的电压是不确定的,如果用万用表测量此模式下管脚电压时会发现只有 1 点几伏,而且还不时改变,所以一般情况下我们都会给引脚设置成上拉或者下拉模式,使它有一个默认状态。STM32内部的上拉其实是一个弱上拉,也就是说通过此上拉电阻输出的电流很小,如果想要输出一个大电流,那么就需要外接上拉电阻了。
  模拟输入配置:上下拉电阻被禁止。因为经过施密特触发器的信号只有1/0两种状态,信号源不经过触发器直接进行输入

2:输出模式
四种输出模式:推挽输出、开漏输出、复用推挽输出、复用开漏输出。
开漏输出

在这里插入图片描述
复用开漏输出

在这里插入图片描述
推挽输出
在这里插入图片描述
复用推挽输出
在这里插入图片描述 所谓推挽输出模式,是根据P-MOS和N-MOS管的工作方式命名的。在该结构单元输入一个高电平时,P-MOS管导通,N-MOS管截止(可以将P-MOS当作NPN三极管,N-MOS当作PNP三极管来看就非常清楚),对外输出高电平(3.3V)。在该单元输入一个低电平时,P-MOS管截止,N-MOS管导通对外输出低电平 (0V) 。如果当切换输入高低电平时,两个MOS管将轮流导通,一个负责灌电流(电流输出到负载),一个负责拉电流(负载电流流向芯片),使其负载能力和开关速度都比普通的方式有很大的提高。
推挽输出:可以输出强高低电平,连接数字器件。
开漏输出模式时,不论输入是高电平还是低电平,P-MOS 管总处于关闭状态。当给这个单元电路输入低电平时,N-MOS 管导通,输出即为低电平。当输入高电平时,N-MOS 管截止,这个时候引脚状态既不是高电平,又不是低电平,我们称之为高阻态。如果想让引脚输出高电平,那么引脚必须外接一个上拉电阻,由上拉电阻提供高电平。在开漏模式时,对输入数据寄存器的读访问可得到I/O状态。
开漏输出:只可以输出强低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行。适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
复用功能输出:当I/O引脚被配置成为复用输出时,内置的外设的信号驱动输出缓冲器被打开,即由片内外设提供输出功能。所以当使用某引脚的复用功能时,一定要打开片上外设、复用时钟,且将使用复用的推挽或者开漏输出。
  输出电平由输出数据寄存器决定,可以通过修改GPIOx_BSRR来影响电路的输出。BSRR寄存器优点:达到直接设置IO口高低电平状态,同时对其它IO口不产生影响的目的。但是通过ODR寄存器配置IO口时,若想不对其它位造成影响,则需要先把其它位的状态读出来,再写进去
在这里插入图片描述
每组IO含10个寄存器,七组IO的话就有70个寄存器。

寄存器

1:端口配置低寄存器
在这里插入图片描述
2:端口配置高寄存器
在这里插入图片描述3:端口输入数据寄存器
在这里插入图片描述3:端口输出数据寄存器
在这里插入图片描述4:端口设置清除寄存器

在这里插入图片描述

类型一(STM32F7):
控制IO口步骤:
1:使能IO口时钟,配置相关寄存器RCC->AHBENR
2:初始化IO口模式。配置4个配置寄存器
GPIOx_MODER/GPIOxOTYPER/GPIOx_OSPEEDR/GPIOx_PUPDR
3:操作IO口,输出高低电平。配置寄存器GPIOx_ODR或BSRRL/BSRRH

void led_Init()
{
	RCC->AHB1ENR|=1<<1;
	
	//PB0
	//通过&与~先将MODER相应位置0
	//再通过|将其置为01:通用输出模式
	GPIOB->MODER&=~(3<<(2*0));
	GPIOB->MODER|=1<<(2*0);	
	//11:高速
	GPIOB->OSPEEDR&=~(3<<(2*0));
	GPIOB->OSPEEDR|=2<<(2*0);	
	//00:输入(复位状态)
	GPIOB->OTYPER&=~(1<<0);
	GPIOB->OTYPER|=0<<0;
	//01上拉
	GPIOB->PUPDR&=~(3<<(2*0));
	GPIOB->PUPDR|=1<<(2*0);	
	//置1,输出高电平
	GPIOB->ODR|=1<<0;//1;
	//置0,输出低电平
  //	GPIOB->ODR&=~(1<<0);//0
	
	//PB1
	GPIOB->MODER&=~(3<<(2*1));
	GPIOB->MODER|=1<<(2*1);	
	
	GPIOB->OSPEEDR&=~(3<<(2*1));
	GPIOB->OSPEEDR|=2<<(2*1);	
	
	GPIOB->OTYPER&=~(1<<1);
	GPIOB->OTYPER|=0<<1;
	
	GPIOB->PUPDR&=~(3<<(2*1));
	GPIOB->PUPDR|=1<<(2*1);	

	GPIOB->ODR|=1<<1;//1;
//	GPIOB->ODR&=~(1<<1);//0
}

//main函数
	while(1)
	{
		
	GPIOB->ODR|=1<<0;//1;		
	GPIOB->ODR&=~(1<<1);//0	
	delay_ms(500);
		
	GPIOB->ODR|=1<<1;//1;
	GPIOB->ODR&=~(1<<0);//0
	delay_ms(500);

	}

类型二(F1):
控制IO口步骤:
1:使能IO口时钟,配置相关寄存器RCC->AHBENR
2:初始化IO口模式。配置4个配置寄存器
GPIOx_CRH/CRL
3:操作IO口,输出高低电平。配置寄存器GPIOx_ODR或BSRR/BRR

**//定义RCC的基地址**
#define RCC_BASE              (AHBPERIPH_BASE + 0x1000)
#define RCC                 ((RCC_TypeDef *) RCC_BASE)

**//RCC_TypeDef 结构体,内部包含的其实是RCC的寄存器**
typedef struct
{
  __IO uint32_t CR;
  __IO uint32_t CFGR;
  __IO uint32_t CIR;
  __IO uint32_t APB2RSTR;
  __IO uint32_t APB1RSTR;
  __IO uint32_t AHBENR;
  __IO uint32_t APB2ENR;
  __IO uint32_t APB1ENR;
  __IO uint32_t BDCR;
  __IO uint32_t CSR;

#ifdef STM32F10X_CL  
  __IO uint32_t AHBRSTR;
  __IO uint32_t CFGR2;
#endif /* STM32F10X_CL */ 

#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL)   
  uint32_t RESERVED0;
  __IO uint32_t CFGR2;
#endif /* STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL */ 
} RCC_TypeDef;
#include "led.h"
#include "stm32f10xx.h"
void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟 
	RCC->APB2ENR|=1<<6;    //使能PORTE时钟
	   	
	  //配置寄存器PB5 CRL寄存器的第五位 推挽输出
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5
	//第五位输出高
    GPIOB->ODR|=1<<5;      //PB.5
		
	 //配置寄存器PE.5 CRL寄存器的第五位 推挽输出									  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5
	//输出高
	GPIOE->ODR|=1<<5;      //PE.5
}

端口复用
STM32有很多内置外设(如串口、CAN、ADC\DAC等),这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用时,就叫做复用
STM32是一个高度集成的芯片,GPIO引脚有限,如果这些GPIO引脚只作普通IO的话外设会少很多,如果只作外设的功能引脚的话,IO口会少很多,因此用端口复用的方法来解决问题,使得IO口得到最大程度的使用。
注意:对于STM32F7与F1系列单片机复用功能配置的不同
对于STM32F7
STM32F7的IO引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF),连接到对应的IO口。这样可以确保共用一个IO引脚的外设之间不会发生冲突,每个IO引脚都有一个复用器.
对于F7,有两个寄存器可用来从每个 I/O 可用的复用功能输入/输出中进行选择。借助这些寄存器,可根据应用程序的要求将某个复用功能连接到其它某个引脚,复用器采用16路复用功能输入到(AF0到AF15),可通过GPIOx_AFRL(对应引脚0-7)和GPIOx_AFRH(对应引脚8-15)寄存器对这些输入进行配置,每四位控制一路复用:
1)完成复位后,所有IO都会连接到系统的复用功能0(AF0)。
2)外设的复用功能映射到AF1到AF13。
简单的理解就是,每个引脚都可以配置为多个复用功能,那么这个引脚到底配置外哪个功能,可以通过开关(配置)来设定。如下图所示:
在这里插入图片描述与该功能相关的寄存器为GPIOx_AFRL与GPIOx_AFRH,而STM32F1没有该寄存器,那么F1是如何选择复用到哪个外设呢?按笔者理解,下面会讲解到
在这里插入图片描述对于STM32F1
将IO口配置为复用功能:
● 对于复用的输入功能,端口必须配置成输入模式(浮空、上拉或下拉)且输入引脚必须由外部驱动
● 对于复用输出功能,端口必须配置成复用功能输出模式(推挽或开漏)。
● 对于双向复用功能,端口位必须配置复用功能输出模式(推挽或开漏)。这时,输入驱动器被配置成浮空输入模式。
如果把端口配置成复用输出功能,则引脚和输出寄存器断开,并和片上外设的输出信号连接如果软件把一个GPIO脚配置成复用输出功能,但是外设没有被激活,它的输出将不确定。

对于F1可以将复用功能打开,然后将对应的外设激活便可以确定复用输出对应哪个端口。

芯片的数据手册可以看到IO口的复用功能,对于F1《STM32F103ZET6》。
在这里插入图片描述
相关外设GPIO的配置方式:见STM32中文参考手册:

在这里插入图片描述

端口重映射(用得较少)
每个内置外设都有若干个输入输出引脚,一般这些引脚的输出端口都是固定不变的,为了让设计工程师可以更好地安排引脚的走向和功能,在STM32中引入了外设引脚重映射的概念,即一个外设的引脚除了具有默认的端口外,还可以通过设置重映射寄存器的方式,把这个外设的引脚映射到其它的端口
如:STM32F1串口2的发送接收引脚默认是PA2\PA3,看芯片数据手册,IO引脚表格的最后一列可以看到引脚的重映射Remap功能,可以看到串口2的发送接收引脚还可以重映射到PD5\PD6。
部分重映射和完全重映射:
在这里插入图片描述端口重映射时,在下列情况下需要开启辅助功能时钟
对寄存器AFIO_MARR, AFIO_EXTICRX, 和ATIO_EVCR进行读写操作前,应首先打开AFIO时钟。
相关寄存器:

一:用功能重映射寄存器AFIO_MARR:具体请查看《STM32中文参考手册》
在这里插入图片描述二:事件控制寄存器EVCR(用的少)
三:外部中断配置寄存器(AFIO_RXTICR):跟外部中断有关

GPIO锁定机制
锁定机制允许冻结IO配置。当在一个端口位上执行了锁定(LOCK)程序,在下一次复位之前,将不能再更改端口位的配置。

部分参考于:https://www.cnblogs.com/nyqm/p/8582603.html
部分参考于:https://www.jianshu.com/p/2b23ec55bb1b

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值