基于HAL库的LED流水灯(外部中断模式控制亮灭)


一、基于HAL库的LED流水灯

1.利用CubeMX创建项目

1)新建工程在这里插入图片描述
2)选择芯片
在这里插入图片描述3)配置GPIO

引脚配置
1 A4,B9,C15输出控制灯的亮灭,设置为GPIO_Output
2 A1,A7同样设置为GPIO_Output,A1设置为高电平,A7设置为低电平
3 C13作为指示灯,设置为GPIO_Output
4 B5模拟开关,设置为GPIO_EXTI5,中断配置设置成上升沿和下降沿都触发

在这里插入图片描述
User Label设置别名,方便以后调用。

下图为设置触发模式。
设置模式
4)配置SYS
在这里插入图片描述
5)配置RCC
在这里插入图片描述
6)配置NVIC
在这里插入图片描述
7)时钟配置
在这里插入图片描述
8)生成代码
在这里插入图片描述
在这里插入图片描述

2.进入Keil修改代码

1)寻找中断处理函数
在这里插入图片描述
在这里插入图片描述

2)在main.c重写中断处理

代码如下:

uint16_t flag=0;             //声明变量,作为开关标志

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	
   if(GPIO_Pin == GPIO_PIN_5){   //确认中断位置
	   
   GPIO_PinState pinState = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_5);     //获取B5当前电位
	   
   if(pinState==GPIO_PIN_SET)//高电位流水灯亮
   {
 	  flag=1;
   }
   
   else if(pinState==GPIO_PIN_RESET)//低电位流水灯灭
   {
 	  flag=0;
   }
   } 
}

3)流水灯的实现代码

代码如下(替换原while):

while (1)
  {
    if(flag==1){
    HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//PA4亮灯
  	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9熄灯
  	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15熄灯
  	HAL_Delay(500);//延时0.5s
    }
    else if(flag==0){
      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4熄灯
  	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9熄灯
  	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15熄灯
  	  HAL_Delay(500);//延时0.5s
    }
	 if(flag==1){

  	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4熄灯
  	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_SET);//PB9亮灯
  	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15熄灯
  	HAL_Delay(500);//延时0.5s		

    }
    else if(flag==0){
      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4熄灯
  	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9熄灯
  	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15熄灯
  	  HAL_Delay(500);//延时0.5s
    }
	 if(flag==1){
	
  	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4熄灯
  	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9熄灯
  	HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_SET);//PC15亮灯
  	HAL_Delay(500);//延时0.5s
    }
    else if(flag==0){
      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//PA4熄灯
  	  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_9,GPIO_PIN_RESET);//PB9熄灯
  	  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_15,GPIO_PIN_RESET);//PC15熄灯
  	  HAL_Delay(500);//延时0.5s
    }
  }

3.电路连接

在这里插入图片描述

4.效果展示

在这里插入图片描述
黑线接A7,低电平,红线接A1,高电平,棕线接B5,为开关。


接A1,灯亮;接A7,灯灭。

二、观察管脚的时序波形

1.相关配置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要在STM32F407上连接一个按键和一个LED。按键连接到一个GPIO输入引脚,LED连接到一个GPIO输出引脚。 然后,需要初始化这些引脚。使用HAL库提供的函数可以很方便地完成初始化。下面是一个示例代码: ``` #include "stm32f4xx_hal.h" GPIO_InitTypeDef GPIO_InitStruct; void GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); // Initialize button pin (PA0) GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // Initialize LED pin (PC13) GPIO_InitStruct.Pin = GPIO_PIN_13; 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); } ``` 在初始化完成后,需要设置外部中断。使用HAL库提供的函数可以很方便地完成设置。下面是一个示例代码: ``` void EXTI0_IRQHandler(void) { if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == GPIO_PIN_RESET) { HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); } HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void EXTI_Init(void) { // Enable EXTI0 interrupt HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); // Configure EXTI0 line EXTI_HandleTypeDef EXTI_InitStruct; EXTI_InitStruct.Line = EXTI_LINE_0; EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT; EXTI_InitStruct.Trigger = EXTI_TRIGGER_FALLING; EXTI_InitStruct.GPIOSel = EXTI_GPIOA; EXTI_InitStruct.GPIOPin = GPIO_PIN_0; HAL_EXTI_SetConfigLine(&EXTI_InitStruct); } ``` 在设置外部中断完成后,需要启动中断。下面是一个示例代码: ``` int main(void) { HAL_Init(); GPIO_Init(); EXTI_Init(); while (1) { // Do nothing } } ``` 这个示例代码中,当按键被按下时,LED会切换亮灭状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值