timer_hal.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. // Copyright 2019 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /*******************************************************************************
  15. * NOTICE
  16. * The hal is not public api, don't use in application code.
  17. * See readme.md in soc/include/hal/readme.md
  18. ******************************************************************************/
  19. // The HAL layer for Timer Group.
  20. // There is no parameter check in the hal layer, so the caller must ensure the correctness of the parameters.
  21. #pragma once
  22. #ifdef __cplusplus
  23. extern "C" {
  24. #endif
  25. #include "hal/timer_ll.h"
  26. #include "hal/timer_types.h"
  27. #include "soc/timer_group_caps.h"
  28. /**
  29. * Context that should be maintained by both the driver and the HAL
  30. */
  31. typedef struct {
  32. timg_dev_t *dev;
  33. timer_idx_t idx;
  34. } timer_hal_context_t;
  35. /**
  36. * @brief Init the timer hal. This function should be called first before other hal layer function is called
  37. *
  38. * @param hal Context of the HAL layer
  39. * @param group_num The timer group number
  40. * @param timer_num The timer number
  41. *
  42. * @return None
  43. */
  44. void timer_hal_init(timer_hal_context_t *hal, timer_group_t group_num, timer_idx_t timer_num);
  45. /**
  46. * @brief Get interrupt status register address and corresponding control bits mask
  47. *
  48. * @param hal Context of the HAL layer
  49. * @param status_reg[out] interrupt status register address
  50. * @param mask_bit[out] control bits mask
  51. */
  52. void timer_hal_get_status_reg_mask_bit(timer_hal_context_t *hal, uint32_t *status_reg, uint32_t *mask_bit);
  53. /**
  54. * @brief Set timer clock prescale value
  55. *
  56. * @param hal Context of the HAL layer
  57. * @param divider Prescale value
  58. *
  59. * @return None
  60. */
  61. #define timer_hal_set_divider(hal, divider) timer_ll_set_divider((hal)->dev, (hal)->idx, divider)
  62. /**
  63. * @brief Get timer clock prescale value
  64. *
  65. * @param hal Context of the HAL layer
  66. * @param divider Pointer to accept the prescale value
  67. *
  68. * @return None
  69. */
  70. #define timer_hal_get_divider(hal, divider) timer_ll_get_divider((hal)->dev, (hal)->idx, divider)
  71. /**
  72. * @brief Load counter value into time-base counter
  73. *
  74. * @param hal Context of the HAL layer
  75. * @param load_val Counter value
  76. *
  77. * @return None
  78. */
  79. #define timer_hal_set_counter_value(hal, load_val) timer_ll_set_counter_value((hal)->dev, (hal)->idx, load_val)
  80. /**
  81. * @brief Get counter value from time-base counter
  82. *
  83. * @param hal Context of the HAL layer
  84. * @param timer_val Pointer to accept the counter value
  85. *
  86. * @return None
  87. */
  88. #define timer_hal_get_counter_value(hal, timer_val) timer_ll_get_counter_value((hal)->dev, (hal)->idx, timer_val)
  89. /**
  90. * @brief Set counter mode, include increment mode and decrement mode.
  91. *
  92. * @param hal Context of the HAL layer
  93. * @param increase_en True to increment mode, fasle to decrement mode
  94. *
  95. * @return None
  96. */
  97. #define timer_hal_set_counter_increase(hal, increase_en) timer_ll_set_counter_increase((hal)->dev, (hal)->idx, increase_en)
  98. /**
  99. * @brief Get counter mode, include increment mode and decrement mode.
  100. *
  101. * @param hal Context of the HAL layer
  102. * @param counter_dir Pointer to accept the counter mode
  103. *
  104. * @return
  105. * - true Increment mode
  106. * - false Decrement mode
  107. */
  108. #define timer_hal_get_counter_increase(hal) timer_ll_get_counter_increase((hal)->dev, (hal)->idx)
  109. /**
  110. * @brief Set counter status, enable or disable counter.
  111. *
  112. * @param hal Context of the HAL layer
  113. * @param counter_en True to enable counter, false to disable counter
  114. *
  115. * @return None
  116. */
  117. #define timer_hal_set_counter_enable(hal, counter_en) timer_ll_set_counter_enable((hal)->dev, (hal)->idx, counter_en)
  118. /**
  119. * @brief Get counter status.
  120. *
  121. * @param hal Context of the HAL layer
  122. *
  123. * @return
  124. * - true Enable counter
  125. * - false Disable conuter
  126. */
  127. #define timer_hal_get_counter_enable(hal) timer_ll_get_counter_enable((hal)->dev, (hal)->idx)
  128. /**
  129. * @brief Set auto reload mode.
  130. *
  131. * @param hal Context of the HAL layer
  132. * @param auto_reload_en True to enable auto reload mode, flase to disable auto reload mode
  133. *
  134. * @return None
  135. */
  136. #define timer_hal_set_auto_reload(hal, auto_reload_en) timer_ll_set_auto_reload((hal)->dev, (hal)->idx, auto_reload_en)
  137. /**
  138. * @brief Get auto reload mode.
  139. *
  140. * @param hal Context of the HAL layer
  141. *
  142. * @return
  143. * - true Enable auto reload mode
  144. * - false Disable auto reload mode
  145. */
  146. #define timer_hal_get_auto_reload(hal) timer_ll_get_auto_reload((hal)->dev, (hal)->idx)
  147. /**
  148. * @brief Set the counter value to trigger the alarm.
  149. *
  150. * @param hal Context of the HAL layer
  151. * @param alarm_value Counter value to trigger the alarm
  152. *
  153. * @return None
  154. */
  155. #define timer_hal_set_alarm_value(hal, alarm_value) timer_ll_set_alarm_value((hal)->dev, (hal)->idx, alarm_value)
  156. /**
  157. * @brief Get the counter value to trigger the alarm.
  158. *
  159. * @param hal Context of the HAL layer
  160. * @param alarm_value Pointer to accept the counter value to trigger the alarm
  161. *
  162. * @return None
  163. */
  164. #define timer_hal_get_alarm_value(hal, alarm_value) timer_ll_get_alarm_value((hal)->dev, (hal)->idx, alarm_value)
  165. /**
  166. * @brief Set the alarm status, enable or disable the alarm.
  167. *
  168. * @param hal Context of the HAL layer
  169. * @param alarm_en True to enable alarm, false to disable alarm
  170. *
  171. * @return None
  172. */
  173. #define timer_hal_set_alarm_enable(hal, alarm_en) timer_ll_set_alarm_enable((hal)->dev, (hal)->idx, alarm_en)
  174. /**
  175. * @brief Get the alarm status.
  176. *
  177. * @param hal Context of the HAL layer
  178. *
  179. * @return
  180. * - true Enable alarm
  181. * - false Disable alarm
  182. */
  183. #define timer_hal_get_alarm_enable(hal) timer_ll_get_alarm_enable((hal)->dev, (hal)->idx)
  184. /**
  185. * @brief Set the level interrupt status, enable or disable the level interrupt.
  186. *
  187. * @param hal Context of the HAL layer
  188. * @param level_int_en True to enable level interrupt, false to disable level interrupt
  189. *
  190. * @return None
  191. */
  192. #define timer_hal_set_level_int_enable(hal, level_int_en) timer_ll_set_level_int_enable((hal)->dev, (hal)->idx, level_int_en)
  193. /**
  194. * @brief Get the level interrupt status.
  195. *
  196. * @param hal Context of the HAL layer
  197. *
  198. * @return
  199. * - true Enable level interrupt
  200. * - false Disable level interrupt
  201. */
  202. #define timer_hal_get_level_int_enable(hal) timer_ll_get_level_int_enable((hal)->dev, (hal)->idx)
  203. /**
  204. * @brief Set the edge interrupt status, enable or disable the edge interrupt.
  205. *
  206. * @param hal Context of the HAL layer
  207. * @param edge_int_en True to enable edge interrupt, false to disable edge interrupt
  208. *
  209. * @return None
  210. */
  211. #define timer_hal_set_edge_int_enable(hal, edge_int_en) timer_ll_set_edge_int_enable((hal)->dev, (hal)->idx, edge_int_en)
  212. /**
  213. * @brief Get the edge interrupt status.
  214. *
  215. * @param hal Context of the HAL layer
  216. *
  217. * @return
  218. * - true Enable edge interrupt
  219. * - false Disable edge interrupt
  220. */
  221. #define timer_hal_get_edge_int_enable(hal) timer_ll_get_edge_int_enable((hal)->dev, (hal)->idx)
  222. /**
  223. * @brief Enable timer interrupt.
  224. *
  225. * @param hal Context of the HAL layer
  226. *
  227. * @return None
  228. */
  229. #define timer_hal_intr_enable(hal) timer_ll_intr_enable((hal)->dev, (hal)->idx)
  230. /**
  231. * @brief Disable timer interrupt.
  232. *
  233. * @param hal Context of the HAL layer
  234. *
  235. * @return None
  236. */
  237. #define timer_hal_intr_disable(hal) timer_ll_intr_disable((hal)->dev, (hal)->idx)
  238. /**
  239. * @brief Clear interrupt status.
  240. *
  241. * @param hal Context of the HAL layer
  242. *
  243. * @return None
  244. */
  245. #define timer_hal_clear_intr_status(hal) timer_ll_clear_intr_status((hal)->dev, (hal)->idx)
  246. /**
  247. * @brief Get interrupt status.
  248. *
  249. * @param hal Context of the HAL layer
  250. * @param intr_status Interrupt status
  251. *
  252. * @return None
  253. */
  254. #define timer_hal_get_intr_status(hal, intr_status) timer_ll_get_intr_status((hal)->dev, intr_status)
  255. /**
  256. * @brief Get interrupt raw status.
  257. *
  258. * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1
  259. * @param intr_raw_status Interrupt raw status
  260. *
  261. * @return None
  262. */
  263. #define timer_hal_get_intr_raw_status(group_num, intr_raw_status) timer_ll_get_intr_raw_status(group_num, intr_raw_status)
  264. /**
  265. * @brief Get interrupt status register address.
  266. *
  267. * @param hal Context of the HAL layer
  268. *
  269. * @return Interrupt status register address
  270. */
  271. #define timer_hal_get_intr_status_reg(hal) timer_ll_get_intr_status_reg((hal)->dev)
  272. #ifdef SOC_TIMER_GROUP_SUPPORT_XTAL
  273. /**
  274. * @brief Set clock source.
  275. *
  276. * @param hal Context of the HAL layer
  277. * @param use_xtal_en True to use XTAL clock, flase to use APB clock
  278. *
  279. * @return None
  280. */
  281. #define timer_hal_set_use_xtal(hal, use_xtal_en) timer_ll_set_use_xtal((hal)->dev, (hal)->idx, use_xtal_en)
  282. /**
  283. * @brief Get clock source.
  284. *
  285. * @param hal Context of the HAL layer
  286. *
  287. * @return
  288. * - true Use XTAL clock
  289. * - false Use APB clock
  290. */
  291. #define timer_hal_get_use_xtal(hal) timer_ll_get_use_xtal((hal)->dev, (hal)->idx)
  292. #endif
  293. #ifdef __cplusplus
  294. }
  295. #endif