Timer使用参考

Version 1.0


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