tr_timer_driver.c 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. // 中断服务函数
  25. static void TimerIsr(void);
  26. void TimerInit(void)
  27. {
  28. // 定时器 / 计数器初始化
  29. _TimerInit();
  30. // 定时器 / 计数器中断初始化
  31. TimerInterruptInit();
  32. }
  33. /****************************************************************************/
  34. /* */
  35. /* 定时器 / 计数器初始化 */
  36. /* */
  37. /****************************************************************************/
  38. static void _TimerInit(void)
  39. {
  40. // 配置 定时器 / 计数器 2 为 64 位模式
  41. TimerConfigure(SOC_TMR_2_REGS, TMR_CFG_64BIT_CLK_INT);
  42. // 设置周期
  43. TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
  44. TimerPeriodSet(SOC_TMR_2_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);
  45. // 使能 定时器 / 计数器 2
  46. TimerEnable(SOC_TMR_2_REGS, TMR_TIMER12, TMR_ENABLE_CONT);
  47. }
  48. /****************************************************************************/
  49. /* */
  50. /* 定时器 / 计数器中断初始化 */
  51. /* */
  52. /****************************************************************************/
  53. static void TimerInterruptInit(void)
  54. {
  55. // 注册中断服务函数
  56. IntRegister(C674X_MASK_INT8, TimerIsr);
  57. // 映射中断到 DSP 可屏蔽中断
  58. IntEventMap(C674X_MASK_INT8, SYS_INT_T64P2_TINTALL);
  59. // 使能 DSP 可屏蔽中断
  60. IntEnable(C674X_MASK_INT8);
  61. // 使能 定时器 / 计数器 中断
  62. TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  63. }
  64. /****************************************************************************/
  65. /* */
  66. /* 中断服务函数 */
  67. /* */
  68. /****************************************************************************/
  69. static void TimerIsr(void)
  70. {
  71. // 禁用定时器 / 计数器中断
  72. TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  73. // 清除中断标志
  74. IntEventClear(SYS_INT_T64P2_TINTALL);
  75. TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  76. // tr_timer
  77. BaseTimeIncremental();
  78. // 使能 定时器 / 计数器 中断
  79. TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
  80. }