前言
一、GPIO的概念
STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的简称,是STM32芯片上的一些引脚,用于与外部世界进行通信。
想象一下STM32芯片就像一个微型大脑,而GPIO引脚就是它的手臂和感官。这些手臂可以用来连接到LED灯、按钮、电机、传感器等外部设备,而感官则可以用来接收来自外部世界的信息,比如检测按钮是否被按下,或者读取传感器的数据。
您可以通过编程来控制这些手臂,告诉它们是应该高举还是低放,就像您控制您的手臂一样。这就是GPIO的基本概念:它们是微控制器与外部设备之间的桥梁,允许微控制器与外部世界互动和通信。通过控制这些引脚的电压,您可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。所以,GPIO是让STM32芯片与外部设备互动的关键部分。
二、CubeMX配置GPIO
2.1 基础配置
1、点击File创建新的工程
2、输入STM32型号
3、选择具体的STM32
双击就可以创建了。就像下面这样:
然后使用CTRL+s保存,切记不要保存到中文路径下面。
4、配置时钟
点击RCC,把High Speed Clock(HSE)设置成图片上面的这个
5、选择Clock Configuration配置时钟
6、设置微控制器的主总线时钟为最大
你这里有多大设置多大,然后按回车。
7、设置debug模式为Serial wire
8、选择工具链
9、生成代码
这样就是生成好了,我们进行一些Keil的普通配置即可烧录程序进去!
2.2 GPIO配置
1、首先在原理图中找到你想要点的灯的引脚
2、在CubeMX里面找到他
3、设置引脚模式
因为我们是要点灯,所以设置输出模式
右键可以设置他的名字。
4、接下来设置这个配置特定的GPIO引脚在输出模式下的电压电平状态。
5、设置GPIO mode
他们的介绍如下:
推挽输出(Push-Pull Output):
想象一下你有一个开关,可以很容易地按下(这是推)和放开(这是挽)。推挽输出就像这样的开关。它可以将电路连接到电源(高电平)或地(低电平)。
开漏输出(Open-Drain Output):
现在,想象你只能把开关按下,但不能把它放开。这就像你只能把开关拉向地面,但不能把它推向电源。开漏输出就像这样,它只能将电路连接到地(低电平),但在高电平时不会主动提供电源。
这两者之间的主要区别在于,推挽输出可以主动提供电源和连接到地,而开漏输出只能连接到地。开漏输出通常用于需要多个设备共享同一信号线的情况,而推挽输出用于一般的输出任务,比如控制LED灯或驱动电机等。
所以驱动灯需要推挽模式
6、设置GPIO输出的速度
可以设置3个等级,这里的灯没有要求,随便设置!
最后我们生成代码。
三、点灯代码讲解
3.1 cubemx生成的代码
static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET); /*Configure GPIO pin : PB5 */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }
下面为这些代码的解析:
static void MX_GPIO_Init(void):这是一个静态函数,用于初始化GPIO配置。函数名是MX_GPIO_Init,不接收任何参数,返回值为空(void)。
GPIO_InitTypeDef GPIO_InitStruct = {0};:在函数内部创建了一个名为GPIO_InitStruct的结构体变量,用于配置GPIO的初始化参数,并初始化为默认值。
__HAL_RCC_GPIOA_CLK_ENABLE();:这行代码启用GPIOA端口的时钟。它告诉微控制器启动GPIOA端口的时钟以激活它,以便您可以在这个端口上使用GPIO引脚。
__HAL_RCC_GPIOB_CLK_ENABLE();:这行代码启用GPIOB端口的时钟,同样的道理,它启用了GPIOB端口以使其可用。
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);:这行代码将GPIOB端口的第5号引脚(也就是PB5)的输出电平设置为低电平(GPIO_PIN_RESET)。这通常用于初始化GPIO引脚的状态。
GPIO_InitStruct.Pin = GPIO_PIN_5;:这行代码设置了GPIO_InitStruct结构体中的Pin成员,指定了要配置的GPIO引脚,即PB5。
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;:这行代码设置了GPIO_InitStruct结构体中的Mode成员,将GPIO引脚配置为推挽输出模式(GPIO_MODE_OUTPUT_PP)。这意味着PB5将能够提供电源并连接到地。
GPIO_InitStruct.Pull = GPIO_NOPULL;:这行代码设置了GPIO_InitStruct结构体中的Pull成员,表示不使用上拉或下拉电阻。
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;:这行代码设置了GPIO_InitStruct结构体中的Speed成员,将GPIO引脚的输出速度配置为高速度。这表示GPIO引脚将具有较短的上升和下降边沿,以实现高速输出。
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);:最后一行代码将配置参数应用到GPIOB端口的PB5引脚上,初始化该引脚的配置。
3.2 1个库函数
HAL_GPIO_WritePin函数是HAL(Hardware Abstraction Layer)库中的一个函数,用于控制STM32微控制器上的GPIO引脚的输出电平。以下是该函数的原型以及参数的作用:
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
参数解释:
GPIO_TypeDef* GPIOx:这是一个指向GPIO端口寄存器的指针。它告诉函数要控制哪个GPIO端口。在STM32库中,每个GPIO端口都有一个相应的GPIO_TypeDef结构体指针,用于访问该端口的寄存器。例如,GPIOA、GPIOB等。
uint16_t GPIO_Pin:这是一个用于指定要控制的GPIO引脚的位掩码。在STM32中,每个GPIO端口有多个引脚,每个引脚都有一个唯一的位掩码。这个参数告诉函数要控制哪些引脚。可以使用位掩码运算来同时控制多个引脚。
GPIO_PinState PinState:这是一个枚举类型的参数,用于指定要设置的引脚状态。它有两个可能的值:
GPIO_PIN_RESET:表示要将引脚的状态设置为低电平(0V)。
GPIO_PIN_SET:表示要将引脚的状态设置为高电平(通常等于系统供电电压或VDD)。
这个函数的作用是根据参数的设置来控制指定GPIO端口上的一个或多个引脚的输出电平状态。它允许您在嵌入式应用中轻松地控制和操作GPIO引脚的电平,用于控制外部设备、传感器和其他外围设备。
那么我们就可以去点亮LED啦:
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
四、LED闪烁
我们只需要在main函数中的while循环写一个高电平一个低电平即可闪烁LED
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,0); HAL_Delay(200); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,1); HAL_Delay(200); /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
其中HAL_Delay是一个延时函数,参数为延时的毫秒数。
总结
本文介绍了STM32微控制器的基础概念,特别是GPIO(通用输入/输出端口),并以通俗易懂的方式解释了相关概念。
首先,我们了解了STM32是一系列用于控制电子设备的微控制器芯片品牌。在这个系列中,GPIO引脚扮演了重要角色,它们就像微控制器的手臂和感官,用于连接和与外部世界通信。
GPIO引脚的基本概念是它们可以通过编程来控制,就像控制手臂一样。通过改变这些引脚的电压,可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。GPIO是STM32与外部设备互动和通信的关键部分。
这篇文章强调了GPIO的初始化过程,以及如何使用HAL库中的函数来配置和控制GPIO引脚。示例代码中展示了如何初始化GPIO引脚,并将其配置为输出,以控制LED的点亮和熄灭。
总的来说,本文提供了一个入门级的STM32 GPIO教程,让读者了解了如何从零开始控制一个简单的电子设备,即LED灯。这是深入学习STM32嵌入式开发的第一步,为进一步探索更复杂的应用奠定了基础。希望本文对初学者有所帮助,引导他们进入嵌入式系统开发的精彩世界。