drv_pulse_encoder.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823
  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. * 2023-06-09 CDT first version
  9. */
  10. #include "board.h"
  11. #include "drv_config.h"
  12. #ifdef RT_USING_PULSE_ENCODER
  13. #include "drv_irq.h"
  14. // #define DRV_DEBUG
  15. #define LOG_TAG "drv_pulse_encoder"
  16. #include <drv_log.h>
  17. #if defined(BSP_USING_TMRA_PULSE_ENCODER)
  18. #if !defined(BSP_USING_PULSE_ENCODER_TMRA_1) && !defined(BSP_USING_PULSE_ENCODER_TMRA_2) && !defined(BSP_USING_PULSE_ENCODER_TMRA_3) && \
  19. !defined(BSP_USING_PULSE_ENCODER_TMRA_4) && !defined(BSP_USING_PULSE_ENCODER_TMRA_5) && !defined(BSP_USING_PULSE_ENCODER_TMRA_6) && \
  20. !defined(BSP_USING_PULSE_ENCODER_TMRA_7) && !defined(BSP_USING_PULSE_ENCODER_TMRA_8) && !defined(BSP_USING_PULSE_ENCODER_TMRA_9) && \
  21. !defined(BSP_USING_PULSE_ENCODER_TMRA_10) && !defined(BSP_USING_PULSE_ENCODER_TMRA_11) && !defined(BSP_USING_PULSE_ENCODER_TMRA_12)
  22. #error "Please define at least one BSP_USING_PULSE_ENCODERx"
  23. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  24. #endif
  25. enum
  26. {
  27. #ifdef BSP_USING_PULSE_ENCODER_TMRA_1
  28. PULSE_ENCODER_TMRA_1_INDEX,
  29. #endif
  30. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  31. PULSE_ENCODER_TMRA_2_INDEX,
  32. #endif
  33. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  34. PULSE_ENCODER_TMRA_3_INDEX,
  35. #endif
  36. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  37. PULSE_ENCODER_TMRA_4_INDEX,
  38. #endif
  39. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  40. PULSE_ENCODER_TMRA_5_INDEX,
  41. #endif
  42. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  43. PULSE_ENCODER_TMRA_6_INDEX,
  44. #endif
  45. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  46. PULSE_ENCODER_TMRA_7_INDEX,
  47. #endif
  48. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  49. PULSE_ENCODER_TMRA_8_INDEX,
  50. #endif
  51. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  52. PULSE_ENCODER_TMRA_9_INDEX,
  53. #endif
  54. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  55. PULSE_ENCODER_TMRA_10_INDEX,
  56. #endif
  57. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  58. PULSE_ENCODER_TMRA_11_INDEX,
  59. #endif
  60. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  61. PULSE_ENCODER_TMRA_12_INDEX,
  62. #endif
  63. };
  64. struct hc32_pulse_encoder_tmra_device
  65. {
  66. struct rt_pulse_encoder_device pulse_encoder;
  67. CM_TMRA_TypeDef *tmr_handler;
  68. uint32_t u32Fcg2Periph;
  69. struct
  70. {
  71. uint16_t u16CountUpCond;
  72. uint16_t u16CountDownCond;
  73. } hw_count;
  74. struct
  75. {
  76. en_int_src_t enIntSrc_Ovf;
  77. IRQn_Type enIRQn_Ovf;
  78. uint8_t u8Int_Prio_Ovf;
  79. func_ptr_t Irq_Ovf_Callback;
  80. en_int_src_t enIntSrc_Udf;
  81. IRQn_Type enIRQn_Udf;
  82. uint8_t u8Int_Prio_Udf;
  83. func_ptr_t Irq_Udf_Callback;
  84. } isr;
  85. rt_uint32_t u32PeriodValue;
  86. rt_int32_t Over_Under_Flowcount;
  87. char *name;
  88. };
  89. static struct hc32_pulse_encoder_tmra_device hc32_pulse_encoder_tmra_obj[] =
  90. {
  91. #ifdef BSP_USING_PULSE_ENCODER_TMRA_1
  92. PULSE_ENCODER_TMRA_1_CONFIG,
  93. #endif
  94. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  95. PULSE_ENCODER_TMRA_2_CONFIG,
  96. #endif
  97. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  98. PULSE_ENCODER_TMRA_3_CONFIG,
  99. #endif
  100. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  101. PULSE_ENCODER_TMRA_4_CONFIG,
  102. #endif
  103. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  104. PULSE_ENCODER_TMRA_5_CONFIG,
  105. #endif
  106. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  107. PULSE_ENCODER_TMRA_6_CONFIG,
  108. #endif
  109. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  110. PULSE_ENCODER_TMRA_7_CONFIG,
  111. #endif
  112. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  113. PULSE_ENCODER_TMRA_8_CONFIG,
  114. #endif
  115. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  116. PULSE_ENCODER_TMRA_9_CONFIG,
  117. #endif
  118. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  119. PULSE_ENCODER_TMRA_10_CONFIG,
  120. #endif
  121. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  122. PULSE_ENCODER_TMRA_11_CONFIG,
  123. #endif
  124. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  125. PULSE_ENCODER_TMRA_12_CONFIG,
  126. #endif
  127. };
  128. #ifdef BSP_USING_PULSE_ENCODER_TMRA_1
  129. static void TMRA_1_Ovf_callback(void)
  130. {
  131. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].tmr_handler, TMRA_FLAG_OVF);
  132. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].Over_Under_Flowcount++;
  133. }
  134. static void TMRA_1_Udf_callback(void)
  135. {
  136. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].tmr_handler, TMRA_FLAG_UDF);
  137. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].Over_Under_Flowcount--;
  138. }
  139. #endif
  140. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  141. static void TMRA_2_Ovf_callback(void)
  142. {
  143. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler, TMRA_FLAG_OVF);
  144. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].Over_Under_Flowcount++;
  145. }
  146. static void TMRA_2_Udf_callback(void)
  147. {
  148. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler, TMRA_FLAG_UDF);
  149. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].Over_Under_Flowcount--;
  150. }
  151. #endif
  152. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  153. static void TMRA_3_Ovf_callback(void)
  154. {
  155. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler, TMRA_FLAG_OVF);
  156. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].Over_Under_Flowcount++;
  157. }
  158. static void TMRA_3_Udf_callback(void)
  159. {
  160. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler, TMRA_FLAG_UDF);
  161. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].Over_Under_Flowcount--;
  162. }
  163. #endif
  164. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  165. static void TMRA_4_Ovf_callback(void)
  166. {
  167. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler, TMRA_FLAG_OVF);
  168. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].Over_Under_Flowcount++;
  169. }
  170. static void TMRA_4_Udf_callback(void)
  171. {
  172. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler, TMRA_FLAG_UDF);
  173. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].Over_Under_Flowcount--;
  174. }
  175. #endif
  176. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  177. static void TMRA_5_Ovf_callback(void)
  178. {
  179. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler, TMRA_FLAG_OVF);
  180. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].Over_Under_Flowcount++;
  181. }
  182. static void TMRA_5_Udf_callback(void)
  183. {
  184. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler, TMRA_FLAG_UDF);
  185. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].Over_Under_Flowcount--;
  186. }
  187. #endif
  188. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  189. static void TMRA_6_Ovf_callback(void)
  190. {
  191. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].tmr_handler, TMRA_FLAG_OVF);
  192. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].Over_Under_Flowcount++;
  193. }
  194. static void TMRA_6_Udf_callback(void)
  195. {
  196. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].tmr_handler, TMRA_FLAG_UDF);
  197. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].Over_Under_Flowcount--;
  198. }
  199. #endif
  200. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  201. static void TMRA_7_Ovf_callback(void)
  202. {
  203. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].tmr_handler, TMRA_FLAG_OVF);
  204. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].Over_Under_Flowcount++;
  205. }
  206. static void TMRA_7_Udf_callback(void)
  207. {
  208. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].tmr_handler, TMRA_FLAG_UDF);
  209. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].Over_Under_Flowcount--;
  210. }
  211. #endif
  212. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  213. static void TMRA_8_Ovf_callback(void)
  214. {
  215. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].tmr_handler, TMRA_FLAG_OVF);
  216. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].Over_Under_Flowcount++;
  217. }
  218. static void TMRA_8_Udf_callback(void)
  219. {
  220. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].tmr_handler, TMRA_FLAG_UDF);
  221. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].Over_Under_Flowcount--;
  222. }
  223. #endif
  224. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  225. static void TMRA_9_Ovf_callback(void)
  226. {
  227. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].tmr_handler, TMRA_FLAG_OVF);
  228. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].Over_Under_Flowcount++;
  229. }
  230. static void TMRA_9_Udf_callback(void)
  231. {
  232. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].tmr_handler, TMRA_FLAG_UDF);
  233. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].Over_Under_Flowcount--;
  234. }
  235. #endif
  236. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  237. static void TMRA_10_Ovf_callback(void)
  238. {
  239. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].tmr_handler, TMRA_FLAG_OVF);
  240. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].Over_Under_Flowcount++;
  241. }
  242. static void TMRA_10_Udf_callback(void)
  243. {
  244. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].tmr_handler, TMRA_FLAG_UDF);
  245. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].Over_Under_Flowcount--;
  246. }
  247. #endif
  248. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  249. static void TMRA_11_Ovf_callback(void)
  250. {
  251. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].tmr_handler, TMRA_FLAG_OVF);
  252. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].Over_Under_Flowcount++;
  253. }
  254. static void TMRA_11_Udf_callback(void)
  255. {
  256. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].tmr_handler, TMRA_FLAG_UDF);
  257. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].Over_Under_Flowcount--;
  258. }
  259. #endif
  260. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  261. static void TMRA_12_Ovf_callback(void)
  262. {
  263. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].tmr_handler, TMRA_FLAG_OVF);
  264. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].Over_Under_Flowcount++;
  265. }
  266. static void TMRA_12_Udf_callback(void)
  267. {
  268. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].tmr_handler, TMRA_FLAG_UDF);
  269. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].Over_Under_Flowcount--;
  270. }
  271. #endif
  272. /**
  273. * @brief This function gets pulse_encoder_tima irq handle.
  274. * @param None
  275. * @retval None
  276. */
  277. static void hc32_get_pulse_encoder_tmra_callback(void)
  278. {
  279. #ifdef BSP_USING_PULSE_ENCODER_TMRA_1
  280. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].isr.Irq_Ovf_Callback = TMRA_1_Ovf_callback;
  281. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].isr.Irq_Udf_Callback = TMRA_1_Udf_callback;
  282. #endif
  283. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  284. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].isr.Irq_Ovf_Callback = TMRA_2_Ovf_callback;
  285. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].isr.Irq_Udf_Callback = TMRA_2_Udf_callback;
  286. #endif
  287. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  288. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].isr.Irq_Ovf_Callback = TMRA_3_Ovf_callback;
  289. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].isr.Irq_Udf_Callback = TMRA_3_Udf_callback;
  290. #endif
  291. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  292. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].isr.Irq_Ovf_Callback = TMRA_4_Ovf_callback;
  293. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].isr.Irq_Udf_Callback = TMRA_4_Udf_callback;
  294. #endif
  295. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  296. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].isr.Irq_Ovf_Callback = TMRA_5_Ovf_callback;
  297. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].isr.Irq_Udf_Callback = TMRA_5_Udf_callback;
  298. #endif
  299. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  300. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].isr.Irq_Ovf_Callback = TMRA_6_Ovf_callback;
  301. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].isr.Irq_Udf_Callback = TMRA_6_Udf_callback;
  302. #endif
  303. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  304. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].isr.Irq_Ovf_Callback = TMRA_7_Ovf_callback;
  305. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].isr.Irq_Udf_Callback = TMRA_7_Udf_callback;
  306. #endif
  307. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  308. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].isr.Irq_Ovf_Callback = TMRA_8_Ovf_callback;
  309. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].isr.Irq_Udf_Callback = TMRA_8_Udf_callback;
  310. #endif
  311. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  312. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].isr.Irq_Ovf_Callback = TMRA_9_Ovf_callback;
  313. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].isr.Irq_Udf_Callback = TMRA_9_Udf_callback;
  314. #endif
  315. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  316. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].isr.Irq_Ovf_Callback = TMRA_10_Ovf_callback;
  317. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].isr.Irq_Udf_Callback = TMRA_10_Udf_callback;
  318. #endif
  319. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  320. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].isr.Irq_Ovf_Callback = TMRA_11_Ovf_callback;
  321. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].isr.Irq_Udf_Callback = TMRA_11_Udf_callback;
  322. #endif
  323. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  324. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].isr.Irq_Ovf_Callback = TMRA_12_Ovf_callback;
  325. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].isr.Irq_Udf_Callback = TMRA_12_Udf_callback;
  326. #endif
  327. }
  328. rt_err_t _tmra_pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder)
  329. {
  330. stc_tmra_init_t stcTmraInit;
  331. struct hc32_irq_config irq_config;
  332. struct hc32_pulse_encoder_tmra_device *hc32_device;
  333. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  334. /* Enable TimerA peripheral clock. */
  335. FCG_Fcg2PeriphClockCmd(hc32_device->u32Fcg2Periph, ENABLE);
  336. (void)TMRA_StructInit(&stcTmraInit);
  337. /* Initializes position-count unit. */
  338. stcTmraInit.u8CountSrc = TMRA_CNT_SRC_HW;
  339. stcTmraInit.hw_count.u16CountUpCond = hc32_device->hw_count.u16CountUpCond;
  340. stcTmraInit.hw_count.u16CountDownCond = hc32_device->hw_count.u16CountDownCond;
  341. stcTmraInit.u32PeriodValue = hc32_device->u32PeriodValue;
  342. (void)TMRA_Init(hc32_device->tmr_handler, &stcTmraInit);
  343. /* OVF interrupt configuration */
  344. irq_config.irq_num = hc32_device->isr.enIRQn_Ovf;
  345. irq_config.int_src = hc32_device->isr.enIntSrc_Ovf;
  346. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Ovf;
  347. /* register interrupt */
  348. hc32_install_irq_handler(&irq_config,
  349. hc32_device->isr.Irq_Ovf_Callback,
  350. RT_TRUE);
  351. /* UDF interrupt configuration */
  352. irq_config.irq_num = hc32_device->isr.enIRQn_Udf;
  353. irq_config.int_src = hc32_device->isr.enIntSrc_Udf;
  354. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Udf;
  355. /* register interrupt */
  356. hc32_install_irq_handler(&irq_config,
  357. hc32_device->isr.Irq_Udf_Callback,
  358. RT_TRUE);
  359. /* Enable the specified interrupts of TimerA. */
  360. TMRA_IntCmd(hc32_device->tmr_handler, TMRA_INT_OVF | TMRA_INT_UDF, ENABLE);
  361. LOG_D("_tmra_pulse_encoder_init");
  362. return RT_EOK;
  363. }
  364. rt_err_t _tmra_pulse_encoder_clear_count(struct rt_pulse_encoder_device *pulse_encoder)
  365. {
  366. rt_uint8_t startFlag = RT_FALSE;
  367. struct hc32_pulse_encoder_tmra_device *hc32_device;
  368. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  369. hc32_device->Over_Under_Flowcount = 0;
  370. if (READ_REG8_BIT(hc32_device->tmr_handler->BCSTRL, TMRA_BCSTRL_START) == TMRA_BCSTRL_START)
  371. {
  372. startFlag = RT_TRUE;
  373. }
  374. TMRA_Stop(hc32_device->tmr_handler);
  375. TMRA_SetCountValue(hc32_device->tmr_handler, 0);
  376. if (RT_TRUE == startFlag)
  377. {
  378. TMRA_Start(hc32_device->tmr_handler);
  379. }
  380. return RT_EOK;
  381. }
  382. rt_int32_t _tmra_pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder)
  383. {
  384. struct hc32_pulse_encoder_tmra_device *hc32_device;
  385. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  386. return (rt_int32_t)((rt_int16_t)TMRA_GetCountValue(hc32_device->tmr_handler) + (hc32_device->Over_Under_Flowcount * (hc32_device->u32PeriodValue + 1)));
  387. }
  388. rt_err_t _tmra_pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args)
  389. {
  390. rt_err_t result;
  391. struct hc32_pulse_encoder_tmra_device *hc32_device;
  392. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  393. result = RT_EOK;
  394. switch (cmd)
  395. {
  396. case PULSE_ENCODER_CMD_ENABLE:
  397. TMRA_Start(hc32_device->tmr_handler);
  398. LOG_D("TMRA_Start");
  399. break;
  400. case PULSE_ENCODER_CMD_DISABLE:
  401. TMRA_Stop(hc32_device->tmr_handler);
  402. LOG_D("TMRA_Stop");
  403. break;
  404. default:
  405. result = -RT_ENOSYS;
  406. break;
  407. }
  408. return result;
  409. }
  410. static const struct rt_pulse_encoder_ops _tmra_ops =
  411. {
  412. .init = _tmra_pulse_encoder_init,
  413. .get_count = _tmra_pulse_encoder_get_count,
  414. .clear_count = _tmra_pulse_encoder_clear_count,
  415. .control = _tmra_pulse_encoder_control,
  416. };
  417. #endif /* BSP_USING_TMRA_PULSE_ENCODER */
  418. #if defined(BSP_USING_TMR6_PULSE_ENCODER)
  419. #if !defined(BSP_USING_PULSE_ENCODER_TMR6_1) && !defined(BSP_USING_PULSE_ENCODER_TMR6_2) && !defined(BSP_USING_PULSE_ENCODER_TMR6_3) && \
  420. !defined(BSP_USING_PULSE_ENCODER_TMR6_4) && !defined(BSP_USING_PULSE_ENCODER_TMR6_5) && !defined(BSP_USING_PULSE_ENCODER_TMR6_6) && \
  421. !defined(BSP_USING_PULSE_ENCODER_TMR6_7) && !defined(BSP_USING_PULSE_ENCODER_TMR6_8)
  422. #error "Please define at least one BSP_USING_PULSE_ENCODERx"
  423. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  424. #endif
  425. enum
  426. {
  427. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  428. PULSE_ENCODER_TMR6_1_INDEX,
  429. #endif
  430. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  431. PULSE_ENCODER_TMR6_2_INDEX,
  432. #endif
  433. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  434. PULSE_ENCODER_TMR6_3_INDEX,
  435. #endif
  436. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  437. PULSE_ENCODER_TMR6_4_INDEX,
  438. #endif
  439. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  440. PULSE_ENCODER_TMR6_5_INDEX,
  441. #endif
  442. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  443. PULSE_ENCODER_TMR6_6_INDEX,
  444. #endif
  445. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  446. PULSE_ENCODER_TMR6_7_INDEX,
  447. #endif
  448. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  449. PULSE_ENCODER_TMR6_8_INDEX,
  450. #endif
  451. };
  452. struct hc32_pulse_encoder_tmr6_device
  453. {
  454. struct rt_pulse_encoder_device pulse_encoder;
  455. CM_TMR6_TypeDef *tmr_handler;
  456. uint32_t u32Fcg2Periph;
  457. struct
  458. {
  459. uint32_t u32CountUpCond;
  460. uint32_t u32CountDownCond;
  461. } hw_count;
  462. struct
  463. {
  464. en_int_src_t enIntSrc_Ovf;
  465. IRQn_Type enIRQn_Ovf;
  466. uint8_t u8Int_Prio_Ovf;
  467. func_ptr_t Irq_Ovf_Callback;
  468. en_int_src_t enIntSrc_Udf;
  469. IRQn_Type enIRQn_Udf;
  470. uint8_t u8Int_Prio_Udf;
  471. func_ptr_t Irq_Udf_Callback;
  472. } isr;
  473. rt_uint32_t u32PeriodValue;
  474. rt_int32_t Over_Under_Flowcount;
  475. char *name;
  476. };
  477. static struct hc32_pulse_encoder_tmr6_device hc32_pulse_encoder_tmr6_obj[] =
  478. {
  479. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  480. PULSE_ENCODER_TMR6_1_CONFIG,
  481. #endif
  482. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  483. PULSE_ENCODER_TMR6_2_CONFIG,
  484. #endif
  485. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  486. PULSE_ENCODER_TMR6_3_CONFIG,
  487. #endif
  488. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  489. PULSE_ENCODER_TMR6_4_CONFIG,
  490. #endif
  491. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  492. PULSE_ENCODER_TMR6_5_CONFIG,
  493. #endif
  494. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  495. PULSE_ENCODER_TMR6_6_CONFIG,
  496. #endif
  497. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  498. PULSE_ENCODER_TMR6_7_CONFIG,
  499. #endif
  500. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  501. PULSE_ENCODER_TMR6_8_CONFIG,
  502. #endif
  503. };
  504. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  505. void TMR6_1_Ovf_callback(void)
  506. {
  507. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler, TMR6_FLAG_OVF);
  508. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].Over_Under_Flowcount++;
  509. }
  510. void TMR6_1_Udf_callback(void)
  511. {
  512. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler, TMR6_FLAG_UDF);
  513. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].Over_Under_Flowcount--;
  514. }
  515. #endif
  516. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  517. void TMR6_2_Ovf_callback(void)
  518. {
  519. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler, TMR6_FLAG_OVF);
  520. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].Over_Under_Flowcount++;
  521. }
  522. void TMR6_2_Udf_callback(void)
  523. {
  524. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler, TMR6_FLAG_UDF);
  525. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].Over_Under_Flowcount--;
  526. }
  527. #endif
  528. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  529. void TMR6_3_Ovf_callback(void)
  530. {
  531. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler, TMR6_FLAG_OVF);
  532. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].Over_Under_Flowcount++;
  533. }
  534. void TMR6_3_Udf_callback(void)
  535. {
  536. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler, TMR6_FLAG_UDF);
  537. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].Over_Under_Flowcount--;
  538. }
  539. #endif
  540. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  541. void TMR6_4_Ovf_callback(void)
  542. {
  543. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler, TMR6_FLAG_OVF);
  544. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].Over_Under_Flowcount++;
  545. }
  546. void TMR6_4_Udf_callback(void)
  547. {
  548. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler, TMR6_FLAG_UDF);
  549. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].Over_Under_Flowcount--;
  550. }
  551. #endif
  552. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  553. void TMR6_5_Ovf_callback(void)
  554. {
  555. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler, TMR6_FLAG_OVF);
  556. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].Over_Under_Flowcount++;
  557. }
  558. void TMR6_5_Udf_callback(void)
  559. {
  560. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler, TMR6_FLAG_UDF);
  561. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].Over_Under_Flowcount--;
  562. }
  563. #endif
  564. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  565. void TMR6_6_Ovf_callback(void)
  566. {
  567. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler, TMR6_FLAG_OVF);
  568. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].Over_Under_Flowcount++;
  569. }
  570. void TMR6_6_Udf_callback(void)
  571. {
  572. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler, TMR6_FLAG_UDF);
  573. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].Over_Under_Flowcount--;
  574. }
  575. #endif
  576. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  577. void TMR6_7_Ovf_callback(void)
  578. {
  579. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].tmr_handler, TMR6_FLAG_OVF);
  580. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].Over_Under_Flowcount++;
  581. }
  582. void TMR6_7_Udf_callback(void)
  583. {
  584. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].tmr_handler, TMR6_FLAG_UDF);
  585. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].Over_Under_Flowcount--;
  586. }
  587. #endif
  588. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  589. void TMR6_8_Ovf_callback(void)
  590. {
  591. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].tmr_handler, TMR6_FLAG_OVF);
  592. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].Over_Under_Flowcount++;
  593. }
  594. void TMR6_8_Udf_callback(void)
  595. {
  596. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].tmr_handler, TMR6_FLAG_UDF);
  597. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].Over_Under_Flowcount--;
  598. }
  599. #endif
  600. /**
  601. * @brief This function gets pulse_encoder_tim6 irq handle.
  602. * @param None
  603. * @retval None
  604. */
  605. static void hc32_get_pulse_encoder_tmr6_callback(void)
  606. {
  607. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  608. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].isr.Irq_Ovf_Callback = TMR6_1_Ovf_callback;
  609. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].isr.Irq_Udf_Callback = TMR6_1_Udf_callback;
  610. #endif
  611. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  612. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].isr.Irq_Ovf_Callback = TMR6_2_Ovf_callback;
  613. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].isr.Irq_Udf_Callback = TMR6_2_Udf_callback;
  614. #endif
  615. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  616. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].isr.Irq_Ovf_Callback = TMR6_3_Ovf_callback;
  617. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].isr.Irq_Udf_Callback = TMR6_3_Udf_callback;
  618. #endif
  619. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  620. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].isr.Irq_Ovf_Callback = TMR6_4_Ovf_callback;
  621. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].isr.Irq_Udf_Callback = TMR6_4_Udf_callback;
  622. #endif
  623. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  624. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].isr.Irq_Ovf_Callback = TMR6_5_Ovf_callback;
  625. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].isr.Irq_Udf_Callback = TMR6_5_Udf_callback;
  626. #endif
  627. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  628. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].isr.Irq_Ovf_Callback = TMR6_6_Ovf_callback;
  629. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].isr.Irq_Udf_Callback = TMR6_6_Udf_callback;
  630. #endif
  631. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  632. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].isr.Irq_Ovf_Callback = TMR6_7_Ovf_callback;
  633. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].isr.Irq_Udf_Callback = TMR6_7_Udf_callback;
  634. #endif
  635. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  636. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].isr.Irq_Ovf_Callback = TMR6_8_Ovf_callback;
  637. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].isr.Irq_Udf_Callback = TMR6_8_Udf_callback;
  638. #endif
  639. }
  640. rt_err_t _tmr6_pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder)
  641. {
  642. stc_tmr6_init_t stcTmr6Init;
  643. struct hc32_irq_config irq_config;
  644. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  645. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  646. /* Enable Timer6 peripheral clock. */
  647. FCG_Fcg2PeriphClockCmd(hc32_device->u32Fcg2Periph, ENABLE);
  648. (void)TMR6_StructInit(&stcTmr6Init);
  649. /* Initializes position-count unit. */
  650. stcTmr6Init.u8CountSrc = TMR6_CNT_SRC_HW;
  651. stcTmr6Init.hw_count.u32CountUpCond = hc32_device->hw_count.u32CountUpCond;
  652. stcTmr6Init.hw_count.u32CountDownCond = hc32_device->hw_count.u32CountDownCond;
  653. stcTmr6Init.u32PeriodValue = hc32_device->u32PeriodValue;
  654. (void)TMR6_Init(hc32_device->tmr_handler, &stcTmr6Init);
  655. /* OVF interrupt configuration */
  656. irq_config.irq_num = hc32_device->isr.enIRQn_Ovf;
  657. irq_config.int_src = hc32_device->isr.enIntSrc_Ovf;
  658. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Ovf;
  659. /* register interrupt */
  660. hc32_install_irq_handler(&irq_config,
  661. hc32_device->isr.Irq_Ovf_Callback,
  662. RT_TRUE);
  663. /* UDF interrupt configuration */
  664. irq_config.irq_num = hc32_device->isr.enIRQn_Udf;
  665. irq_config.int_src = hc32_device->isr.enIntSrc_Udf;
  666. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Udf;
  667. /* register interrupt */
  668. hc32_install_irq_handler(&irq_config,
  669. hc32_device->isr.Irq_Udf_Callback,
  670. RT_TRUE);
  671. /* Enable the specified interrupts of Timer6. */
  672. TMR6_IntCmd(hc32_device->tmr_handler, TMR6_INT_OVF | TMR6_INT_UDF, ENABLE);
  673. LOG_D("_tmr6_pulse_encoder_init");
  674. return RT_EOK;
  675. }
  676. rt_err_t _tmr6_pulse_encoder_clear_count(struct rt_pulse_encoder_device *pulse_encoder)
  677. {
  678. rt_uint8_t startFlag = RT_FALSE;
  679. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  680. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  681. hc32_device->Over_Under_Flowcount = 0;
  682. if (READ_REG32_BIT(hc32_device->tmr_handler->GCONR, TMR6_GCONR_START) == TMR6_GCONR_START)
  683. {
  684. startFlag = RT_TRUE;
  685. }
  686. TMR6_Stop(hc32_device->tmr_handler);
  687. TMR6_SetCountValue(hc32_device->tmr_handler, 0);
  688. if (RT_TRUE == startFlag)
  689. {
  690. TMR6_Start(hc32_device->tmr_handler);
  691. }
  692. return RT_EOK;
  693. }
  694. rt_int32_t _tmr6_pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder)
  695. {
  696. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  697. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  698. return (rt_int32_t)((rt_int16_t)TMR6_GetCountValue(hc32_device->tmr_handler) + (hc32_device->Over_Under_Flowcount * (hc32_device->u32PeriodValue + 1)));
  699. }
  700. rt_err_t _tmr6_pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args)
  701. {
  702. rt_err_t result;
  703. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  704. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  705. result = RT_EOK;
  706. switch (cmd)
  707. {
  708. case PULSE_ENCODER_CMD_ENABLE:
  709. TMR6_Start(hc32_device->tmr_handler);
  710. LOG_D("TMR6_Start");
  711. break;
  712. case PULSE_ENCODER_CMD_DISABLE:
  713. TMR6_Stop(hc32_device->tmr_handler);
  714. LOG_D("TMR6_Stop");
  715. break;
  716. default:
  717. result = -RT_ENOSYS;
  718. break;
  719. }
  720. return result;
  721. }
  722. static const struct rt_pulse_encoder_ops _tmr6_ops =
  723. {
  724. .init = _tmr6_pulse_encoder_init,
  725. .get_count = _tmr6_pulse_encoder_get_count,
  726. .clear_count = _tmr6_pulse_encoder_clear_count,
  727. .control = _tmr6_pulse_encoder_control,
  728. };
  729. #endif /* BSP_USING_TMR6_PULSE_ENCODER */
  730. static int rt_hw_pulse_encoder_init(void)
  731. {
  732. int result;
  733. result = RT_EOK;
  734. #if defined(BSP_USING_TMRA_PULSE_ENCODER)
  735. extern rt_err_t rt_hw_board_pulse_encoder_tmra_init(void);
  736. result = rt_hw_board_pulse_encoder_tmra_init();
  737. hc32_get_pulse_encoder_tmra_callback();
  738. for (int i = 0; i < sizeof(hc32_pulse_encoder_tmra_obj) / sizeof(hc32_pulse_encoder_tmra_obj[0]); i++)
  739. {
  740. hc32_pulse_encoder_tmra_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER;
  741. hc32_pulse_encoder_tmra_obj[i].pulse_encoder.ops = &_tmra_ops;
  742. if (rt_device_pulse_encoder_register(&hc32_pulse_encoder_tmra_obj[i].pulse_encoder, hc32_pulse_encoder_tmra_obj[i].name, RT_NULL) != RT_EOK)
  743. {
  744. LOG_E("%s register failed", hc32_pulse_encoder_tmra_obj[i].name);
  745. result = -RT_ERROR;
  746. }
  747. }
  748. #endif /* BSP_USING_TMRA_PULSE_ENCODER */
  749. #if defined(BSP_USING_TMR6_PULSE_ENCODER)
  750. extern rt_err_t rt_hw_board_pulse_encoder_tmr6_init(void);
  751. result = rt_hw_board_pulse_encoder_tmr6_init();
  752. hc32_get_pulse_encoder_tmr6_callback();
  753. for (int i = 0; i < sizeof(hc32_pulse_encoder_tmr6_obj) / sizeof(hc32_pulse_encoder_tmr6_obj[0]); i++)
  754. {
  755. hc32_pulse_encoder_tmr6_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER;
  756. hc32_pulse_encoder_tmr6_obj[i].pulse_encoder.ops = &_tmr6_ops;
  757. if (rt_device_pulse_encoder_register(&hc32_pulse_encoder_tmr6_obj[i].pulse_encoder, hc32_pulse_encoder_tmr6_obj[i].name, RT_NULL) != RT_EOK)
  758. {
  759. LOG_E("%s register failed", hc32_pulse_encoder_tmr6_obj[i].name);
  760. result = -RT_ERROR;
  761. }
  762. }
  763. #endif /* BSP_USING_TMR6_PULSE_ENCODER */
  764. return result;
  765. }
  766. INIT_BOARD_EXPORT(rt_hw_pulse_encoder_init);
  767. #endif /* RT_USING_PULSE_ENCODER */