您现在的位置是:首页 >技术杂谈 >STM32——关于GPIO讲解及标准库应用(基础篇)网站首页技术杂谈

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

Xa_L 2024-06-26 14:23:48
简介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控制器中的一个重要设备,这种通用输入输出口具有可编程性强、电压适应性好、可配置性高、高速性能等特点,在系统设计中具有广泛的应用。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。