timer_hal.h 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  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 hal/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 "soc/soc_caps.h"
  26. #include "hal/timer_ll.h"
  27. #include "hal/timer_types.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 Reset timer peripheral
  55. *
  56. * @param hal Context of the HAL layer
  57. *
  58. * @return None
  59. */
  60. void timer_hal_reset_periph(timer_hal_context_t *hal);
  61. /**
  62. * @brief Set timer clock prescale value
  63. *
  64. * @param hal Context of the HAL layer
  65. * @param divider Prescale value
  66. *
  67. * @return None
  68. */
  69. #define timer_hal_set_divider(hal, divider) timer_ll_set_divider((hal)->dev, (hal)->idx, divider)
  70. /**
  71. * @brief Get timer clock prescale value
  72. *
  73. * @param hal Context of the HAL layer
  74. * @param divider Pointer to accept the prescale value
  75. *
  76. * @return None
  77. */
  78. #define timer_hal_get_divider(hal, divider) timer_ll_get_divider((hal)->dev, (hal)->idx, divider)
  79. /**
  80. * @brief Load counter value into time-base counter
  81. *
  82. * @param hal Context of the HAL layer
  83. * @param load_val Counter value
  84. *
  85. * @return None
  86. */
  87. #define timer_hal_set_counter_value(hal, load_val) timer_ll_set_counter_value((hal)->dev, (hal)->idx, load_val)
  88. /**
  89. * @brief Get counter value from time-base counter
  90. *
  91. * @param hal Context of the HAL layer
  92. * @param timer_val Pointer to accept the counter value
  93. *
  94. * @return None
  95. */
  96. #define timer_hal_get_counter_value(hal, timer_val) timer_ll_get_counter_value((hal)->dev, (hal)->idx, timer_val)
  97. /**
  98. * @brief Set counter mode, include increment mode and decrement mode.
  99. *
  100. * @param hal Context of the HAL layer
  101. * @param increase_en True to increment mode, fasle to decrement mode
  102. *
  103. * @return None
  104. */
  105. #define timer_hal_set_counter_increase(hal, increase_en) timer_ll_set_counter_increase((hal)->dev, (hal)->idx, increase_en)
  106. /**
  107. * @brief Get counter mode, include increment mode and decrement mode.
  108. *
  109. * @param hal Context of the HAL layer
  110. * @param counter_dir Pointer to accept the counter mode
  111. *
  112. * @return
  113. * - true Increment mode
  114. * - false Decrement mode
  115. */
  116. #define timer_hal_get_counter_increase(hal) timer_ll_get_counter_increase((hal)->dev, (hal)->idx)
  117. /**
  118. * @brief Set counter status, enable or disable counter.
  119. *
  120. * @param hal Context of the HAL layer
  121. * @param counter_en True to enable counter, false to disable counter
  122. *
  123. * @return None
  124. */
  125. #define timer_hal_set_counter_enable(hal, counter_en) timer_ll_set_counter_enable((hal)->dev, (hal)->idx, counter_en)
  126. /**
  127. * @brief Get counter status.
  128. *
  129. * @param hal Context of the HAL layer
  130. *
  131. * @return
  132. * - true Enable counter
  133. * - false Disable conuter
  134. */
  135. #define timer_hal_get_counter_enable(hal) timer_ll_get_counter_enable((hal)->dev, (hal)->idx)
  136. /**
  137. * @brief Set auto reload mode.
  138. *
  139. * @param hal Context of the HAL layer
  140. * @param auto_reload_en True to enable auto reload mode, flase to disable auto reload mode
  141. *
  142. * @return None
  143. */
  144. #define timer_hal_set_auto_reload(hal, auto_reload_en) timer_ll_set_auto_reload((hal)->dev, (hal)->idx, auto_reload_en)
  145. /**
  146. * @brief Get auto reload mode.
  147. *
  148. * @param hal Context of the HAL layer
  149. *
  150. * @return
  151. * - true Enable auto reload mode
  152. * - false Disable auto reload mode
  153. */
  154. #define timer_hal_get_auto_reload(hal) timer_ll_get_auto_reload((hal)->dev, (hal)->idx)
  155. /**
  156. * @brief Set the counter value to trigger the alarm.
  157. *
  158. * @param hal Context of the HAL layer
  159. * @param alarm_value Counter value to trigger the alarm
  160. *
  161. * @return None
  162. */
  163. #define timer_hal_set_alarm_value(hal, alarm_value) timer_ll_set_alarm_value((hal)->dev, (hal)->idx, alarm_value)
  164. /**
  165. * @brief Get the counter value to trigger the alarm.
  166. *
  167. * @param hal Context of the HAL layer
  168. * @param alarm_value Pointer to accept the counter value to trigger the alarm
  169. *
  170. * @return None
  171. */
  172. #define timer_hal_get_alarm_value(hal, alarm_value) timer_ll_get_alarm_value((hal)->dev, (hal)->idx, alarm_value)
  173. /**
  174. * @brief Set the alarm status, enable or disable the alarm.
  175. *
  176. * @param hal Context of the HAL layer
  177. * @param alarm_en True to enable alarm, false to disable alarm
  178. *
  179. * @return None
  180. */
  181. #define timer_hal_set_alarm_enable(hal, alarm_en) timer_ll_set_alarm_enable((hal)->dev, (hal)->idx, alarm_en)
  182. /**
  183. * @brief Get the alarm status.
  184. *
  185. * @param hal Context of the HAL layer
  186. *
  187. * @return
  188. * - true Enable alarm
  189. * - false Disable alarm
  190. */
  191. #define timer_hal_get_alarm_enable(hal) timer_ll_get_alarm_enable((hal)->dev, (hal)->idx)
  192. /**
  193. * @brief Set the level interrupt status, enable or disable the level interrupt.
  194. *
  195. * @param hal Context of the HAL layer
  196. * @param level_int_en True to enable level interrupt, false to disable level interrupt
  197. *
  198. * @return None
  199. */
  200. #define timer_hal_set_level_int_enable(hal, level_int_en) timer_ll_set_level_int_enable((hal)->dev, (hal)->idx, level_int_en)
  201. /**
  202. * @brief Get the level interrupt status.
  203. *
  204. * @param hal Context of the HAL layer
  205. *
  206. * @return
  207. * - true Enable level interrupt
  208. * - false Disable level interrupt
  209. */
  210. #define timer_hal_get_level_int_enable(hal) timer_ll_get_level_int_enable((hal)->dev, (hal)->idx)
  211. /**
  212. * @brief Set the edge interrupt status, enable or disable the edge interrupt.
  213. *
  214. * @param hal Context of the HAL layer
  215. * @param edge_int_en True to enable edge interrupt, false to disable edge interrupt
  216. *
  217. * @return None
  218. */
  219. #define timer_hal_set_edge_int_enable(hal, edge_int_en) timer_ll_set_edge_int_enable((hal)->dev, (hal)->idx, edge_int_en)
  220. /**
  221. * @brief Get the edge interrupt status.
  222. *
  223. * @param hal Context of the HAL layer
  224. *
  225. * @return
  226. * - true Enable edge interrupt
  227. * - false Disable edge interrupt
  228. */
  229. #define timer_hal_get_edge_int_enable(hal) timer_ll_get_edge_int_enable((hal)->dev, (hal)->idx)
  230. /**
  231. * @brief Enable timer interrupt.
  232. *
  233. * @param hal Context of the HAL layer
  234. *
  235. * @return None
  236. */
  237. #define timer_hal_intr_enable(hal) timer_ll_intr_enable((hal)->dev, (hal)->idx)
  238. /**
  239. * @brief Disable timer interrupt.
  240. *
  241. * @param hal Context of the HAL layer
  242. *
  243. * @return None
  244. */
  245. #define timer_hal_intr_disable(hal) timer_ll_intr_disable((hal)->dev, (hal)->idx)
  246. /**
  247. * @brief Clear interrupt status.
  248. *
  249. * @param hal Context of the HAL layer
  250. *
  251. * @return None
  252. */
  253. #define timer_hal_clear_intr_status(hal) timer_ll_clear_intr_status((hal)->dev, (hal)->idx)
  254. /**
  255. * @brief Get interrupt status.
  256. *
  257. * @param hal Context of the HAL layer
  258. * @param intr_status Interrupt status
  259. *
  260. * @return None
  261. */
  262. #define timer_hal_get_intr_status(hal, intr_status) timer_ll_get_intr_status((hal)->dev, intr_status)
  263. /**
  264. * @brief Get interrupt raw status.
  265. *
  266. * @param group_num Timer group number, 0 for TIMERG0 or 1 for TIMERG1
  267. * @param intr_raw_status Interrupt raw status
  268. *
  269. * @return None
  270. */
  271. #define timer_hal_get_intr_raw_status(group_num, intr_raw_status) timer_ll_get_intr_raw_status(group_num, intr_raw_status)
  272. /**
  273. * @brief Get interrupt status register address.
  274. *
  275. * @param hal Context of the HAL layer
  276. *
  277. * @return Interrupt status register address
  278. */
  279. #define timer_hal_get_intr_status_reg(hal) timer_ll_get_intr_status_reg((hal)->dev)
  280. #if SOC_TIMER_GROUP_SUPPORT_XTAL
  281. /**
  282. * @brief Set clock source.
  283. *
  284. * @param hal Context of the HAL layer
  285. * @param use_xtal_en True to use XTAL clock, flase to use APB clock
  286. *
  287. * @return None
  288. */
  289. #define timer_hal_set_use_xtal(hal, use_xtal_en) timer_ll_set_use_xtal((hal)->dev, (hal)->idx, use_xtal_en)
  290. /**
  291. * @brief Get clock source.
  292. *
  293. * @param hal Context of the HAL layer
  294. *
  295. * @return
  296. * - true Use XTAL clock
  297. * - false Use APB clock
  298. */
  299. #define timer_hal_get_use_xtal(hal) timer_ll_get_use_xtal((hal)->dev, (hal)->idx)
  300. #endif
  301. #ifdef __cplusplus
  302. }
  303. #endif