timer_hal.h 8.8 KB

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