主要想法是封装一个定时器模块。当需要创建一个周期任务时,只须调用一个函数,传入定时时间和回调函数地址就能让周期任务运行起来,不需要管底层配置。
我的方法是利用STM32F4某个定时器的4路捕获比较通道来作为中断源,通过即时更改比较值来保证相同的间隔时间。
talk is cheap,码来了:
bsp_timer.c
#include "bsp_timer.h"
#include "util.h"
Timer timer[TIMER_NUM];
//当前定时器的个数
static uint8_t curr_timer_num = 0;
//用捕获比较通道定时,一共有4个通道,所以最多可以有4个独立定时器
void TIM14_init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
TIM_TimeBaseStructure.TIM_Period = 0XFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
TIM_Cmd (TIM14, ENABLE);
nvic_config(TIM8_TRG_COM_TIM14_IRQn, 3);