【STM32基础 CubeMX】从0带你点灯

简介: 【STM32基础 CubeMX】从0带你点灯

前言


一、GPIO的概念


STM32是一系列微控制器芯片的品牌,它们用于控制各种电子设备。其中的GPIO是通用输入/输出端口的简称,是STM32芯片上的一些引脚,用于与外部世界进行通信。

想象一下STM32芯片就像一个微型大脑,而GPIO引脚就是它的手臂和感官。这些手臂可以用来连接到LED灯、按钮、电机、传感器等外部设备,而感官则可以用来接收来自外部世界的信息,比如检测按钮是否被按下,或者读取传感器的数据。

您可以通过编程来控制这些手臂,告诉它们是应该高举还是低放,就像您控制您的手臂一样。这就是GPIO的基本概念:它们是微控制器与外部设备之间的桥梁,允许微控制器与外部世界互动和通信。通过控制这些引脚的电压,您可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。所以,GPIO是让STM32芯片与外部设备互动的关键部分。


二、CubeMX配置GPIO


2.1 基础配置

1、点击File创建新的工程

4682bcbc3dd347de8f727f1281f8eef0.png

a5ea21b4f0824408889f0729f1830b3a.png

2、输入STM32型号

48eb2667115a4f1cb4d2f0b7687ffd85.png

3、选择具体的STM32

b53b9ed134ac4483896f2cf73675122d.png

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

444d79d66f404d009e5005a9ce27082c.png

然后使用CTRL+s保存,切记不要保存到中文路径下面。

4、配置时钟

6485131502284444b2126d4e71619968.png

点击RCC,把High Speed Clock(HSE)设置成图片上面的这个

5、选择Clock Configuration配置时钟

3ce415d7346541acaddad914a02d09e2.png

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

84e7cde331eb454a8e8d1a72d4779e11.png

你这里有多大设置多大,然后按回车。

7、设置debug模式为Serial wire

5682d319d321403b8bc4d947413a963c.png

8、选择工具链

b2b44d44322049fa96f16c6d3da2ba81.png

9、生成代码

2396f2e375364c0bbb424179b13113a2.png

9425298fc02549d283d93e4581f5ade3.png

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


2.2 GPIO配置

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

e1ac291a10ed47178fec91fc3259ada9.png

2、在CubeMX里面找到他

4c54008fdbcb4cc185a3f9c291bf4b3e.png

3、设置引脚模式

da83ffa652aa496a8cee5976839d0419.png

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

c9bb3be279c94832bbdeaf2fa05cbd40.png

右键可以设置他的名字。

4、接下来设置这个配置特定的GPIO引脚在输出模式下的电压电平状态。

d62f45bdf2da4ca3b68a1cbbce3959f8.png

5、设置GPIO mode

9c65aee4e95e4a4b9284449861b01c87.png

他们的介绍如下:

推挽输出(Push-Pull Output):

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

开漏输出(Open-Drain Output):

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

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

所以驱动灯需要推挽模式

6、设置GPIO输出的速度

20046454d2984979a4c99c507a71c1c6.png

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


98aa0889ef2d42f48f47f48f2a2b349f.png

下面为这些代码的解析:

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


23e6b93a5b00406f893d8bfb8ce94fbe.png

参数解释:


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


70115a8d59cb46428ae619ecf674f086.png


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


1a179639721f4374b7d66d77afe13fbc.png

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


总结


本文介绍了STM32微控制器的基础概念,特别是GPIO(通用输入/输出端口),并以通俗易懂的方式解释了相关概念。

首先,我们了解了STM32是一系列用于控制电子设备的微控制器芯片品牌。在这个系列中,GPIO引脚扮演了重要角色,它们就像微控制器的手臂和感官,用于连接和与外部世界通信。

GPIO引脚的基本概念是它们可以通过编程来控制,就像控制手臂一样。通过改变这些引脚的电压,可以执行各种任务,例如点亮LED、移动电机、检测按钮按下等等。GPIO是STM32与外部设备互动和通信的关键部分。

这篇文章强调了GPIO的初始化过程,以及如何使用HAL库中的函数来配置和控制GPIO引脚。示例代码中展示了如何初始化GPIO引脚,并将其配置为输出,以控制LED的点亮和熄灭。

总的来说,本文提供了一个入门级的STM32 GPIO教程,让读者了解了如何从零开始控制一个简单的电子设备,即LED灯。这是深入学习STM32嵌入式开发的第一步,为进一步探索更复杂的应用奠定了基础。希望本文对初学者有所帮助,引导他们进入嵌入式系统开发的精彩世界。

相关文章
|
芯片
最详细STM32,cubeMX 按键点亮 led
最详细STM32,cubeMX 按键点亮 led
189 0
|
传感器 芯片
最详细STM32,cubeMX 点亮 led
最详细STM32,cubeMX 点亮 led
148 0
|
6月前
|
C语言
【STM32 CubeMX】移植u8g2(一次成功)
【STM32 CubeMX】移植u8g2(一次成功)
564 0
|
6月前
|
传感器 开发者
【STM32基础 CubeMX】外部中断
【STM32基础 CubeMX】外部中断
232 44
|
6月前
|
存储 传感器
【STM32基础 CubeMX】uart串口通信
【STM32基础 CubeMX】uart串口通信
337 0
|
6月前
|
传感器 存储 编解码
【STM32基础 CubeMX】ADC的基础使用
【STM32基础 CubeMX】ADC的基础使用
184 0
|
6月前
|
存储
【STM32基础 CubeMX】PWM输出
【STM32基础 CubeMX】PWM输出
590 0
|
6月前
|
传感器 物联网 开发者
【STM32基础 CubeMX】定时器的使用
【STM32基础 CubeMX】定时器的使用
304 0
|
6月前
|
数据安全/隐私保护 芯片
【STM32基础 CubeMX】按键的检测
【STM32基础 CubeMX】按键的检测
157 0