STM32 GPIO讲解及标准库应用(基础篇)

简介:       

 STM32是一系列基于ARM Cortex-M内核的32位微控制器。该系列微控制器广泛应用于计算机、通讯、工业自动化、消费电子、汽车电子、医疗仪器及家庭电器等领域。该系列控制器具有高性能、低功耗、智能化等特点。其中,GPIO就是STM32控制器中的一种重要的通用输入输出口。

        GPIO全称为“General Purpose Input and Output”,即通用输入输出口。它是STM32控制器中的一种数字输入输出接口,具有广泛的应用。GPIO通常是微控制器与外围电路之间的主要通信接口。它可以通过控制逻辑电平来实现输入、输出、控制等功能。在STM32控制器中,GPIO口通常是通过引脚配置和寄存器编程进行控制的。


STM32控制器中的GPIO口具有以下特征:

  • 可编程性强:GPIO口的功能由配置它们的寄存器所决定。可以通过编程改变其工作模式(输入、输出、模拟等),其共有八种输入输出模式,分别为以下八种:
  •    

                    输出模式下可控制端口输出高低电平,用以驱动外部模块,如LED、蜂鸣器、模拟通信协议输出时序等。只要是可以使用高低电平对其进行控制的,都可以使用GPIO引脚完成,如果控制功率较大的设别,如电机等,则需要加入驱动电路。

                    输入模式下可读取端口的高低电平或电压,用于读取按键输入、ADC电压采集、模拟通信协议接收数据等。

  • 电压适应性强:STM32控制器的GPIO输入和输出口具有较宽的电压适应范围(0~3.3V),可以适应3.3V或5V的外围电路。
  • 可配置性高:GPIO口可以进行复用,多个GPIO口可以通过引脚复用功能共享同一个管脚,从而实现更多的接口和功能。
  • 高速性能:GPIO口的传输速度可以达到几百MHz,可以满足最高性能要求。

  • 结构:

    首先,我们对这张图进行分析,APB2为总线(总线以后在讲,这里只需要知道GPIO由总线控制),控制GPIOA和GPIOB以及其他部分,如何区分GPIOA和GPIOB及其他部分,这里可以看我们的数据手册,如下面的一张图,:

    可以看到上面有PA0,PB1,PC1等等,这里的PA0引脚就归属于 GPIOA,PB1引脚就归属于 GPIOB。每个GPIO外设,总共有16个引脚,编号为0到15,当GPIO的第0号引脚,一般将其成为PA0,接着就是PA1。。。。。等等

    在STM32控制器中,GPIO模块内包含寄存器和驱动器,分别是:

    1. 寄存器:GPIO模块内部有多个寄存器,用于控制GPIO口的工作模式、电平状态、中断控制等。常见的GPIO寄存器包括GPIOx_MODER、GPIOx_ODR、GPIOx_IDR、GPIOx_BSRR等。这些寄存器可以通过编程来进行配置和控制。

    2. 驱动器:GPIO模块内部的驱动器用于控制GPIO口的电平状态。在STM32控制器中,GPIO口可以输出高电平、低电平或者高阻态,驱动器可以根据寄存器的配置来控制GPIO口的电平状态。常见的GPIO驱动器包括CMOS、TTL等。

    STM32是32位的单片机,故STM32内部的寄存器都是32位的,由于端口只有16位,所以寄存器只有低16位对应的有端口,高16位无用。

    寄存器和驱动器是GPIO模块内部的两个重要组成部分,它们共同实现了GPIO口的各种功能。通过对GPIO寄存器的配置,可以实现GPIO口的输入、输出、中断控制等操作;通过GPIO驱动器的控制,可以实现GPIO口的电平状态控制。


     代码介绍:

    1、对ST单片机的整个IO进行复位操作
    void GPIO_DeInit(GPIO_TypeDef* GPIOx);
    
    2、根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器
    void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
    
    3、把 GPIO_InitStruct 中的每一个参数按缺省值填
    void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
    
    4、读取指定端口管脚的输入
    uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    
    5、读取指定端口管脚的输出
    uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    
    6、拉高引脚输出电平
    void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    
    7、拉低引脚输出电平
    void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    
    8、对 IO进行写操作,仅可以自定义设置写0或写1,都0或都1
    void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
    
    9、对整个IO端口进行写操作,0xFFFF 对应 0-15 PIN全部置为1;0x0000全部置为0
    void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
    
    10、当引脚具有复用功能时,可进行设置
    void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
    

    演示代码效果: 

    1、LED.C
    
    #include "stm32f10x.h"                  // Device header
    #include "Delay.h"
    
    void LED_Init(void)
    {
    	
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);	//开启APB2外设时钟
    	
    	GPIO_DeInit(GPIOC);	//对整个GPIOC引脚进行复位操作
    	GPIO_InitTypeDef GPIO_InitStructure;	//声明结构体GPIO_InitStructure
    	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;	
    	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;		//推挽输出
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    	GPIO_Init(GPIOC,&GPIO_InitStructure);
    
    }
     
    
    void LED(void)
    {
    	GPIO_WriteBit(GPIOB,GPIO_Pin_7,(BitAction)0);	//BitAction为强制类型转换符
    	Delay_ms(500);
    	GPIO_WriteBit(GPIOB,GPIO_Pin_7,Bit_SET);
    	Delay_ms(500);
    }
    
    void PC13_ON(void)
    {
    		GPIO_ResetBits(GPIOC,GPIO_Pin_13);		//低电平点亮PC13LED灯
    		Delay_ms(500);
    }
    
    void PC13_OFF(void)
    {
    		GPIO_SetBits(GPIOC,GPIO_Pin_13);		//高电平点亮PC13LED灯
    		Delay_ms(500);
    }
    
    uint8_t LED_GetNum(void)
    {
    	return GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13 ); //读取PC13号端口的输入值
    }
    
    2、LED.h
    
    
    #ifndef __LED_H
    #define __LED_H
    
    void LED_Init(void);
    void PC13_ON(void);
    void PC13_OFF(void);
    uint8_t LED_GetNum(void);
    void LED(void);
    
    #endif
    
    

    3、main.c
    
    
    #include "stm32f10x.h"                  // Device header
    #include "LED.h"
    #include "Delay.h"
    
    uint8_t LEDNum;
    int main(void)
    {
    	LED_Init();
    	
    	while(1)
    	{
    		/*低电平点亮PC13的LED灯。
    		初始时,引脚为任意电平,当引脚为低电平时
    		熄灭LED灯,熄灭LED时的电平为高电平,所以引脚也被设置为高电平了
    		当引脚为高电平时,点亮LED灯,点亮LED时的电平为低电平,所以这样就可以循环往复。
    		*/
    			if(LED_GetNum() == 1)			//如果引脚为高电平,则点亮LED灯,输入值和输出值在这里对于程序没有影响,只需要得到引脚的电平值。
    				{
    					PC13_ON();
    					Delay_ms(500);
    					GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)0);
    				}
    			else
    				{
    					PC13_OFF();
    					Delay_ms(2000);
    					GPIO_WriteBit(GPIOC,GPIO_Pin_13,(BitAction)1);
    				}
    				
    		}
    	}
    
    
    
    //测试结果,LED灯交替闪烁

    在STM32控制器中,GPIO口的应用非常广泛。比如,可以使用GPIO口来控制LED灯灯光的亮灭、控制继电器的闭合、读取传感器的数据等。同时,GPIO口也可以广泛应用于通信领域,如SPI、I2C、USART等串行通信控制等。其中,GPIO口的引脚复用功能可以实现多重功能,如CAN总线、PWM输出等特殊功能。

    综上所述,GPIO是STM32控制器中的一个重要设备,这种通用输入输出口具有可编程性强、电压适应性好、可配置性高、高速性能等特点,在系统设计中具有广泛的应用。

    作者:Xa_L

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 GPIO讲解及标准库应用(基础篇)

    发表评论