tr_timer_driver.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * timer.c
  3. *
  4. * Created on: 2025年7月24日
  5. * Author: Administrator
  6. */
  7. #include "soc_C6748.h" // DSP C6748 外设寄存器
  8. #include "timer.h"
  9. #include "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义
  10. #include "tr_timer.h"
  11. // 64位 定时器 / 计数器周期
  12. // 定时时间 1 秒
  13. // 低32位
  14. //#define TMR_PERIOD_LSB32 (0x0D970100) // 1s
  15. //#define TMR_PERIOD_LSB32 (0x015BE680) // 100ms
  16. //#define TMR_PERIOD_LSB32 (0x0022CA40*5) // 10ms
  17. #define TMR_PERIOD_LSB32 (0x00037AA0) // 1ms
  18. // 高32位 0
  19. #define TMR_PERIOD_MSB32 (0)
  20. // 定时器 / 计数器初始化
  21. static void _TimerInit(void);
  22. // 定时器 / 计数器中断初始化
  23. static void TimerInterruptInit(void);
  24. // DSP 中断初始化
  25. static void InterruptInit(void);
  26. // 中断服务函数
  27. static void TimerIsr(void);
  28. void TimerInit(void)
  29. {
  30. // 定时器 / 计数器初始化
  31. _TimerInit();
  32. // 定时器 / 计数器中断初始化
  33. TimerInterruptInit();
  34. }
  35. /****************************************************************************/
  36. /* */
  37. /* 定时器 / 计数器初始化 */
  38. /* */
  39. /****************************************************************************/
  40. static void _TimerInit(void)
  41. {
  42. // 配置 定时器 / 计数器 2 为 64 位模式
  43. TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
  44. // 设置周期
  45. TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
  46. TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
  47. // 使能 定时器 / 计数器 2
  48. TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
  49. }
  50. /****************************************************************************/
  51. /* */
  52. /* 定时器 / 计数器中断初始化 */
  53. /* */
  54. /****************************************************************************/
  55. static void TimerInterruptInit(void)
  56. {
  57. // 注册中断服务函数
  58. IntRegister(C674X_MASK_INT8, TimerIsr);
  59. // 映射中断到 DSP 可屏蔽中断
  60. IntEventMap(C674X_MASK_INT8, SYS_INT_T64P2_TINTALL);
  61. // 使能 DSP 可屏蔽中断
  62. IntEnable(C674X_MASK_INT8);
  63. // 使能 定时器 / 计数器 中断
  64. TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  65. }
  66. /****************************************************************************/
  67. /* */
  68. /* 中断服务函数 */
  69. /* */
  70. /****************************************************************************/
  71. static void TimerIsr(void)
  72. {
  73. // 禁用定时器 / 计数器中断
  74. TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  75. // 清除中断标志
  76. IntEventClear(SYS_INT_T64P2_TINTALL);
  77. TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  78. // tr_timer
  79. BaseTimeIncremental();
  80. // 使能 定时器 / 计数器 中断
  81. TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  82. }