基于HAL库的LED流水灯

一、实现LED流水灯

1.STM32CubeMX工程搭建

利用GPIOA 2端口、GPIOB 0端口、GPIOC 13端口轮流闪烁实现LED流水灯
  1. 打开STM32CubeMX,点击File>new project创建新工程,芯片选型stm32f103c8t6
    在这里插入图片描述
    在这里插入图片描述
    双击进入。

  2. 点击system core>gpio 配置
    在这里插入图片描述
    将PA2、PB0、PC13设为GPIO_output模式,如下图:
    在这里插入图片描述

  3. 配置时钟

  • 点击RCC中的High Speed Clock 设置为Crystal/Ceramic Resonator
    在这里插入图片描述
  • 点击上方的Clock Configuration完成配置如下图:
    在这里插入图片描述
  1. 点击SYS,Debug设置为Serinal Wrie
    在这里插入图片描述

  2. 上方Project Manager配置工程
    在这里插入图片描述

  • 工程命名
  • 地址选址(不可包含中文地址,可能打不开keil文件)
  • 选择所用IDE
  1. 单击GENERATE COOE生成项目。

2.代码分析

在生成项目路径中找到MDK-ARM文件夹,打开.uvprojx文件。
在这里插入图片描述
置高电平

 HAL_GPIO_WritePin(GPIOX,GPIO_PIN_x,GPIO_PIN_SET);

置低电平

HAL_GPIO_WritePin(GPIOX,GPIO_PIN_x,GPIO_PIN_RESET);

main.c中函数已经配置好,找到main函数中while(1),编写我们的代码

 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
	  HAL_Delay(500);
	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
	  HAL_Delay(500);

运行生成.hex文件,烧录之。

3.硬件展示

在这里插入图片描述

二、外部中断控制LED亮灭

1.STM32CubeMX工程配置

  1. 在前面配置的基础上增加PA5作为中断口,GPIO选为GPIO_EXTI5
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述输出模式选下降沿触发外部中断,上拉电阻。
  • GPIO mode:
上升沿触发检测的外部中断模式(External Interrupt Mode with Rising edge trigger detection)
下降沿触发检测的外部中断模式(External Interrupt Mode with Falling edge trigger detectiort)
上升/下降沿触发检测的外部中断模式(External Interrupt Mode with Risinq/Falling edge trigger detection)
上升沿触发检测的外部事件模式(External Event Mode with Rising edge trigger detection)
下降沿触发检测的外部事件模式(External Event Mode with Falling edge trigger detection)
上升/下降沿触发检测的外部事件模式(External Event Mode with Rising/Falling edge trigger detectiont)
  1. 左侧NVIC,打开EXTI中的line[9:5] interrupt
    在这里插入图片描述
    或者GPIO中的NVIC也可设置
    在这里插入图片描述
  2. 配置工程中勾选图中选项,GENERATE COOE。
    在这里插入图片描述

2.代码部分

生成代码以后,进入程序;
1.首先,我们在左边stm32f1xx_it.c 里面找到中断处理函数;
在这里插入图片描述
2. 按F12跳转到此函数往下滑找到
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)函数
可以将所有操作都写在中断回调函数里面,代码如下:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	if(GPIO_Pin==GPIO_PIN_5)
	{
		if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==GPIO_PIN_RESET)//获取PA5电位
		{
			 HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
			while(1)
			{
				if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)==GPIO_PIN_SET)
					break;
			}
		}
	}
}

3.硬件展示

在这里插入图片描述

三、仿真逻辑分析仪观察管脚的时序波形

在这里插入图片描述
在这里插入图片描述
周期正好为1秒。

### 蓝桥杯 HAL LED流水灯 示例代码 教程 #### 使用STM32 HAL实现LED流水灯效果 为了实现在蓝桥杯竞赛中的LED流水灯效果,可以利用STM32微控制器及其HAL来编写程序。具体来说,通过控制GPIO端口的状态变化,可以让连接到这些端口上的LED按照预定顺序点亮和熄灭。 在初始化阶段,需要配置好用于驱动LED的GPIO引脚,并设置它们的工作模式为输出。对于具体的硬件平台而言,假设使用的是基于STM32系列MCU开发板,则可以通过如下方式完成基本配置: ```c // 初始化 GPIO 引脚作为输出 void MX_GPIO_Init(void) { __HAL_RCC_GPIOC_CLK_ENABLE(); // 启用 GPIOC 时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置 PC0 到 PC7 为输出 */ GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出 GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); } ``` 接下来,在主循环中定义一个函数用来执行实际的流水灯光效逻辑。这里采用简单的延时方法来模拟不同LED之间的切换时间间隔。每次只有一位有效(即只有一个LED处于导通状态),其余均为高阻态或关闭状态。 ```c #include "stm32f1xx_hal.h" #define DELAY_MS(x) HAL_Delay(x) int main(void) { HAL_Init(); MX_GPIO_Init(); uint8_t i; while (1) { for(i=0;i<8;i++) { // 设置PC[i] 输出低电平使对应的LED亮起 HAL_GPIO_WritePin(GPIOC, GPIO_Pin_All^(1<<i), GPIO_PIN_RESET); // 延迟一段时间让肉眼可见光的变化 DELAY_MS(200); // 清除当前位并准备下一个周期 HAL_GPIO_WritePin(GPIOC, GPIO_Pin_All^(1<<i), GPIO_PIN_SET); } } return 0; } ``` 上述代码片段展示了如何借助于STM32 HAL创建一个基础版本的LED流水灯应用程序[^1]。此程序会依次点亮八个LED,形成流动的效果;当所有LED都已遍历完毕后重新回到起点继续下一轮操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dylan_hs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值