hpm_wdg_drv.h 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. /*
  2. * Copyright (c) 2021 - 2022 hpmicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_WDG_DRV_H
  8. #define HPM_WDG_DRV_H
  9. /**
  10. * @brief WDG APIs
  11. * @defgroup wdg_interface WDG driver APIs
  12. * @ingroup wdg_interfaces
  13. * @{
  14. */
  15. #include "hpm_common.h"
  16. #include "hpm_wdg_regs.h"
  17. /**
  18. * @brief WDG Reset Interval definitions
  19. */
  20. typedef enum reset_interval_enum {
  21. reset_interval_clock_period_mult_128 = 0,
  22. reset_interval_clock_period_mult_256,
  23. reset_interval_clock_period_mult_512,
  24. reset_interval_clock_period_mult_1k,
  25. reset_interval_clock_period_mult_2k,
  26. reset_interval_clock_period_mult_4k,
  27. reset_interval_clock_period_mult_8k,
  28. reset_interval_clock_period_mult_16k,
  29. reset_interval_max = reset_interval_clock_period_mult_16k,
  30. reset_interval_out_of_range,
  31. } reset_interval_t;
  32. /**
  33. * @brief WDG Interrupt interval definitions
  34. */
  35. typedef enum interrupt_interval_enum {
  36. interrupt_interval_clock_period_multi_64,
  37. interrupt_interval_clock_period_multi_256,
  38. interrupt_interval_clock_period_multi_1k,
  39. interrupt_interval_clock_period_multi_2k,
  40. interrupt_interval_clock_period_multi_4k,
  41. interrupt_interval_clock_period_multi_8k,
  42. interrupt_interval_clock_period_multi_16k,
  43. interrupt_interval_clock_period_multi_32k,
  44. interrupt_interval_clock_period_multi_128k,
  45. interrupt_interval_clock_period_multi_512k,
  46. interrupt_interval_clock_period_multi_2m,
  47. interrupt_interval_clock_period_multi_4m,
  48. interrupt_interval_clock_period_multi_8m,
  49. interrupt_interval_clock_period_multi_32m,
  50. interrupt_interval_clock_period_multi_128m,
  51. interrupt_interval_clock_period_multi_512m,
  52. interrupt_interval_clock_period_multi_2g,
  53. interrupt_interval_max = interrupt_interval_clock_period_multi_2g,
  54. interrupt_interval_out_of_range,
  55. } interrupt_interval_t;
  56. /**
  57. * @brief WDG clock source definitions
  58. */
  59. typedef enum wdg_clksrc_enum {
  60. wdg_clksrc_extclk, /**< WDG clock source: external clock */
  61. wdg_clksrc_pclk, /**< WDG clock source: Peripheral clock */
  62. wdg_clksrc_max = wdg_clksrc_pclk
  63. } wdg_clksrc_t;
  64. /**
  65. * @brief WDG Control configuration structure
  66. * @note WDG reset time = reset_interval + interrupt interval
  67. */
  68. typedef struct wdg_control_struct {
  69. reset_interval_t reset_interval; /**< WDG reset interval */
  70. interrupt_interval_t interrupt_interval; /**< WDG interrupt interval */
  71. bool reset_enable; /**< WDG reset enable */
  72. bool interrupt_enable; /**< WDG interrupt enable */
  73. wdg_clksrc_t clksrc; /**< WDG clock source */
  74. bool wdg_enable; /**< WDG enable */
  75. } wdg_control_t;
  76. #define WDG_WRITE_ENABLE_MAGIC_NUM (0x5AA5UL) /**< WDG enable magic number */
  77. #define WDG_RESTART_MAGIC_NUM (0xCAFEUL) /**< WDG restart magic number */
  78. #define WDG_EXT_CLK_FREQ (32768UL) /**< WDG External CLock frequency: 32768 Hz */
  79. #ifdef __cplusplus
  80. extern "C" {
  81. #endif
  82. /**
  83. * @brief WDG write enable function
  84. *
  85. * @param [in] base WDG base address
  86. */
  87. static inline void wdg_write_enable(WDG_Type *base)
  88. {
  89. base->WREN = WDG_WRITE_ENABLE_MAGIC_NUM;
  90. }
  91. /**
  92. * @brief WDG Enable function
  93. *
  94. * @param [in] base WDG base address
  95. */
  96. static inline void wdg_enable(WDG_Type *base)
  97. {
  98. wdg_write_enable(base);
  99. base->CTRL |= WDG_CTRL_EN_MASK;
  100. }
  101. /**
  102. * @brief WDG Disable function
  103. *
  104. * @param [in] base WDG base address
  105. */
  106. static inline void wdg_disable(WDG_Type *base)
  107. {
  108. wdg_write_enable(base);
  109. base->CTRL &= ~WDG_CTRL_EN_MASK;
  110. }
  111. /**
  112. * @brief WDG reset enable function
  113. *
  114. * @param [in] base WDG base address
  115. */
  116. static inline void wdg_reset_enable(WDG_Type *base)
  117. {
  118. wdg_write_enable(base);
  119. base->CTRL |= WDG_CTRL_RSTEN_MASK;
  120. }
  121. /**
  122. * @brief WDG reset disable function
  123. *
  124. * @param [in] base WDG base address
  125. */
  126. static inline void wdg_reset_disable(WDG_Type *base)
  127. {
  128. wdg_write_enable(base);
  129. base->CTRL &= ~WDG_CTRL_RSTEN_MASK;
  130. }
  131. /**
  132. * @brief WDG interrupt enable function
  133. *
  134. * @param [in] base WDG base address
  135. */
  136. static inline void wdg_interrupt_enable(WDG_Type *base)
  137. {
  138. wdg_write_enable(base);
  139. base->CTRL |= WDG_CTRL_INTEN_MASK;
  140. }
  141. /**
  142. * @brief WDG interrupt disable function
  143. *
  144. * @param [in] base WDG base address
  145. */
  146. static inline void wdg_interrupt_disable(WDG_Type *base)
  147. {
  148. wdg_write_enable(base);
  149. base->CTRL &= ~WDG_CTRL_INTEN_MASK;
  150. }
  151. /**
  152. * @brief WDG Clock Source selection function
  153. *
  154. * @param [in] base WDG base address
  155. * @param [in] clksrc WDG clock source
  156. * @arg wdg_clksrc_extclk External clock
  157. * @arg wdg_clksrc_pclk Peripheral clock
  158. */
  159. static inline void wdg_clksrc_select(WDG_Type *base, wdg_clksrc_t clksrc)
  160. {
  161. if (clksrc == wdg_clksrc_extclk) {
  162. base->CTRL &= ~WDG_CTRL_CLKSEL_MASK;
  163. }
  164. else {
  165. base->CTRL |= WDG_CTRL_CLKSEL_MASK;
  166. }
  167. }
  168. /**
  169. * @brief WDG restart function
  170. *
  171. * @param [in] base WDG base address
  172. */
  173. static inline void wdg_restart(WDG_Type *base)
  174. {
  175. wdg_write_enable(base);
  176. base->RESTART = WDG_RESTART_MAGIC_NUM;
  177. }
  178. /**
  179. * @brief WDG Get Status function
  180. *
  181. * @param [in] base WDG base address
  182. * @retval WDG status register value
  183. */
  184. static inline uint32_t wdg_get_status(WDG_Type *base)
  185. {
  186. return base->ST;
  187. }
  188. /**
  189. * @brief WDG clear status function
  190. *
  191. * @param [in] base WDG base address
  192. * @param [in] status_mask WDG status mask value
  193. */
  194. static inline void wdg_clear_status(WDG_Type *base, uint32_t status_mask)
  195. {
  196. base->ST = status_mask;
  197. }
  198. /**
  199. * @brief WDG initialization function
  200. *
  201. * @param [in] base WDG base address
  202. * @param [in] wdg_ctrl WDG control structure
  203. * @retval API execution status
  204. */
  205. hpm_stat_t wdg_init(WDG_Type *base, wdg_control_t *wdg_ctrl);
  206. /**
  207. * @brief Convert the Reset interval value based on the WDG source clock frequency and the expected reset interval
  208. * in terms of microseconds
  209. *
  210. * @param [in] src_freq WDG source clock frequency
  211. * @param [in] reset_us Expected Reset interval in terms of microseconds
  212. * @retval Converted WDG reset interval
  213. */
  214. reset_interval_t wdg_convert_reset_interval_from_us(const uint32_t src_freq, const uint32_t reset_us);
  215. /**
  216. * @brief Convert the interrupt interval value based on the WDG source clock frequency and the expected interrupt interval
  217. * in terms of microseconds
  218. *
  219. * @param [in] src_freq WDG source clock frequency
  220. * @param [in] interval_us Expected Interrupt interval in terms of microseconds
  221. * @retval Converted WDG interrupt interval
  222. */
  223. interrupt_interval_t wdg_convert_interrupt_interval_from_us(const uint32_t src_freq, uint32_t interval_us);
  224. /**
  225. * @brief Get Actual WDG Interrupt Interval in terms of microseconds
  226. *
  227. * @param [in] base WDG base address
  228. * @param [in] src_freq WDG source clock frequency
  229. * @return Converted WDG interrupt interval in terms of microseconds
  230. */
  231. uint32_t wdg_get_interrupt_interval_in_us(WDG_Type *base, const uint32_t src_freq);
  232. /**
  233. * @brief Get Actual WDG Reset Interval in terms of microseconds
  234. *
  235. * @param [in] base WDG base address
  236. * @param [in] src_freq WDG source clock frequency
  237. * @return Converted WDG total reset interval in terms of microseconds
  238. */
  239. uint32_t wdg_get_total_reset_interval_in_us(WDG_Type *base, const uint32_t src_freq);
  240. #ifdef __cplusplus
  241. }
  242. #endif
  243. /**
  244. * @}
  245. */
  246. #endif /* HPM_WDG_DRV_H */