基于STM32 HAL库,不使用RTOS,实现事件驱动的软件定时器,时间基准使用系统滴答定时器,单次出发或周期触发可选,可无限扩展,请给出详细代码
时间: 2023-03-07 10:14:04 浏览: 124
可以使用以下代码实现:#include "stm32f4xx_hal.h"#define MAX_TIMERS 10typedef struct
{
uint32_t timer_value;
uint8_t is_cyclic;
void (*callback)(void);
}Timer_t;Timer_t timer_list[MAX_TIMERS];//定时器初始化
void Timer_init(void)
{
uint8_t i;
for(i=0;i<MAX_TIMERS;i++)
{
timer_list[i].timer_value = 0;
timer_list[i].is_cyclic = 0;
timer_list[i].callback = NULL;
}
//系统滴答定时器初始化
SysTick_Config(SystemCoreClock/1000);
}//定时器添加
void Timer_add(uint32_t timer_value, uint8_t is_cyclic, void (*callback)(void))
{
uint8_t i;
for(i=0;i<MAX_TIMERS;i++)
{
if(timer_list[i].callback == NULL)
{
timer_list[i].timer_value = timer_value;
timer_list[i].is_cyclic = is_cyclic;
timer_list[i].callback = callback;
break;
}
}
}//定时器处理
void Timer_handler(void)
{
uint8_t i;
for(i=0;i<MAX_TIMERS;i++)
{
if(timer_list[i].callback != NULL)
{
if(timer_list[i].timer_value > 0)
{
timer_list[i].timer_value--;
}
else
{
timer_list[i].callback();
if(timer_list[i].is_cyclic)
{
timer_list[i].timer_value = timer_list[i].timer_value;
}
else
{
timer_list[i].callback = NULL;
}
}
}
}
}//系统滴答中断服务程序
void SysTick_Handler(void)
{
Timer_handler();
}