@TOC


前言


一、GPIO的概念

STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的简称,是STM32芯片上的一些引脚,用于与外部世界进行通信。 想象一下STM32芯片就像一个微型大脑,而GPIO引脚就是它的手臂和感官。这些手臂可以用来连接到LED灯、按钮、电机、传感器等外部设备,而感官则可以用来接收来自外部世界的信息,比如检测按钮是否被按下,或者读取传感器的数据。 您可以通过编程来控制这些手臂,告诉它们是应该高举还是低放,就像您控制您的手臂一样。这就是GPIO的基本概念:它们是微控制器与外部设备之间的桥梁,允许微控制器与外部世界互动和通信。通过控制这些引脚的电压,您可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。所以,GPIO是让STM32芯片与外部设备互动的关键部分。

二、CubeMX配置GPIO

2.1 基础配置

1、点击File创建新的工程

【STM32基础 CubeMX】从0带你点灯_初始化

【STM32基础 CubeMX】从0带你点灯_引脚_02

2、输入STM32型号

【STM32基础 CubeMX】从0带你点灯_电子设备_03

3、选择具体的STM32

【STM32基础 CubeMX】从0带你点灯_初始化_04

双击就可以创建了。就像下面这样:

【STM32基础 CubeMX】从0带你点灯_电子设备_05

然后使用CTRL+s保存,切记不要保存到中文路径下面。4、配置时钟

【STM32基础 CubeMX】从0带你点灯_初始化_06

点击RCC,把High Speed Clock(HSE)设置成图片上面的这个5、选择Clock Configuration配置时钟

【STM32基础 CubeMX】从0带你点灯_电子设备_07

6、设置微控制器的主总线时钟为最大

【STM32基础 CubeMX】从0带你点灯_电子设备_08

你这里有多大设置多大,然后按回车。7、设置debug模式为Serial wire

【STM32基础 CubeMX】从0带你点灯_初始化_09

8、选择工具链

【STM32基础 CubeMX】从0带你点灯_初始化_10

9、生成代码

【STM32基础 CubeMX】从0带你点灯_初始化_11

【STM32基础 CubeMX】从0带你点灯_引脚_12

这样就是生成好了,我们进行一些Keil的普通配置即可烧录程序进去!

2.2 GPIO配置

1、首先在原理图中找到你想要点的灯的引脚

【STM32基础 CubeMX】从0带你点灯_初始化_13

2、在CubeMX里面找到他

【STM32基础 CubeMX】从0带你点灯_引脚_14

3、设置引脚模式

【STM32基础 CubeMX】从0带你点灯_引脚_15

因为我们是要点灯,所以设置输出模式

【STM32基础 CubeMX】从0带你点灯_初始化_16

右键可以设置他的名字。4、接下来设置这个配置特定的GPIO引脚在输出模式下的电压电平状态。

【STM32基础 CubeMX】从0带你点灯_引脚_17

5、设置GPIO mode

【STM32基础 CubeMX】从0带你点灯_初始化_18

他们的介绍如下: 推挽输出(Push-Pull Output):

想象一下你有一个开关,可以很容易地按下(这是推)和放开(这是挽)。推挽输出就像这样的开关。它可以将电路连接到电源(高电平)或地(低电平)。

开漏输出(Open-Drain Output):

现在,想象你只能把开关按下,但不能把它放开。这就像你只能把开关拉向地面,但不能把它推向电源。开漏输出就像这样,它只能将电路连接到地(低电平),但在高电平时不会主动提供电源。

这两者之间的主要区别在于,推挽输出可以主动提供电源和连接到地,而开漏输出只能连接到地。开漏输出通常用于需要多个设备共享同一信号线的情况,而推挽输出用于一般的输出任务,比如控制LED灯或驱动电机等。

所以驱动灯需要推挽模式

6、设置GPIO输出的速度

【STM32基础 CubeMX】从0带你点灯_电子设备_19

可以设置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);
}

【STM32基础 CubeMX】从0带你点灯_电子设备_20

下面为这些代码的解析: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);

【STM32基础 CubeMX】从0带你点灯_引脚_21

参数解释:

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);

【STM32基础 CubeMX】从0带你点灯_初始化_22

四、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 */
}

【STM32基础 CubeMX】从0带你点灯_电子设备_23

其中HAL_Delay是一个延时函数,参数为延时的毫秒数。


总结

本文介绍了STM32微控制器的基础概念,特别是GPIO(通用输入/输出端口),并以通俗易懂的方式解释了相关概念。首先,我们了解了STM32是一系列用于控制电子设备的微控制器芯片品牌。在这个系列中,GPIO引脚扮演了重要角色,它们就像微控制器的手臂和感官,用于连接和与外部世界通信。GPIO引脚的基本概念是它们可以通过编程来控制,就像控制手臂一样。通过改变这些引脚的电压,可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。GPIO是STM32与外部设备互动和通信的关键部分。这篇文章强调了GPIO的初始化过程,以及如何使用HAL库中的函数来配置和控制GPIO引脚。示例代码中展示了如何初始化GPIO引脚,并将其配置为输出,以控制LED的点亮和熄灭。 总的来说,本文提供了一个入门级的STM32 GPIO教程,让读者了解了如何从零开始控制一个简单的电子设备,即LED灯。这是深入学习STM32嵌入式开发的第一步,为进一步探索更复杂的应用奠定了基础。希望本文对初学者有所帮助,引导他们进入嵌入式系统开发的精彩世界。