基于HAL库的LED流水灯


前言

使用HAL库配合Keil,方式完成下列任务:
用GPIO端口完成3只LED红绿灯的周期闪烁。用stm32F103核心板的GPIOA端某一管脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED流水灯工作;接低电平时,LED流水灯停止工作。使用Keil的软件仿真逻辑分析仪功能观察管脚的时序波形,观察第1题中3个GPIO端口流水灯的输出波形,并分析时序状态正确与否,高低电平转换周期(LED闪烁周期)实际为多少。

一、STM32中断原理

STM32中断是一种事件驱动机制,当发生特定事件时,处理器通过中断控制器向中断向量表中的特定中断服务函数转移控制权,执行特定操作。中断是一种高优先级的事件,可以打断正在执行的程序流程,使得处理器立即执行中断服务函数,处理完中断后再返回被打断的程序流程。

在STM32中断中,中断控制器负责管理所有的中断,并将中断信号分配到对应的中断向量表中的中断服务函数。中断向量表是一个特殊的内存区域,其中包含了所有中断服务函数的地址。当一个中断发生时,中断控制器会从中断向量表中读取对应中断服务函数的地址,并跳转到该地址开始执行中断服务函数。

STM32中断分为两种:外部中断和内部中断。外部中断是指来自外部设备的中断信号,如GPIO口的中断、定时器的中断等。内部中断是指处理器本身的中断,如硬件异常、软件中断等。每个中断都有一个特定的优先级,当多个中断同时发生时,处理器会先执行优先级更高的中断服务函数。

STM32中断的使用需要先进行中断初始化,将中断向量表中的中断服务函数地址与对应的中断信号绑定起来,并设置中断的优先级。当中断发生时,处理器会自动跳转到对应的中断服务函数中执行,处理完毕后返回被打断的程序流程。正确地使用中断可以提高系统的并发处理能力和响应速度。

二、配置 stm32CubeMX

1.引脚配置

在这里插入图片描述

A0、A1、A2输出控制灯的亮灭,设置为GPIO_Output
A3 模拟开关,设置为GPIO_EXTI3

2.配置GPIO

在这里插入图片描述

PA0、PA1和PA2 GPIO output level 设置为 High
PA3 GPIO 设置为图中所示

3.配置NVCI

在这里插入图片描述

勾选 EXTI line3 interrupt

4.配置RCC

在这里插入图片描述

HSE设置为图中所示

5.配置SYS

在这里插入图片描述

debug设置为图中所示

6.代码创建设置

在这里插入图片描述

勾选上图中标注处

7.创建项目

在这里插入图片描述

输入项目名,其余设置如图标注所示
设置完后,点击右上角GENERATE CODE生成Keil项目工程

三、通过KEil配置代码

1.打开项目,进入main.c

在这里插入图片描述

2、代码添加:

#define LED1_PIN GPIO_PIN_0
#define LED2_PIN GPIO_PIN_1
#define LED3_PIN GPIO_PIN_2
#define LED_PORT GPIOA

#define SWITCH_PIN GPIO_PIN_3
#define SWITCH_PORT GPIOA

在这里插入图片描述

3、流水灯代码:

 /* USER CODE BEGIN WHILE */
  while (1)
    {
        // 读取开关状态
        if (HAL_GPIO_ReadPin(SWITCH_PORT, SWITCH_PIN) == GPIO_PIN_SET)
        {
            // 开关接高电平,LED流水灯工作
            HAL_GPIO_TogglePin(LED_PORT, LED1_PIN);
            HAL_Delay(1000);
            HAL_GPIO_TogglePin(LED_PORT, LED1_PIN);

            HAL_GPIO_TogglePin(LED_PORT, LED2_PIN);
            HAL_Delay(1000);
            HAL_GPIO_TogglePin(LED_PORT, LED2_PIN);

            HAL_GPIO_TogglePin(LED_PORT, LED3_PIN);
            HAL_Delay(1000);
            HAL_GPIO_TogglePin(LED_PORT, LED3_PIN);
        }
    }
  /* USER CODE END 3 */

在这里插入图片描述

4、中断回调函数代码:

/* USER CODE BEGIN 4 */
// 中断回调函数,处理PA3的中断事件
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if (GPIO_Pin == SWITCH_PIN)
    {
        // 读取开关状态
        if (HAL_GPIO_ReadPin(SWITCH_PORT, SWITCH_PIN) == GPIO_PIN_RESET)
        {
            // 开关接低电平,LED流水灯停止工作
            HAL_GPIO_WritePin(LED_PORT, LED1_PIN, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(LED_PORT, LED2_PIN, GPIO_PIN_RESET);
            HAL_GPIO_WritePin(LED_PORT, LED3_PIN, GPIO_PIN_RESET);
        }
    }
}
/* USER CODE END 4 */

5、编译:

在这里插入图片描述

6、烧录

使用 mcuisp 软件进行烧录

在这里插入图片描述

7、结果展示

HAL库流水灯

四、Keil的软件仿真逻辑分析仪功能观察管脚的时序波形

在cubeMX中把PA3引脚去掉,重新生成工程
删除main.c中的中断函数代码及声明,再次编译

1、debug设置

在这里插入图片描述

2、进入debug,进入逻辑分析仪打开设置

在这里插入图片描述

分别输入:PORTA.0 PORTA.1 PORTA.2

3、观察波形

在这里插入图片描述

分析

由图中波形可以看出,时序状态正确,高低电平转换周期(LED闪烁周期)实际为1.001243s 。

总结

通过本次实验,学会了stm32CubeMX使用方法,对STM32中断原理和HAL库函数的开发方法有了更深入的了解和掌握,这对我今后在STM32开发中的工作会有极大的帮助。

参考

STM32CubeMX 下载和安装 详细教程
stm32外部中断模式控制灯亮灭

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值