stm32笔记[6]-中断触发流水灯

环境

开发环境

  • STM32CubeIDE

硬件

Alios Things Dev kit 开发板

  • STM32L496VGT6
  • LED1:PB6(低电平有效)
  • LED2:PE3(低电平有效)
  • LED3:PD15(低电平有效)
  • KEY_1_A:PE14(低电平有效)
  • KEY_2_M:PE11(低电平有效)
  • KEY_3_B:PE10(低电平有效)
  • STLK_TX:PB10(LPUART1)
  • STLK_RX:PB11(LPUART1)

硬件外观:

引脚配置:

功能描述

利用按键(中断)实现流水灯的启动与停止,KEY1 实现流水灯的启动,KEY2 实现停止。

实现

流程图

核心代码

  1. 按键中断+阻塞延时
/* USER CODE BEGIN 0 */
// 定义全局变量,用于记录LED灯的状态
extern uint8_t led_state = 0;
// 定义全局变量,用于记录定时器计数
extern uint32_t timer_counter = 0;
/* USER CODE END 0 */
/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  if(led_state==1){
	  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);
	  HAL_Delay(500);
	  HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_15);
	  HAL_Delay(500);
	  }

  }
  /* USER CODE END 3 */
// 定义中断处理函数,处理按键下降沿中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  // 判断是否是按键引脚的中断
  if (GPIO_Pin == GPIO_PIN_11) {
	  if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_11)==0){
		  // 切换是否闪烁两个LED灯
		  led_state = !led_state;
	  }
  }
}
  1. 按键中断+RTOS非阻塞延时
/* Definitions for defaultTask */
osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {
  .name = "defaultTask",
  .stack_size = 128 * 4,
  .priority = (osPriority_t) osPriorityNormal,
};
/* USER CODE BEGIN 0 */
// 定义全局变量,用于记录LED灯的状态
extern uint8_t led_state = 0;
// 定义全局变量,用于记录定时器计数
extern uint32_t timer_counter = 0;
/* USER CODE END 0 */
/* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
/* Start scheduler */
  osKernelStart();
  // 定义中断处理函数,处理按键下降沿中断
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  // 判断是否是按键引脚的中断
  if (GPIO_Pin == GPIO_PIN_11) {
		  if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_11)==0){
		  // 切换是否闪烁两个LED灯
		  led_state = !led_state;
		  }

  }
}
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN 5 */
  /* Infinite loop */
  for(;;)
  {
	  if(led_state==1){
  	        HAL_UART_Transmit(&hlpuart1,"ok\n",4,1000);
  	        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_6);
  	        HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_3);
  	        HAL_GPIO_TogglePin(GPIOD,GPIO_PIN_15);
  	        osDelay(1000);//1s
	  }
  }
  /* USER CODE END 5 */
}

效果

  1. 按键中断+阻塞延时
  2. 按键中断+RTOS非阻塞延时

posted @ 2023-04-18 02:03  qsBye  阅读(571)  评论(0编辑  收藏  举报