3-stm32外设GPIO和AFIO学习

前言:

         本系列,将stm32常用片上外设进行整理,包括大致原理和代码,主要是熟悉如何根据手册去编写代码。便于以后需要做实验时,能够快速编写基本的驱动,然后编写应用代码。

        本系列基于“标准库”整理,开发板用的是正点原子精英版V1.5,单片机是STM32F103ZET6。开发工具KEIL。主要参考资料有《STM32F103xCDE中文参考手册》《STM32F103xCDE中文数据手册》、《CM3权威指南》、《STM32F103xCDE闪存编程手册》、《精英版原理图V1.5》。

》《STM32F1xx Cortex-M3编程手册-英文版》。
 

一、什么是GPIO?

        GPIO即是“通用输入输出”的英文缩写,也就是我们能够从芯片外部看到的一根一根的针脚

,我们通过编程去控制这些IO口上的电平为高还是为低,如果这个IO口上的电平直接由CPU控制,那么就是通用GPIO,如果由串口、SPI等外设控制,就叫复用IO。如点亮led灯的实验中,与led灯相连 的那个IO口就是通用IO。在串口1收发实验中,串口1的TX(PA9)和RX(PA10)引脚就是复用IO。

二、GPIO的结构

        STM32F1系列的IO结构,在《STM32F103xCDE中文参考手册》的第8节,通用GPIO和复用AFIO。STM32F1号称GPIO支持8模式,事实上也确实是支持8种模式,看着挺复杂,其实按照通用IO和复用IO一分,也就没几种模式了。如下图中,红色线的是通用输入的逻辑图,绿色的通用输出的逻辑图。点灯实验中就是使用的这两条线的逻辑。

     如下图中,红色线的是复用输入的逻辑图,绿色的复用输出的逻辑图。串口实验中就是使用的这两条线的逻辑。

三、通用IO

        在GPIO寄存器中,有一个寄存器叫做端口配置寄存器,用来配置8种输入模式中的哪一种,

我们以引脚PA9为例,此时我们将PA9配置为通用IO,用来点亮外部的led灯,我们首先配置PA9配置为通用输出模式,再将PA9置为高电平。如下图中将PA9对应的”MODE位“配置为输出模式,输出速度随便选即可,”CFG“位配置为推挽输出即可。

        配置完CRH寄存器后,我们只需要配置ODR寄存器即可控制PA9上为高电平,还是为低电平。只需要将ODR的第9位,写1即PA9变为高电平,写0,PA9变为低电平。

        LED灯即二极管,如下图,如果LED0连接的是PA9,那么我只需要将PA9置为低电平0V,即可点亮LED0,如果将PA9置为高电平(3.3V)。则LED0熄灭。

四、通用GPIO标准库的代码

//初始化PA9		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	 //使能PA端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;				 //LED0-->PA9 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
 GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOA
	
 //GPIO_SetBits(GPIOA,GPIO_Pin_9);						 //PA9 输出高 则LED0熄灭	
 GPIO_ResetBits(GPIOA,GPIO_Pin_9);						 //PA9 输出高 则LED0亮


}

五、通用GPIO用寄存器代码:

    编码时将寄存器截图下了,方便查看操作的那几个位。

//初始化PA9		    
//LED IO初始化
void LED_Init(void)
{
 
	RCC->APB2ENR |= 1<<2;//置bit2为1,开启PA时钟,根据手册RCC的APB2ENR的bit2控制PA时钟的开和关。
	
	GPIOA->CRH   |= 3<<4;//置bit4和bit5为11,即输出模式,最大速度50MHZ
	GPIOA->CRH   &= ~(3<<6); //置bit6和bit7为00,即通用推挽输出模式
	
	GPIOA->ODR 	 &= ~(1<<9);//将PA9置为低电平,点亮LED0

}

六、复用IO

        所谓复用就是IO口上的电平不由CPU直接控制了,而是由芯片内部其它外设来控制。根据GPIO结构框图,数据流向就得改变一下了,如下图。红色线为复用为输入,此时片上外设读取IO上电平变化,IO口电平由外部控制。绿色线为复用为输出,此时片上外设控制IO口电平变化,以驱动外部器件。如PA9和PA10复用为串口的TX和RX,用来实现串口通信。

        接下来举例:将PA9复用为USART1的TX,将PA10复用为USART1的RX的配置。

USART1复用到PA9和PA10的依据在《STM32F103xCDE中文参考手册》的8.3.8USART复用功能重映射。从下表中可以看到USART1映射到PA9和PA10。需要重映射时可以复用到PB6和PB7,我们不配置REMAP寄存器,就是默认复用PA9和PA10。

      此时我们已经知道USART1是映射到PA9和PA10。那么接下来我们配置PA9和PA10,与串口连接起来,根据GPIO配置寄存器可以知道,配置如下图。

    如上图配置,将PA9配置为复用推挽输出,PA10配置为上拉输入,如此配置依据在《STM32F103xCDE中文参考手册》8.1.11节外设的GPIO配置中有,对于USART RX最好加上拉,接收才能更加稳定,浮空的话会有干扰。配置完PA9和PA10就是串口的配置了,此时PA9和PA10已经分别接到USART1的输入和输出引脚上了。配置依据如下图。

七、复用GPIO标准库配置代码:

void gpio_init(void)
{
  //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;

 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);	//使能        
     USART1,GPIOA时钟
  
	//USART1_TX   GPIOA.9
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
   
  //USART1_RX	  GPIOA.10初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
  GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10  
}

八、GPIO的上拉和下拉

        在《STM32F103xCDE中文参考手册》的第8节,由GPIO结构图我们知道在输入方向上有上拉电阻和下拉电阻,上拉电阻就是引脚悬空时,使得引脚电平为高电平,即接到VCC上,下拉电阻就是在引脚悬空时,使得引脚电平为低电平,即接到GDN上。浮空输入就是上拉和下拉都不接,此时引脚上电平不确定,完全由外部控制,此时就可能受到干扰。

在GPIO的配置寄存器中,配置上拉和下拉是都是00,此时无法确定是引脚上到底是下拉还上拉,那该如何去寻找呢?

        在STM32F103xCDE中文参考手册》的第8节,表17中有详细说明,上拉的区分是由GPIO的ODR寄存器来确定的,即ODR配置为高电平就是上拉,配置为低电平就是下拉。此处明明是输入模式,配置的确实ODR寄存器。所以此处需要注意。

九、结语

        啰嗦了这么多,学习STM32还是的把手册看熟悉,得知道那部分知识大致在那个位置,需要查阅时能够及时查看。另外阅读标准库代码和手册对照,学习标准库的设计逻辑才能快速提高,从而进一步提升自己的软硬件结合能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值