STM32项目实例:LED流水灯 | 文末赠书

文摘   2024-09-03 07:01   山东  

LED流水灯项目视频讲解
本文首先介绍常用的HAL库输出函数,随后实现嵌入式系统开发的经典案例——LED流水灯项目

一 GPIO输出库函数

由第4章分析可知,要实现LED流水灯项目,需要配置PF的工作模式,并设置PF0-PF7的电平状态现将涉及到的HAL库函数一一详解如下。

1.1 GPIO外设时钟使能

要使用STM32微控制器某一外设首先就必须打开其外设时钟,HAL库外设时钟使能和失能是通过一组宏定义来完成的,函数前缀为__

1使能GPIOF外设时钟函数:__HAL_RCC_GPIOF_CLK_ENABLE()

2失能GPIOF外设时钟函数:__HAL_RCC_GPIOF_CLK_DISABLE()

1.2 函数HAL_GPIO_Init

1描述了函数HAL_GPIO_Init

1 函数HAL_GPIO_Init

函数名

HAL_GPIO_Init

函数原

HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)

功能描述

根据GPIO_Init结构体中指定的参数初始化外设 GPIOx 寄存器

输入参数 1

GPIOxx可以是A-I中的一个,用来选择 GPIO 外设

输入参数 2

GPIO_Init:指向结构体GPIO_InitTypeDef的指针,包含了外设GPIO 的配置信息。

输出参数

返回值

1GPIO_InitTypeDef structure

GPIO_InitTypeDef 定义于文件stm32f4xx_hal_gpio.h,代码如下:

typedef struct

{

   uint32_t Pin;

   uint32_t Mode;

   uint32_t Pull;

   uint32_t Speed;

   uint32_t Alternate;

}GPIO_InitTypeDef;

2Pin参数:

该参数选择待设置的GPIO管脚,使用操作符|”可以一次选中多个管脚。该参数可以使用表2中的任意组合。

2 Pin参数值

Pin

描述

Pin

描述

GPIO_Pin_0

选中管脚0

GPIO_Pin_9

选中管脚9

GPIO_Pin_1

选中管脚1

GPIO_Pin_10

选中管脚10

GPIO_Pin_2

选中管脚2

GPIO_Pin_11

选中管脚11

GPIO_Pin_3

选中管脚3

GPIO_Pin_12

选中管脚12

GPIO_Pin_4

选中管脚4

GPIO_Pin_13

选中管脚13

GPIO_Pin_5

选中管脚5

GPIO_Pin_14

选中管脚14

GPIO_Pin_6

选中管脚6

GPIO_Pin_15

选中管脚15

GPIO_Pin_7

选中管脚7

GPIO_PIN_All

选中全部管脚

GPIO_Pin_8

选中管脚8



3Mode参数:

Mode参数用以设置选中管脚的工作模式3给出了可取的值。

3 Mode参数值

Mode

描述

Mode

描述

GPIO_MODE_INPUT

输入浮空模式

GPIO_MODE_IT_RISING

中断上升沿触发

GPIO_MODE_OUTPUT_PP

推挽输出模式

GPIO_MODE_IT_FALLING

中断下降沿触发

GPIO_MODE_OUTPUT_OD

开漏输出模式

GPIO_MODE_IT_RISING_FALLING

中断上、下边沿

GPIO_MODE_AF_PP

复用推挽模式

GPIO_MODE_EVT_RISING

事件上升沿触发

GPIO_MODE_AF_OD

复用开漏模式

GPIO_MODE_EVT_FALLING

事件下降沿触发

GPIO_MODE_ANALOG

模拟信号模式

GPIO_MODE_EVT_RISING_FALLING

事件上、下边沿

4Pull参数:

Pull参数用设置是否使用内部上拉或下拉电阻。表4给出了其可取的值。

4 Pull参数值

Pull

描述

GPIO_NOPULL

无上拉或下拉

GPIO_PULLUP

使用上拉电阻

GPIO_PULLDOWN

使用下拉电阻

5Speed参数

Speed参数用于设置选中管脚的速率,5给出了可取的值。

5 Speed参数值

Speed

描述

GPIO_SPEED_FREQ_LOW

2MHz

GPIO_SPEED_FREQ_MEDIUM

12.5-50MHz

GPIO_SPEED_FREQ_HIGH

25-100MHz

GPIO_SPEED_FREQ_VERY_HIGH

50-200MHz

6Alternate参数:

Alternate参数定义引脚的复用功能,在文件stm32f4xx_hal_gpio_ex.h中定义了参数的可用宏定义,这些复用功能的宏定义与具体的MCU型号有关,表6是其中的部分定义示例。

6 Alternate参数

Speed

描述

GPIO_AF1_TIM1

TIM1复用功能映射

GPIO_AF1_TIM2

TIM2复用功能映射

GPIO_AF5_SPI1

SPI1复用功能映射

GPIO_AF5_SPI2

SPI2/I2S2复用功能映射

GPIO_AF7_USART1

USART1复用功能映射

GPIO_AF7_USART2  

USART2复用功能映射

1.3 函数HAL_GPIO_DeInit

7描述了函数HAL_GPIO_DeInit

7 函数HAL_GPIO_DeInit

函数名

HAL_GPIO_DeInit

函数原

void HAL_GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pin)

功能描述

反初始化GPIO外设寄存器,恢复为复位后的状态

输入参数 1

GPIOxx可以是A-I中的一个,用来选择 GPIO 外设

输入参数 2

GPIO_Pin:指定反初始化端口引脚,取值参阅表2

输出参数

返回值

1.4 函数HAL_GPIO_WritePin

8描述了函数HAL_GPIO_WritePin

8 函数HAL_GPIO_WritePin

