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 实现停止。
实现
流程图
核心代码
- 按键中断+阻塞延时
/* 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;
}
}
}
- 按键中断+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 */
}
效果
- 按键中断+阻塞延时
- 按键中断+RTOS非阻塞延时