RISCV_TIMER使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 04/18/2023

    1. 概述

    ‌定时器(Timer)‌是一种在计算机和微控制器系统中用于测量时间间隔或产生精确定时事件的硬件模块。定时器的基本工作原理是通过一个时钟源驱动计数器,当计数器达到预设值时,产生一个事件,通常是通过中断来通知处理器。

    2. 关键字说明

    • PM-timer

      由PM-domain供电的timer。

    • NonPMtimer

      由NonPM domain供电的timer。

    • OneShoot mode

      Timer的一种工作模式,timer到达时间后值触发中断。

    • RunLoop mode

      Timer的一种工作模式,timer触发后将重置计数核循环触发。

    3. 功能描述

    无论是PM-timer还是NonPMtimer,定时器的使用有这相同的步骤,从开发角度来看,有五个环节

    1. 注册定时器

    2. 开启定时器

    3. 系统执行定时器的中断函数和调用定时器的处理函数

    4. 关闭定时

    5. 注销定时器

    除此之外,使用timer的时候还需要考虑到以下一些因素:

    • 硬件数量

      • PM-timer 8个

      • NonPM-timer 4个

    • CLK 介绍

      • PM-timer0 ~ PM-timer3 和 NonPM-timer 采用同一个时钟,默认频率12MHz, PM-timer4 ~ PM-timer7各自采用不同的时钟。

      • PM-timer0 ~ PM-timer3 各自使用不同的硬件中断号,PM-timer4 ~ PM-timer7 采用同一个硬件中断号。

    • Limitation 介绍

      • 软件限制:riscv侧和arm侧不能同时使用同一个timer,会导致中断混乱。
    • 工作模式介绍

      • Timer 有两种工作模式,一种是oneshoot 模式,另一种是 RunLoop 模式。

    4. 硬件连接介绍

    SOC内置

    5. RTOS用法介绍

    5.1. DRIVER PATH

    sc/driver/sysdriver/timer/drv/pub/drv_pm_timer.h
    sc/driver/sysdriver/timer/drv/pub/drv_timer_api.h
    sc/driver/sysdriver/timer/drv/pub/drv_timer.h
    sc/driver/sysdriver/timer/drv/src/abi_headers_timer.c
    sc/driver/sysdriver/timer/drv/src/drv_pm_timer.c
    sc/driver/sysdriver/timer/drv/src/drv_timer.c
    sc/driver/sysdriver/timer/drv/src/drv_timer_test.c
    

    5.2. CONFIG配置

    无需配置。

    5.3. SYSDESC配置

    无需配置。

    5.4. Padmux配置

    无需配置。

    5.5. Sample code

    static void timer_isr(void)
    {
        CamOsPrintf("I am timer%d!\n", timer.timer_id);
    }
    
    int timer_teset(void)
    {
        drv_timer_id timer_id = 1;
        u32 time = 20000;
    
        drv_timer_register_isr(timer_id, timer_isr);
    
        drv_timer_start(timer_id, time);
    
        CamOsMsSleep(20000);
    
        drv_timer_stop(timer_id);
    
        drv_timer_release_isr(timer_id)
    }
    

    5.6. UT case

    1)打开timer测试demo宏定义__VER_TIMER__

    2)测试demo路径:sc/driver/sysdriver/timer/drv/src/drv_timer_test.c

    3)执行测试

    SS-RTOS # timer
    Plz key in : timer [timerID] [time]
    [timerID] 1 - timer1
              2 - timer2
              3 - timer3
              4 - timer4
              5 - timer5
              6 - timer4
              7 - timer5
    [time] timing time(ms)
    timer [timerId] [time]
    
    Example:
      # timer 1 1000    /*开启 timer 1, 每个1000ms 上报一次中断,上报10次*/
    

    6. API参考

    该功能模块提供以下接口:

    API名称 功能
    drv_timer_register_isr 注册timer对应的中断函数
    drv_timer_release_isr 释放timer绑定的中断函数
    drv_timer_disable_intr 关闭timer绑定的中断函数
    drv_timer_enable_intr 使能timer绑定的中断函数
    drv_timer_clear_intr 清除timer的中断
    drv_timer_get_intr_status 获取timer的中断状态
    drv_timer_stop 停止timer
    drv_timer_start 启动timer,时间单位ms
    drv_timer_start_us 启动timer,时间单位us
    drv_timer_get_timeout_length 获取Timer过期时间对应的计数值
    drv_timer_get_count 获取timer启动到现在timer计数器上的值
    drv_timer_get_kickoff_time_us 获取timer启动到现在过去了多少时间,时间单位us

    6.1. drv_timer_register_isr

    • 功能

      注册timer的中断函数

    • 语法

      static inline void drv_timer_register_isr(drv_timer_id timer_id, timer_isr_t isr)
      
    • 参数

      参数名称 描述
      timer_id timer编号
      isr Timer产生中断的时候会调用该函数
    • 返回值

      返回值 描述
      NA NA

    6.2. drv_timer_release_isr

    • 功能

      释放timer绑定的中断函数

    • 语法

      static inline void drv_timer_release_isr(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.3. drv_timer_disable_intr

    • 功能

      关闭timer绑定的中断函数

    • 语法

      static inline void drv_timer_disable_intr(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.4. drv_timer_enable_intr

    • 功能

      使能timer绑定的中断函数

    • 语法

      static inline void drv_timer_enable_intr(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.5. drv_timer_clear_intr

    • 功能

      清除timer的中断

    • 语法

      static inline void drv_timer_clear_intr(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.6. drv_timer_get_intr_status

    • 功能

      获取timer的中断状态

    • 语法

      static inline u32 drv_timer_get_intr_status(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.7. drv_timer_stop

    • 功能

      停止timer

    • 语法

      static inline void drv_timer_stop(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.8. drv_timer_start

    • 功能

      开启timer(timer的过期时间最小单位为1ms)

    • 语法

      static inline void drv_timer_start(drv_timer_id timer_id, u32 expect_time)
      
    • 参数

      参数名称 描述
      timer_id timer编号
      expect_time Timer过期时间(ms)
    • 返回值

      返回值 描述
      NA NA

    6.9. drv_timer_start_us

    • 功能

      开启timer(timer的过期时间最小单位为1us)

    • 语法

      static inline void drv_timer_start_us(drv_timer_id timer_id, u32 expect_time)
      
    • 参数

      参数名称 描述
      timer_id timer编号
      expect_time Timer过期时间(us)
    • 返回值

      返回值 描述
      NA NA

    6.10. drv_timer_get_timeout_length

    • 功能

      获取Timer过期时间对应的计数值。

    • 语法

      static inline u32 drv_timer_get_timeout_length(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      NA NA

    6.11. drv_timer_get_count

    • 功能

      获取timer启动到现在timer计数器上的值

    • 语法

      static inline u32 drv_timer_get_count(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      u32 获取timer启动到现在timer计数器上的值

    6.12. drv_timer_get_kickoff_time_us

    • 功能

      获取timer启动到现在过去了多少时间,最小测量单位us

    • 语法

      static inline u32 drv_timer_get_kickoff_time_us(drv_timer_id timer_id)
      
    • 参数

      参数名称 描述
      timer_id timer编号
    • 返回值

      返回值 描述
      u32 timer启动到现在过去了多少时间,最小测量单位us