nu_timer.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /**************************************************************************//**
  2. * @file timer.c
  3. * @brief N9H30 series TIMER driver source file
  4. *
  5. * @note
  6. * SPDX-License-Identifier: Apache-2.0
  7. * Copyright (C) 2018 Nuvoton Technology Corp. All rights reserved.
  8. *****************************************************************************/
  9. #include "N9H30.h"
  10. #include "nu_sys.h"
  11. #include "nu_timer.h"
  12. void TIMER_SET_CMP_VALUE(uint32_t timer, uint32_t u32Cmpr)
  13. {
  14. uint32_t u32TmrCMPROffset;
  15. u32TmrCMPROffset = REG_TMR0_CMPR + timer * 0x10;
  16. outpw(u32TmrCMPROffset, u32Cmpr);
  17. }
  18. void TIMER_SET_OPMODE(uint32_t timer, uint32_t u32OpMode)
  19. {
  20. uint32_t u32TmrCSROffset;
  21. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  22. outpw(u32TmrCSROffset, (inpw(u32TmrCSROffset) & ~(0x3UL << 27)) | u32OpMode);
  23. }
  24. void TIMER_SET_PRESCALE_VALUE(uint32_t timer, uint32_t u32PreScale)
  25. {
  26. uint32_t u32TmrCSROffset;
  27. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  28. outpw(u32TmrCSROffset, (inpw(u32TmrCSROffset) & ~(0xFFUL)) | u32PreScale);
  29. }
  30. uint32_t TIMER_GetModuleClock(uint32_t timer)
  31. {
  32. return 12000000;
  33. }
  34. void TIMER_Start(uint32_t timer)
  35. {
  36. uint32_t u32TmrCSROffset;
  37. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  38. outpw(u32TmrCSROffset, inpw(u32TmrCSROffset) | TIMER_COUNTER_ENABLE);
  39. }
  40. void TIMER_Stop(uint32_t timer)
  41. {
  42. uint32_t u32TmrCSROffset;
  43. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  44. outpw(u32TmrCSROffset, inpw(u32TmrCSROffset) & ~TIMER_COUNTER_ENABLE);
  45. }
  46. void TIMER_ClearCounter(uint32_t timer)
  47. {
  48. uint32_t u32TmrCSROffset;
  49. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  50. outpw(u32TmrCSROffset, inpw(u32TmrCSROffset) | TIMER_COUNTER_RESET);
  51. }
  52. uint32_t TIMER_GetCounter(uint32_t timer)
  53. {
  54. uint32_t u32TmrDROffset;
  55. u32TmrDROffset = REG_TMR0_DR + timer * 0x10;
  56. return inpw(u32TmrDROffset);
  57. }
  58. uint32_t TIMER_GetCompareData(uint32_t timer)
  59. {
  60. uint32_t u32TmrCMPROffset;
  61. u32TmrCMPROffset = REG_TMR0_CMPR + timer * 0x10;
  62. return inpw(u32TmrCMPROffset);
  63. }
  64. void TIMER_EnableInt(uint32_t timer)
  65. {
  66. uint32_t u32TmrCSROffset;
  67. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  68. outpw(u32TmrCSROffset, inpw(u32TmrCSROffset) | TIMER_INTERRUPT_ENABLE);
  69. }
  70. void TIMER_DisableInt(uint32_t timer)
  71. {
  72. uint32_t u32TmrCSROffset;
  73. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  74. outpw(u32TmrCSROffset, inpw(u32TmrCSROffset) & ~TIMER_INTERRUPT_ENABLE);
  75. }
  76. void TIMER_Close(uint32_t timer)
  77. {
  78. uint32_t u32TmrCSROffset;
  79. u32TmrCSROffset = REG_TMR0_CSR + timer * 0x10;
  80. outpw(u32TmrCSROffset, 0);
  81. }
  82. uint32_t TIMER_Open(uint32_t timer, uint32_t u32Mode, uint32_t u32Freq)
  83. {
  84. uint32_t u32Clk = TIMER_GetModuleClock(timer);
  85. uint32_t u32Cmpr = 0, u32Prescale = 0;
  86. uint32_t u32TmrOffset = 0;
  87. // Fastest possible timer working freq is u32Clk / 2. While cmpr = 2, pre-scale = 0
  88. if (u32Freq > (u32Clk / 2))
  89. {
  90. u32Cmpr = 2;
  91. }
  92. else
  93. {
  94. /* Clock source is only XIN. */
  95. u32Cmpr = u32Clk / u32Freq;
  96. }
  97. u32TmrOffset = timer * 0x10;
  98. TIMER_Close(timer); /* disable timer */
  99. TIMER_DisableInt(timer); /* clear for safety */
  100. outpw(REG_TMR0_CMPR + u32TmrOffset, u32Cmpr);
  101. outpw(REG_TMR0_CSR + u32TmrOffset, u32Mode | u32Prescale);
  102. return (u32Clk / (u32Cmpr * (u32Prescale + 1)));
  103. }
  104. /*** (C) COPYRIGHT 2018 Nuvoton Technology Corp. ***/