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
。