STM32基本定时器的启动和停止
文章目录
- 需求背景
- 实现目标
- 核心代码实现
- 实现效果
需求背景
在报警提示中,经常需要通过LED灯闪烁来提示报警,但是又需要人工解除报警,即取消LED灯闪烁。
在这个需求背景下,实现路径有两种:
- 轮询方式实现(简单但占用CPU)
- 中断方式实现(推荐,高效)
我们选择高效的中断方式实现,也便于和业务解耦。
实现目标
我们最终使用STM32F407ZGT6,选择基本定时器TIM6,用定时器的更新中断实现LED灯的闪烁,关闭定时器结束LED灯的闪烁。启动时,默认处于报警状态,即LED灯闪烁,可以通过按键Key0,解除报警,即关闭LED灯闪烁,通过按键Key1可以再次触发报警,即再次LED灯闪烁。
核心代码实现
//btim.h
#ifndef __BTIM_H
#define __BTIM_H#include "./SYSTEM/sys/sys.h"void btim_timx_int_init(uint16_t arr, uint16_t psc);
void clear_timx(TIM_HandleTypeDef *htim);#endif
//btim.c
#include "./BSP/TIMER/btim.h"
#include "./BSP/LED/led.h"TIM_HandleTypeDef g_timx_handle;/* 定时器中断初始化函数 */
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{g_timx_handle.Instance = TIM6; /* 定时器6寄存器基地址 */g_timx_handle.Init.Prescaler = psc; /* 分频系数 */g_timx_handle.Init.Period = arr; /* 自动重装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_TIM_Base_Start_IT(&g_timx_handle); /* 使能定时器和定时器更新中断并启动计数器 */
}/* 定时器基础MSP初始化函数,在HAL_TIM_Base_Start_IT中会被调用 */void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){__HAL_RCC_TIM6_CLK_ENABLE(); /* 开启定时器6时钟 */HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 1, 3); /* 设置中断优先级,抢占优先级1,响应优先级3 */HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); /* 开启中断使能,中断号IRQn */}
}/* 定时器6中断服务函数 */
void TIM6_DAC_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_handle);
}/* 定时器溢出中断中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){LED0_TOGGLE();}
}/* 关闭定时器 */
void clear_timx(TIM_HandleTypeDef *htim)
{HAL_TIM_Base_Stop_IT(htim);
}/* 在HAL_TIM_Base_Stop_IT中被调用 */
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6){__HAL_RCC_TIM6_CLK_DISABLE();HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);}
}
实现效果
STM32按键实现启动和关闭定时器