函数名

HAL_GPIO_WritePin

函数原

void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)

功能描述

向指定引脚输出高电平或低电平

输入参数1

GPIOxx可以是A-I中的一个,用来选择 GPIO 外设

输入参数2

GPIO_Pin:指定输出端口管脚,取值参阅表2

输入参数3

PinState:写入电平状态,取值GPIO_PIN_RESETGPIO_PIN_SET

输出参数

返回值

1.5 函数HAL_GPIO_TogglePin

9描述了函数HAL_GPIO_TogglePin

9 函数HAL_GPIO_TogglePin

函数名

HAL_GPIO_TogglePin

函数原

void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)

功能描述

翻转指定引脚的电平状态

输入参数1

GPIOxx可以是A-I中的一个,用来选择 GPIO 外设

输入参数2

GPIO_Pin:指定翻转端口引脚,取值参阅表2

输出参数

返回值

1.6 输出寄存器访问

HAL库函数并没有提供访问GPIO端口输出数据寄存器的库函数,所以如果程序中需要读取或更新端口数据,可以采用直接访问端口数据寄存器GPIOx_ODR的方式来完成,其更加高效和快捷。

例:

/* Write data to GPIOA data port */

GPIOA->ODR=0x1101;

二 LED流水灯控制

2.1 项目分析

已知开发板LED流水灯原理图如图1所示。由图可知,如需实现LED流水灯控制只需要依次点亮L1-L8,即需依次设置PF0-PF7为低电平即可,对应GPIOF端口写入数据分别为0xFE0xFD0xFB0XF70xEF0xDF0xBF0x7F

1 LED流水灯电路原理图

2.2 项目实施

项目具体实施步骤为:

1步:复制第3章创建的工程模板文件夹到桌面(也可以复制到其他路径,只是桌面操作更方便),并将文件夹重命名为0501 LEDWater(其他名称完全可以,只是命名需要遵循一定原则,以便于项目积累)。

2步:打开工程模板文件夹里面的Template.ioc文件,启动CubeMX配置软件,首先在引脚视图下面将PF0-PF7全部设置为GPIO_Output模式,然后选择System Core类别下项的GPIO子项,LED控制引脚均设置为推挽、低速、无上拉/下拉、初始输出高电平,添加用户标签LED1~LED8,配置结果如图2所示。时钟配置和工程配置选项无须修改,单击GENERATE CODE按钮生成初始化工程。
2 流水灯项目初始化配置

3步:打开MDK-RAM文件夹下面的工程文件Template.uvprojx,将生成工程编译一下,没有错误和警告就可以开始用户程序编写了。此时工程创建了一个gpio.c文件,并将其添加到Application/User/Core项目组下面,生成的LED初始化程序就存放在该文件当中,部分代码如下

#include "gpio.h"

void MX_GPIO_Init(void)

{

   GPIO_InitTypeDef GPIO_InitStruct = {0};

   __HAL_RCC_GPIOF_CLK_ENABLE();

   HAL_GPIO_WritePin(GPIOF, LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin

             |LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin, GPIO_PIN_SET);

   GPIO_InitStruct.Pin = LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin

                     |LED5_Pin|LED6_Pin|LED7_Pin|LED8_Pin;

   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

   GPIO_InitStruct.Pull = GPIO_NOPULL;

   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

   HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

}

4步:打开main.c文件,在程序沙箱内编写一个简单的延时程序delay()。在main()函数中,需要完成系统初始化、时钟配置,GPIO初始化,上述代码均是由CubeMX自动生成。用户只需定位main函数的while循环程序沙箱,编写流水显示程序,即点亮一个LED灯,调用延时函数,等待约1秒时间,再点亮下一个LED灯,如此往复。需要注意的是,用户编写的所有程序均需写在程序沙箱内,否则修改系统配置后再次生成工程时,用户代码将会丢失。main.c文件的部分程序如下,为便于读者查看用户编写代码,已将程序沙箱注释语句作加粗显示。

#include "LED.h"

#include "main.h"

#include "gpio.h"

void SystemClock_Config(void);

/* USER CODE BEGIN 0 */

void delay(uint32_t i)

{

   while(i--)  ;

}

/* USER CODE END 0 */

int main(void)

{

   HAL_Init(); //系统初始化

   SystemClock_Config();   //系统时钟配置

   MX_GPIO_Init();     //GPIO初始化

   /* USER CODE BEGIN WHILE */

   while (1)

   {

GPIOF->ODR=0xFE;

delay(24000000);

GPIOF->ODR=0xFD;

delay(24000000);

GPIOF->ODR=0xFB;

delay(24000000);

GPIOF->ODR=0xF7;

delay(24000000);

GPIOF->ODR=0xEF;

delay(24000000);

GPIOF->ODR=0xDF;

delay(24000000);

GPIOF->ODR=0xBF;

delay(24000000);

GPIOF->ODR=0x7F;

delay(24000000);

/* USER CODE END WHILE */

   }

}

5步:编译工程,直到没有错误为止,下载程序到开发板,复位运行,检查实验效果。

6 使用教材

7 项目可复制文件下载

STM32项目实例:LED流水灯 .docx

抽奖(ARM Cortex-M4嵌入式系统原理及应用)

(1) 关注公众号,将本篇文章转发朋友圈;
(2) 在公众号对话框界面输入“9,弹出抽奖二维码(抽奖截至时间为9月4日20:00)
(3) 扫描二维码参与抽奖,中奖者请于开奖当日填写邮寄地址。

若有广告投放、招聘发布、会议宣传等合作需求,请联系微信:AISTEQ

人工智能科学与技术
分享教学成果 | 传播前沿科技| 推荐优秀图书
 最新文章