hpm_wdg_drv.h 8.2 KB

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