官方SDK的下载地址:gittee下载地址
配套代码的地址为
SYD8811SDK-master\SYD8811SDK-master\Source Code\SYD8811_peripheral\timer
零、友情提醒
只是使用这种形式的定时器的最基本功能(也就是所谓的时基),或许会有亿点点需要知道的,但作为入坑玩家,只需要记住三点——使能、失能和回调函数。下面我会以timer0为例。
一、使能函数
该函数位于timer.c,可以直接使用官方的这个定时器库。
/*
定时器1 配置函数
参数:
uint32_t interval 定时器是递减计数器 interval就是计数器初值
void * p_callback 定时器中断的回调函数
定时器时钟: 32.768KHz
*/
void timer_1_enable(uint32_t interval, void * p_callback)
{
if(TIMER_CTRL->TIMER_1_EN== 1)
{
TIMER_CTRL->TIMER_1_EN = 0;
delay_us(50);
}
TIMER_CTRL->TIMER_1_VAL= interval;
TIMER_CTRL->TIMER_1_RGLR= 1;
TIMER_CTRL->TIMER_1_INT_MASK = 0;
timer_callback[1] = ((void (*)(void))p_callback);
TIMER_CTRL->TIMER_1_INT_CLR = 1;
NVIC_EnableIRQ(TIMER1_IRQn);
TIMER_CTRL->TIMER_1_EN = 1;
}
官方还是非常够意思的说的很明白了,第一个参数是装载初值,第二个就是回调函数
(1)已知我需要定时的时间,装载初值怎么算
晶振频率 * 需要定时的时间(秒)
假设我需要100ms中断一次,也就是32768 * 0.1 = 32768 / 10 即可。
(2)回调函数问题
我个人觉得这里其实是可以自定义的,没必要还跟STM32写一个回调函数得规规矩矩的。具体理由下文有提及
(3)使用示例
timer_1_enable(32768/2, Timer_1_callback);//500ms
二、失能函数
/*
定时器1 失能函数 关闭定时器1的中断
*/
void timer_1_disable(void)
{
TIMER_CTRL->TIMER_1_EN = 0;
NVIC_DisableIRQ(TIMER1_IRQn);
TIMER_CTRL->TIMER_1_INT_CLR = 1;
}
失能没啥好说的,不需要就直接调用 timer_1_disable(void) 就好了。
三、回调函数
首先我们知道中断后是直接进行中断服务的。
定时器1 中断服务函数 这里调用了回调函数
*/
void TIMER1_IRQHandler(void)
{
if(TIMER_CTRL->TIMER_1_INT_STATUS == 1)
{
TIMER_CTRL->TIMER_1_INT_CLR = 1;
if(timer_callback[1] != 0)
(*timer_callback[1])();
}
}
所谓的回调函数其实就是因为在中断服务中通过指针指向进行了调用的。具体指向还得重新回头看一下使能里面有一行代码
timer_callback[1] = ((void (*)(void))p_callback);
这个就是我们调用使能函数的时候必须写入的参数最后就实现了在中断里执行如下的回调函数。
static void Timer_1_callback(void)
{
GPIO_Pin_Turn(U32BIT(LED2));
dbg_printf("Timer_1_callback\r\n");
}