使用STM32按键实现LED闪烁效果

首先,需要准备如下硬件设备:

  1. STM32F103C8T6单片机开发板
  2. 4个LED灯
  3. 4个220欧姆电阻
  4. 4个按键

接下来,我将讲解如何连接硬件设备。

  1. 将4个LED灯连接到STM32单片机的PB0、PB1、PB2、PB3引脚上。
  2. 将4个220欧姆电阻连接到PB0、PB1、PB2、PB3引脚上,防止电流过大损坏LED灯。
  3. 将4个按键连接到STM32单片机的PA0、PA1、PA2、PA3引脚上。

连接好硬件设备后,需要编写程序实现LED灯的闪烁,并且根据按键的状态来控制LED灯的亮灭。

首先,需要在程序中定义引脚号和按键状态。我们可以使用宏定义,如下所示:

#define LED0_Pin GPIO_PIN_0   //LED0对应PB0引脚

#define LED0_GPIO_Port GPIOB   //LED0对应GPIOB组

#define LED1_Pin GPIO_PIN_1   //LED1对应PB1引脚

#define LED1_GPIO_Port GPIOB   //LED1对应GPIOB组

#define LED2_Pin GPIO_PIN_2   //LED2对应PB2引脚

#define LED2_GPIO_Port GPIOB   //LED2对应GPIOB组

#define LED3_Pin GPIO_PIN_3   //LED3对应PB3引脚

#define LED3_GPIO_Port GPIOB   //LED3对应GPIOB组

#define KEY0_Pin GPIO_PIN_0   //KEY0对应PA0引脚

#define KEY0_GPIO_Port GPIOA   //KEY0对应GPIOA组

#define KEY1_Pin GPIO_PIN_1   //KEY1对应PA1引脚

#define KEY1_GPIO_Port GPIOA   //KEY1对应GPIOA组

#define KEY2_Pin GPIO_PIN_2   //KEY2对应PA2引脚

#define KEY2_GPIO_Port GPIOA   //KEY2对应GPIOA组

#define KEY3_Pin GPIO_PIN_3   //KEY3对应PA3引脚

#define KEY3_GPIO_Port GPIOA   //KEY3对应GPIOA组

在定义完引脚号和按键状态后,需要初始化GPIO口和NVIC。可以使用HAL库来实现,如下所示:

void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;

__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟

//配置LED引脚为推挽输出
GPIO_InitStruct.Pin = LED0_Pin | LED1_Pin | LED2_Pin | LED3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);

//配置按键引脚为上拉输入
GPIO_InitStruct.Pin = KEY0_Pin | KEY1_Pin | KEY2_Pin | KEY3_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(KEY0_GPIO_Port, &GPIO_InitStruct);

//配置中断
HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); //设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
HAL_NVIC_SetPriority(EXTI1_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI1_IRQn);
HAL_NVIC_SetPriority(EXTI2_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI2_IRQn);
HAL_NVIC_SetPriority(EXTI3_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

在GPIO初始化的基础上,还需要写中断服务函数,处理按键事件。可以使用HAL库提供的函数,如下所示:

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == KEY0_Pin)
  {
   HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //切换LED0状态
  }
   else if (GPIO_Pin == KEY1_Pin)
  {
   HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //切换LED1状态
  }
   else if (GPIO_Pin == KEY2_Pin)
  {
   HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //切换LED2状态
  }
   else if (GPIO_Pin == KEY3_Pin)
  {
   HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); //切换LED3状态
  }
}

最后,我们需要编写主函数,循环实现LED闪烁。可以使用HAL库提供的函数,如下所示:

int main(void)
{
  HAL_Init(); //HAL库初始化
  GPIO_Init(); //GPIO初始化

  while (1)
  {
    HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin); //切换LED0状态
    HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //切换LED1状态
    HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //切换LED2状态
    HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); //切换LED3状态
    HAL_Delay(500); //延时500ms
  }
}

21物联网应用技术2班-韦力  20210320044

物联沃分享整理
物联沃-IOTWORD物联网 » 使用STM32按键实现LED闪烁效果

发表评论