Timer使用参考
1. 概述¶
公版提供3个Timer硬件定时器,可配置为单次触发或循环触发。
目前Timer0系统使用中, 建议用户使用Timer1或者Timer2。
代码路径:rtk/proj/sc/driver/sysdriver/timer
2. Timer变量控制¶
以下提供变量控制的方式操作定时器,需要事先声明定时器变量:
extern volatile PmTimer_t * const g_ptPmTimer0; extern volatile PmTimer_t * const g_ptPmTimer1; extern volatile PmTimer_t * const g_ptPmTimer2;
2.1. 设置单次/循环触发¶
//二选一 g_ptPmTimer0->reg_timer_trig = 1; /*设置单次触发*/ g_ptPmTimer0->reg_timer_en = 1; /*设置循环触发*/
2.2. 启动定时器¶
g_ptPmTimer0->reg_timer max_low = tick&0xFFFF; g_ptPmTimer0->reg_timer max_high = ((tick>>16)&0xFFFF); //二选一 g_ptPmTimer0->reg_timer_trig = 1; /*设置循环触发*/ g_ptPmTimer0->reg_timer_en = 1; /*设置循环次触发*/
2.3. 关闭定时器¶
g_ptPmTimer0->reg_timer_en = 0; g_ptPmTimer1->reg_timer_en = 0; g_ptPmTimer2->reg_timer_en = 0;
2.4. 注册中断处理¶
以timer1为例
CamOsIrqRequest(INT_FIQ_TIMER_1, _TimerIsrCallBack, "TIMER1 ISR", NULL);
2.5. Timer1注册为唤醒源¶
extern void SetWakeupIrq(int nIntcNumber, int gpio); SetWakeupIrq(INT_FIQ_TIMER_1, 0);
注意:第一次使用timer1或timer2时, 请自行设定divide除频(设置0x23), 在str过程中系统会做切换, 因此resume后无需再设定。
2.6. Timer1示例(s秒触发中断)¶
#include "sys_sys_isw_cli.h"
#include "hal_reg_timer.h"
#include "irqs.h"
extern volatile PmTimer_t * const g_ptPmTimer1;
static void _TimerIsrCallBack(u32 nIrq, void *pDevId)
{
CamOsPrintf("[%s %d] %llu ms\r\n", __FUNCTION__, __LINE__, CamOsGetTimeInMs());
}
static int _TestCMD(CLI_t *pCli, char *p)
{
s32 argc;
u32 value;
argc = CliTokenCount(pCli);
if (argc == 1)
{
if (CliTokenPopNum(pCli, &value, 0) != eCLI_PARSE_OK)
return eCLI_PARSE_INVALID_PARAMETER;
cliPrintf("[%s %d] value:%d\r\n", __FUNCTION__, __LINE__, value);
if (value == 0) {
CamOsIrqRequest(INT_FIQ_TIMER_1, _TimerIsrCallBack, "TIMER1 ISR", NULL);
extern void SetWakeupIrq(int nIntcNumber, int gpio);
SetWakeupIrq(INT_FIQ_TIMER_1, 0);
} else if (value == 1) {
g_ptPmTimer1->reg_timer_en = 0;
g_ptPmTimer1->reg_timer_int_en = 0;
g_ptPmTimer1->reg_timer_max_high = (((5000*12000)>>16)&0xFFFF);
g_ptPmTimer1->reg_timer_max_low = ((5000*12000)&0xFFFF);
// g_ptPmTimer1->reg_timer_trig = 1;
g_ptPmTimer1->reg_timer_int_en = 1;
g_ptPmTimer1->reg_timer_div = (0x24 -1);
g_ptPmTimer1->reg_timer_en = 1;
} else if (value == 2) {
run_command("pm_str");
}
cliPrintf("[%s %d] success\r\n", __FILE__, __LINE__);
}
else
{
cliPrintf("[%s %d] input error\r\n", __FUNCTION__, __LINE__);
return eCLI_PARSE_INPUT_ERROR;
}
return eCLI_PARSE_OK;
}
SS_RTOS_CLI_CMD(testcmd,
"use cmd to test rtos function",
"usage: testcmd <value>",
_TestCMD);
输入命令testcmd 0将注册timer1中断以及唤醒源,testcmd 1启用timer1进行5s定时,testcmd 2通过命令函数直接进入STR。
3. Timer API¶
如若使用API的方式,详情见rtk/proj/sc/driver/sysdriver/timer/drv/pub/drv_timer_api.h。