drv_tmr_capture.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510
  1. /*
  2. * Copyright (C) 2022-2024, Xiaohua Semiconductor Co., Ltd.
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2025-01-10 CDT first version
  9. */
  10. #include <rtconfig.h>
  11. #if defined(BSP_USING_INPUT_CAPTURE)
  12. #if defined(BSP_USING_INPUT_CAPTURE_TMR6_1) || defined(BSP_USING_INPUT_CAPTURE_TMR6_2) || defined(BSP_USING_INPUT_CAPTURE_TMR6_3) \
  13. || defined(BSP_USING_INPUT_CAPTURE_TMR6_4) || defined(BSP_USING_INPUT_CAPTURE_TMR6_5) || defined(BSP_USING_INPUT_CAPTURE_TMR6_6) \
  14. || defined(BSP_USING_INPUT_CAPTURE_TMR6_7) || defined(BSP_USING_INPUT_CAPTURE_TMR6_8) || defined(BSP_USING_INPUT_CAPTURE_TMR6_9) \
  15. || defined(BSP_USING_INPUT_CAPTURE_TMR6_10)
  16. #include <rtdevice.h>
  17. #include <drv_config.h>
  18. #include <board_config.h>
  19. #include "hc32_ll.h"
  20. #include <drv_tmr_capture.h>
  21. /* Private typedef --------------------------------------------------------------*/
  22. typedef struct
  23. {
  24. struct rt_inputcapture_device parent;
  25. struct tmr_capture_dev_init_params init_params;
  26. uint32_t clk;
  27. void *tmr_instance;
  28. __IO uint32_t cur_cnt;
  29. __IO uint32_t ovf_cnt;
  30. __IO rt_bool_t input_data_level;
  31. __IO rt_bool_t is_first_edge;
  32. __IO rt_bool_t is_open;
  33. uint32_t cond;
  34. en_int_src_t int_src_cap;
  35. en_int_src_t int_src_ovf;
  36. func_ptr_t isr_cap;
  37. func_ptr_t isr_ovf;
  38. } tmr_capture_t;
  39. enum
  40. {
  41. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_1
  42. TMR_CAPTURE_IDX_TMR6_1,
  43. #endif
  44. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_2
  45. TMR_CAPTURE_IDX_TMR6_2,
  46. #endif
  47. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_3
  48. TMR_CAPTURE_IDX_TMR6_3,
  49. #endif
  50. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_4
  51. TMR_CAPTURE_IDX_TMR6_4,
  52. #endif
  53. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_5
  54. TMR_CAPTURE_IDX_TMR6_5,
  55. #endif
  56. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_6
  57. TMR_CAPTURE_IDX_TMR6_6,
  58. #endif
  59. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_7
  60. TMR_CAPTURE_IDX_TMR6_7,
  61. #endif
  62. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_8
  63. TMR_CAPTURE_IDX_TMR6_8,
  64. #endif
  65. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_9
  66. TMR_CAPTURE_IDX_TMR6_9,
  67. #endif
  68. #ifdef BSP_USING_INPUT_CAPTURE_TMR6_10
  69. TMR_CAPTURE_IDX_TMR6_10,
  70. #endif
  71. TMR_CAPTURE_IDX_MAX,
  72. };
  73. /* Private functions ------------------------------------------------------------*/
  74. static rt_err_t _tmr_capture_init(struct rt_inputcapture_device *inputcapture);
  75. static rt_err_t _tmr_capture_open(struct rt_inputcapture_device *inputcapture);
  76. static rt_err_t _tmr_capture_close(struct rt_inputcapture_device *inputcapture);
  77. static rt_err_t _tmr_capture_get_pulsewidth(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us);
  78. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1)
  79. static void _tmr6_1_isr_ovf(void);
  80. static void _tmr6_1_isr_cap(void);
  81. #endif
  82. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2)
  83. static void _tmr6_2_isr_ovf(void);
  84. static void _tmr6_2_isr_cap(void);
  85. #endif
  86. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3)
  87. static void _tmr6_3_isr_ovf(void);
  88. static void _tmr6_3_isr_cap(void);
  89. #endif
  90. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_4)
  91. static void _tmr6_4_isr_ovf(void);
  92. static void _tmr6_4_isr_cap(void);
  93. #endif
  94. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_5)
  95. static void _tmr6_5_isr_ovf(void);
  96. static void _tmr6_5_isr_cap(void);
  97. #endif
  98. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_6)
  99. static void _tmr6_6_isr_ovf(void);
  100. static void _tmr6_6_isr_cap(void);
  101. #endif
  102. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_7)
  103. static void _tmr6_7_isr_ovf(void);
  104. static void _tmr6_7_isr_cap(void);
  105. #endif
  106. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_8)
  107. static void _tmr6_8_isr_ovf(void);
  108. static void _tmr6_8_isr_cap(void);
  109. #endif
  110. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_9)
  111. static void _tmr6_9_isr_ovf(void);
  112. static void _tmr6_9_isr_cap(void);
  113. #endif
  114. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_10)
  115. static void _tmr6_10_isr_ovf(void);
  116. static void _tmr6_10_isr_cap(void);
  117. #endif
  118. /* Private define ---------------------------------------------------------------*/
  119. #define TMR6_INSTANCE_MIN ((uint32_t)CM_TMR6_1)
  120. #if defined (HC32F4A0) || defined (HC32F4A8)
  121. #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_8)
  122. #elif defined (HC32F460)
  123. #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_3)
  124. #elif defined (HC32F334)
  125. #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_4)
  126. #elif defined (HC32F448)
  127. #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_2)
  128. #elif defined (HC32F472)
  129. #define TMR6_INSTANCE_MAX ((uint32_t)CM_TMR6_10)
  130. #endif
  131. #define TMR6_INSTANCE_ADDR_ALIGN (0x400UL)
  132. #define TMR6_PERIOD_VALUE_MAX (0xFFFFUL)
  133. #define IS_TMR6_UNIT(x) (((x) >= TMR6_INSTANCE_MIN && (x) <= TMR6_INSTANCE_MAX) && ((x) % TMR6_INSTANCE_ADDR_ALIGN) == 0U)
  134. #if defined (BSP_USING_INPUT_CAPTURE_TMR6)
  135. #define IS_CAPTURE_COND_RASING_EDGE(bit_pos) ((bit_pos) % 2U == 0U)
  136. #if defined (HC32F4A0) || defined (HC32F4A8) || defined (HC32F334) || defined (HC32F472)
  137. #define VALID_CAPTURE_COND (TMR6_CAPT_COND_ALL & (~(TMR6_CAPT_COND_EVT0 | TMR6_CAPT_COND_EVT1 | TMR6_CAPT_COND_EVT2 | TMR6_CAPT_COND_EVT3)))
  138. #elif defined (HC32F460) || defined (HC32F448)
  139. #define VALID_CAPTURE_COND (TMR6_CAPT_COND_ALL & (~(TMR6_CAPT_COND_EVT0 | TMR6_CAPT_COND_EVT1)))
  140. #endif
  141. #endif
  142. #define TMR6_ISR_OVF(U,N) \
  143. static void _tmr6_##U##_isr_ovf(void)\
  144. {\
  145. g_tmr_capturers[N].ovf_cnt++;\
  146. TMR6_ClearStatus(CM_TMR6_##U, TMR6_FLAG_OVF);\
  147. }
  148. #define TMR6_ISR_CAP(U,N) \
  149. static void _tmr6_##U##_isr_cap(void)\
  150. {\
  151. _tmr6_irq_cap_handler(&g_tmr_capturers[N]);\
  152. }
  153. #define TMR6_CAPTURE_CFG(U) \
  154. { {0}, INPUT_CAPTURE_CFG_TMR6_##U, 0, (CM_TMR6_##U), 0, 0, 0, 0, 0, 0, \
  155. INT_SRC_TMR6_##U##_GCMP_A, INT_SRC_TMR6_##U##_OVF, _tmr6_##U##_isr_cap, _tmr6_##U##_isr_ovf, \
  156. }
  157. /* Private variables ------------------------------------------------------------*/
  158. static tmr_capture_t g_tmr_capturers[] =
  159. {
  160. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1)
  161. TMR6_CAPTURE_CFG(1),
  162. #endif
  163. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2)
  164. TMR6_CAPTURE_CFG(2),
  165. #endif
  166. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3)
  167. TMR6_CAPTURE_CFG(3),
  168. #endif
  169. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_4)
  170. TMR6_CAPTURE_CFG(4),
  171. #endif
  172. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_5)
  173. TMR6_CAPTURE_CFG(5),
  174. #endif
  175. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_6)
  176. TMR6_CAPTURE_CFG(6),
  177. #endif
  178. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_7)
  179. TMR6_CAPTURE_CFG(7),
  180. #endif
  181. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_8)
  182. TMR6_CAPTURE_CFG(8),
  183. #endif
  184. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_9)
  185. TMR6_CAPTURE_CFG(9),
  186. #endif
  187. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_10)
  188. TMR6_CAPTURE_CFG(10),
  189. #endif
  190. };
  191. static struct rt_inputcapture_ops tmr_capture_ops =
  192. {
  193. .init = _tmr_capture_init,
  194. .open = _tmr_capture_open,
  195. .close = _tmr_capture_close,
  196. .get_pulsewidth = _tmr_capture_get_pulsewidth,
  197. };
  198. /* Functions define ------------------------------------------------------------*/
  199. static void _tmr6_irq_cap_handler(tmr_capture_t *p_capture)
  200. {
  201. if (p_capture->is_first_edge == RT_TRUE)
  202. {
  203. p_capture->is_first_edge = RT_FALSE;
  204. }
  205. else
  206. {
  207. p_capture->cur_cnt = TMR6_GetCompareValue((CM_TMR6_TypeDef *)p_capture->tmr_instance, \
  208. p_capture->init_params.ch);
  209. rt_interrupt_enter();
  210. rt_hw_inputcapture_isr(&p_capture->parent, p_capture->input_data_level);
  211. rt_interrupt_leave();
  212. p_capture->input_data_level = !p_capture->input_data_level;
  213. }
  214. p_capture->ovf_cnt = 0;
  215. TMR6_ClearStatus((CM_TMR6_TypeDef *)p_capture->tmr_instance, \
  216. TMR6_FLAG_MATCH_A << p_capture->init_params.ch);
  217. }
  218. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_1)
  219. TMR6_ISR_OVF(1, TMR_CAPTURE_IDX_TMR6_1)
  220. TMR6_ISR_CAP(1, TMR_CAPTURE_IDX_TMR6_1)
  221. #endif
  222. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_2)
  223. TMR6_ISR_OVF(2, TMR_CAPTURE_IDX_TMR6_2)
  224. TMR6_ISR_CAP(2, TMR_CAPTURE_IDX_TMR6_2)
  225. #endif
  226. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_3)
  227. TMR6_ISR_OVF(3, TMR_CAPTURE_IDX_TMR6_3)
  228. TMR6_ISR_CAP(3, TMR_CAPTURE_IDX_TMR6_3)
  229. #endif
  230. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_4)
  231. TMR6_ISR_OVF(4, TMR_CAPTURE_IDX_TMR6_4)
  232. TMR6_ISR_CAP(4, TMR_CAPTURE_IDX_TMR6_4)
  233. #endif
  234. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_5)
  235. TMR6_ISR_OVF(5, TMR_CAPTURE_IDX_TMR6_5)
  236. TMR6_ISR_CAP(5, TMR_CAPTURE_IDX_TMR6_5)
  237. #endif
  238. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_6)
  239. TMR6_ISR_OVF(6, TMR_CAPTURE_IDX_TMR6_6)
  240. TMR6_ISR_CAP(6, TMR_CAPTURE_IDX_TMR6_6)
  241. #endif
  242. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_7)
  243. TMR6_ISR_OVF(7, TMR_CAPTURE_IDX_TMR6_7)
  244. TMR6_ISR_CAP(7, TMR_CAPTURE_IDX_TMR6_7)
  245. #endif
  246. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_8)
  247. TMR6_ISR_OVF(8, TMR_CAPTURE_IDX_TMR6_8)
  248. TMR6_ISR_CAP(8, TMR_CAPTURE_IDX_TMR6_8)
  249. #endif
  250. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_9)
  251. TMR6_ISR_OVF(9, TMR_CAPTURE_IDX_TMR6_9)
  252. TMR6_ISR_CAP(9, TMR_CAPTURE_IDX_TMR6_9)
  253. #endif
  254. #if defined (BSP_USING_INPUT_CAPTURE_TMR6_10)
  255. TMR6_ISR_OVF(10, TMR_CAPTURE_IDX_TMR6_10)
  256. TMR6_ISR_CAP(10, TMR_CAPTURE_IDX_TMR6_10)
  257. #endif
  258. static void _tmr_irq_init_cap(tmr_capture_t *p_capture)
  259. {
  260. stc_irq_signin_config_t stcIrq;
  261. stcIrq.pfnCallback = p_capture->isr_cap;
  262. stcIrq.enIntSrc = (en_int_src_t)((uint32_t)p_capture->int_src_cap + p_capture->init_params.ch);
  263. stcIrq.enIRQn = p_capture->init_params.irq_num_cap;
  264. (void)INTC_IrqSignIn(&stcIrq);
  265. NVIC_ClearPendingIRQ(stcIrq.enIRQn);
  266. NVIC_SetPriority(stcIrq.enIRQn, p_capture->init_params.irq_prio_cap);
  267. }
  268. static void _tmr_irq_init_ovf(tmr_capture_t *p_capture)
  269. {
  270. stc_irq_signin_config_t stcIrq;
  271. stcIrq.pfnCallback = p_capture->isr_ovf;
  272. stcIrq.enIntSrc = (en_int_src_t)(p_capture->int_src_ovf);
  273. stcIrq.enIRQn = p_capture->init_params.irq_num_ovf;
  274. (void)INTC_IrqSignIn(&stcIrq);
  275. NVIC_ClearPendingIRQ(stcIrq.enIRQn);
  276. NVIC_SetPriority(stcIrq.enIRQn, p_capture->init_params.irq_prio_ovf);
  277. }
  278. static rt_bool_t _is_one_cond(uint32_t n)
  279. {
  280. uint32_t count = 0;
  281. for (uint32_t i = 0U; i < 32U; i++)
  282. {
  283. if ((n & (1UL << i)) != 0UL)
  284. {
  285. count++;
  286. if (count > 1U)
  287. {
  288. return RT_FALSE;
  289. }
  290. }
  291. }
  292. return RT_TRUE;
  293. }
  294. static uint32_t _get_capture_cond_bit_pos(uint32_t n)
  295. {
  296. uint32_t i;
  297. for (i = 0U; i < 32U; i++)
  298. {
  299. if ((n & (1UL << i)) != 0UL)
  300. {
  301. break;
  302. }
  303. }
  304. return i;
  305. }
  306. static void _tmr_capture_assert_params(tmr_capture_t *p_capture)
  307. {
  308. struct tmr_capture_dev_init_params *p_init_params = &(p_capture->init_params);
  309. RT_ASSERT(p_init_params->first_edge != 0U);
  310. RT_ASSERT(_is_one_cond(p_init_params->first_edge));
  311. RT_ASSERT((p_init_params->first_edge | VALID_CAPTURE_COND) == VALID_CAPTURE_COND);
  312. #if defined (BSP_USING_INPUT_CAPTURE_TMR6)
  313. RT_ASSERT((p_init_params->ch == TMR6_CH_A) || (p_init_params->ch == TMR6_CH_B));
  314. #endif
  315. }
  316. static void _tmr_capture_init_tmr6(tmr_capture_t *p_capture, CM_TMR6_TypeDef *instance, struct tmr_capture_dev_init_params *init_params)
  317. {
  318. uint32_t unit = ((uint32_t)p_capture->tmr_instance - (uint32_t)CM_TMR6_1) / TMR6_INSTANCE_ADDR_ALIGN;
  319. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_1 << unit, ENABLE);
  320. #if defined (HC32F460)
  321. if (instance != CM_TMR6_1)
  322. {
  323. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_1, ENABLE);
  324. }
  325. #endif
  326. stc_tmr6_init_t stcTmr6Init;
  327. (void)TMR6_StructInit(&stcTmr6Init);
  328. stcTmr6Init.u8CountSrc = TMR6_CNT_SRC_SW;
  329. stcTmr6Init.sw_count.u32ClockDiv = init_params->clk_div;
  330. stcTmr6Init.u32PeriodValue = TMR6_PERIOD_VALUE_MAX;
  331. (void)TMR6_Init(instance, &stcTmr6Init);
  332. TMR6_SetFunc(instance, init_params->ch, TMR6_PIN_CAPT_INPUT);
  333. uint32_t pin;
  334. uint32_t bit_pos = _get_capture_cond_bit_pos(init_params->first_edge);
  335. #if defined (HC32F4A0) || defined (HC32F4A8) || defined (HC32F334) || defined (HC32F448) || defined (HC32F472)
  336. if (bit_pos <= TMR6_HCPAR_HCPA3_POS)
  337. {
  338. pin = TMR6_IO_PWMA + (bit_pos / 2U);
  339. }
  340. else
  341. {
  342. pin = TMR6_INPUT_TRIGA + (bit_pos - TMR6_HCPAR_HCPA16_POS) / 2U;
  343. }
  344. #elif defined (HC32F460)
  345. pin = TMR6_IO_PWMA + (bit_pos - TMR6_HCPAR_HCPA4_POS) / 2U;
  346. #endif
  347. TMR6_SetFilterClockDiv(instance, pin, TMR6_FILTER_CLK_DIV16);
  348. TMR6_FilterCmd(instance, pin, ENABLE);
  349. TMR6_HWCaptureCondCmd(instance, p_capture->init_params.ch, p_capture->cond, ENABLE);
  350. TMR6_HWClearCondCmd(instance, p_capture->cond, ENABLE);
  351. TMR6_HWClearCmd(instance, ENABLE);
  352. TMR6_IntCmd(instance, TMR6_INT_OVF, ENABLE);
  353. TMR6_IntCmd(instance, TMR6_INT_MATCH_A << init_params->ch, ENABLE);
  354. }
  355. static rt_err_t _tmr_capture_init(struct rt_inputcapture_device *inputcapture)
  356. {
  357. RT_ASSERT(inputcapture != (void *)RT_NULL);
  358. rt_err_t ret = RT_EOK;
  359. tmr_capture_t *p_capture = (tmr_capture_t *)(void *)inputcapture;
  360. struct tmr_capture_dev_init_params *init_params = &(p_capture->init_params);
  361. rt_hw_board_input_capture_init(p_capture->tmr_instance);
  362. _tmr_irq_init_cap(p_capture);
  363. _tmr_irq_init_ovf(p_capture);
  364. uint32_t bit_pos = _get_capture_cond_bit_pos(init_params->first_edge);
  365. uint32_t second_edge = (IS_CAPTURE_COND_RASING_EDGE(bit_pos)) ? (1UL << (bit_pos + 1UL)) : (1UL << (bit_pos - 1UL));
  366. p_capture->cond = init_params->first_edge | second_edge;
  367. p_capture->clk = (HCLK_VALUE / (1UL << (init_params->clk_div >> TMR6_GCONR_CKDIV_POS)));
  368. do
  369. {
  370. #if defined(BSP_USING_INPUT_CAPTURE_TMR6)
  371. CM_TMR6_TypeDef *instance = (CM_TMR6_TypeDef *)(p_capture->tmr_instance);
  372. if (IS_TMR6_UNIT((uint32_t)instance))
  373. {
  374. _tmr_capture_init_tmr6(p_capture, instance, init_params);
  375. break;
  376. }
  377. #endif
  378. break;
  379. }
  380. while (0);
  381. return ret;
  382. }
  383. static rt_err_t _tmr_capture_open(struct rt_inputcapture_device *inputcapture)
  384. {
  385. rt_err_t ret = RT_EOK;
  386. RT_ASSERT(inputcapture != (void *)RT_NULL);
  387. tmr_capture_t *p_capture = (tmr_capture_t *)(void *)inputcapture;
  388. if (p_capture->is_open)
  389. {
  390. return ret;
  391. }
  392. struct tmr_capture_dev_init_params *init_params = &(p_capture->init_params);
  393. uint32_t bit_pos = _get_capture_cond_bit_pos(init_params->first_edge);
  394. p_capture->input_data_level = IS_CAPTURE_COND_RASING_EDGE(bit_pos);
  395. p_capture->is_first_edge = RT_TRUE;
  396. p_capture->is_open = RT_TRUE;
  397. NVIC_EnableIRQ(init_params->irq_num_ovf);
  398. NVIC_EnableIRQ(init_params->irq_num_cap);
  399. do
  400. {
  401. #if defined(BSP_USING_INPUT_CAPTURE_TMR6)
  402. CM_TMR6_TypeDef *instance = (CM_TMR6_TypeDef *)(p_capture->tmr_instance);
  403. if (IS_TMR6_UNIT((uint32_t)instance))
  404. {
  405. TMR6_Start(instance);
  406. break;
  407. }
  408. #endif
  409. }
  410. while (0);
  411. return ret;
  412. }
  413. static rt_err_t _tmr_capture_close(struct rt_inputcapture_device *inputcapture)
  414. {
  415. rt_err_t ret = RT_EOK;
  416. tmr_capture_t *p_capture;
  417. RT_ASSERT(inputcapture != (void *)RT_NULL);
  418. p_capture = (tmr_capture_t *)(void *) inputcapture;
  419. NVIC_DisableIRQ(p_capture->init_params.irq_num_ovf);
  420. NVIC_DisableIRQ(p_capture->init_params.irq_num_cap);
  421. do
  422. {
  423. #if defined(BSP_USING_INPUT_CAPTURE_TMR6)
  424. CM_TMR6_TypeDef *instance = (CM_TMR6_TypeDef *)(p_capture->tmr_instance);
  425. if (IS_TMR6_UNIT((uint32_t)instance))
  426. {
  427. TMR6_Stop((CM_TMR6_TypeDef *)instance);
  428. break;
  429. }
  430. #endif
  431. }
  432. while (0);
  433. p_capture->is_open = RT_FALSE;
  434. return ret;
  435. }
  436. static rt_err_t _tmr_capture_get_pulsewidth(struct rt_inputcapture_device *inputcapture, rt_uint32_t *pulsewidth_us)
  437. {
  438. rt_err_t ret = RT_EOK;
  439. RT_ASSERT(inputcapture != (void *)RT_NULL);
  440. tmr_capture_t *p_capture = (tmr_capture_t *)(void *)inputcapture;
  441. rt_uint64_t ovf_cnt = p_capture->ovf_cnt;
  442. rt_uint64_t cur_cnt = p_capture->cur_cnt;
  443. rt_uint64_t cnt = (uint64_t)((ovf_cnt * (uint64_t)TMR6_PERIOD_VALUE_MAX + cur_cnt) * (uint64_t)1000000);
  444. *pulsewidth_us = (uint32_t)((uint64_t)(cnt / (uint64_t)p_capture->clk) + 1U);
  445. return ret;
  446. }
  447. int tmr_capture_device_init(void)
  448. {
  449. for (uint32_t i = 0U; i < (uint32_t)TMR_CAPTURE_IDX_MAX; i++)
  450. {
  451. #if defined RT_DEBUGING_ASSERT
  452. _tmr_capture_assert_params(&g_tmr_capturers[i]);
  453. #endif
  454. g_tmr_capturers[i].parent.ops = &tmr_capture_ops;
  455. rt_device_inputcapture_register(&g_tmr_capturers[i].parent, \
  456. g_tmr_capturers[i].init_params.name,
  457. &g_tmr_capturers[i]);
  458. }
  459. return 0;
  460. }
  461. INIT_DEVICE_EXPORT(tmr_capture_device_init);
  462. #endif //#if defined(BSP_USING_INPUT_CAPTURE_*)
  463. #endif //#if defined(BSP_USING_INPUT_CAPTURE)