drv_pulse_encoder.c 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078
  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 BSP_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 u32PeriphClock;
  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. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  140. void TMRA_1_Ovf_Udf_Handler(void)
  141. {
  142. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].tmr_handler;
  143. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  144. {
  145. TMRA_1_Ovf_callback();
  146. }
  147. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  148. {
  149. TMRA_1_Udf_callback();
  150. }
  151. }
  152. #endif
  153. #endif
  154. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  155. static void TMRA_2_Ovf_callback(void)
  156. {
  157. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler, TMRA_FLAG_OVF);
  158. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].Over_Under_Flowcount++;
  159. }
  160. static void TMRA_2_Udf_callback(void)
  161. {
  162. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler, TMRA_FLAG_UDF);
  163. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].Over_Under_Flowcount--;
  164. }
  165. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  166. void TMRA_2_Ovf_Udf_Handler(void)
  167. {
  168. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].tmr_handler;
  169. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  170. {
  171. TMRA_2_Ovf_callback();
  172. }
  173. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  174. {
  175. TMRA_2_Udf_callback();
  176. }
  177. }
  178. #endif
  179. #endif
  180. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  181. static void TMRA_3_Ovf_callback(void)
  182. {
  183. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler, TMRA_FLAG_OVF);
  184. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].Over_Under_Flowcount++;
  185. }
  186. static void TMRA_3_Udf_callback(void)
  187. {
  188. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler, TMRA_FLAG_UDF);
  189. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].Over_Under_Flowcount--;
  190. }
  191. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  192. void TMRA_3_Ovf_Udf_Handler(void)
  193. {
  194. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].tmr_handler;
  195. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  196. {
  197. TMRA_3_Ovf_callback();
  198. }
  199. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  200. {
  201. TMRA_3_Udf_callback();
  202. }
  203. }
  204. #endif
  205. #endif
  206. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  207. static void TMRA_4_Ovf_callback(void)
  208. {
  209. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler, TMRA_FLAG_OVF);
  210. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].Over_Under_Flowcount++;
  211. }
  212. static void TMRA_4_Udf_callback(void)
  213. {
  214. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler, TMRA_FLAG_UDF);
  215. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].Over_Under_Flowcount--;
  216. }
  217. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  218. void TMRA_4_Ovf_Udf_Handler(void)
  219. {
  220. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].tmr_handler;
  221. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  222. {
  223. TMRA_4_Ovf_callback();
  224. }
  225. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  226. {
  227. TMRA_4_Udf_callback();
  228. }
  229. }
  230. #endif
  231. #endif
  232. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  233. static void TMRA_5_Ovf_callback(void)
  234. {
  235. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler, TMRA_FLAG_OVF);
  236. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].Over_Under_Flowcount++;
  237. }
  238. static void TMRA_5_Udf_callback(void)
  239. {
  240. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler, TMRA_FLAG_UDF);
  241. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].Over_Under_Flowcount--;
  242. }
  243. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  244. void TMRA_5_Ovf_Udf_Handler(void)
  245. {
  246. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].tmr_handler;
  247. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  248. {
  249. TMRA_5_Ovf_callback();
  250. }
  251. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  252. {
  253. TMRA_5_Udf_callback();
  254. }
  255. }
  256. #endif
  257. #endif
  258. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  259. static void TMRA_6_Ovf_callback(void)
  260. {
  261. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].tmr_handler, TMRA_FLAG_OVF);
  262. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].Over_Under_Flowcount++;
  263. }
  264. static void TMRA_6_Udf_callback(void)
  265. {
  266. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].tmr_handler, TMRA_FLAG_UDF);
  267. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].Over_Under_Flowcount--;
  268. }
  269. #if defined (HC32F472)
  270. void TMRA_6_Ovf_Udf_Handler(void)
  271. {
  272. CM_TMRA_TypeDef *tmr_handler = hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].tmr_handler;
  273. if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_OVF) == SET)
  274. {
  275. TMRA_6_Ovf_callback();
  276. }
  277. else if (TMRA_GetStatus(tmr_handler, TMRA_FLAG_UDF) == SET)
  278. {
  279. TMRA_6_Udf_callback();
  280. }
  281. }
  282. #endif
  283. #endif
  284. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  285. static void TMRA_7_Ovf_callback(void)
  286. {
  287. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].tmr_handler, TMRA_FLAG_OVF);
  288. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].Over_Under_Flowcount++;
  289. }
  290. static void TMRA_7_Udf_callback(void)
  291. {
  292. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].tmr_handler, TMRA_FLAG_UDF);
  293. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].Over_Under_Flowcount--;
  294. }
  295. #endif
  296. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  297. static void TMRA_8_Ovf_callback(void)
  298. {
  299. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].tmr_handler, TMRA_FLAG_OVF);
  300. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].Over_Under_Flowcount++;
  301. }
  302. static void TMRA_8_Udf_callback(void)
  303. {
  304. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].tmr_handler, TMRA_FLAG_UDF);
  305. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].Over_Under_Flowcount--;
  306. }
  307. #endif
  308. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  309. static void TMRA_9_Ovf_callback(void)
  310. {
  311. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].tmr_handler, TMRA_FLAG_OVF);
  312. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].Over_Under_Flowcount++;
  313. }
  314. static void TMRA_9_Udf_callback(void)
  315. {
  316. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].tmr_handler, TMRA_FLAG_UDF);
  317. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].Over_Under_Flowcount--;
  318. }
  319. #endif
  320. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  321. static void TMRA_10_Ovf_callback(void)
  322. {
  323. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].tmr_handler, TMRA_FLAG_OVF);
  324. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].Over_Under_Flowcount++;
  325. }
  326. static void TMRA_10_Udf_callback(void)
  327. {
  328. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].tmr_handler, TMRA_FLAG_UDF);
  329. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].Over_Under_Flowcount--;
  330. }
  331. #endif
  332. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  333. static void TMRA_11_Ovf_callback(void)
  334. {
  335. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].tmr_handler, TMRA_FLAG_OVF);
  336. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].Over_Under_Flowcount++;
  337. }
  338. static void TMRA_11_Udf_callback(void)
  339. {
  340. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].tmr_handler, TMRA_FLAG_UDF);
  341. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].Over_Under_Flowcount--;
  342. }
  343. #endif
  344. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  345. static void TMRA_12_Ovf_callback(void)
  346. {
  347. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].tmr_handler, TMRA_FLAG_OVF);
  348. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].Over_Under_Flowcount++;
  349. }
  350. static void TMRA_12_Udf_callback(void)
  351. {
  352. TMRA_ClearStatus(hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].tmr_handler, TMRA_FLAG_UDF);
  353. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].Over_Under_Flowcount--;
  354. }
  355. #endif
  356. /**
  357. * @brief This function gets pulse_encoder_tima irq handle.
  358. * @param None
  359. * @retval None
  360. */
  361. static void hc32_get_pulse_encoder_tmra_callback(void)
  362. {
  363. #ifdef BSP_USING_PULSE_ENCODER_TMRA_1
  364. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].isr.Irq_Ovf_Callback = TMRA_1_Ovf_callback;
  365. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_1_INDEX].isr.Irq_Udf_Callback = TMRA_1_Udf_callback;
  366. #endif
  367. #ifdef BSP_USING_PULSE_ENCODER_TMRA_2
  368. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].isr.Irq_Ovf_Callback = TMRA_2_Ovf_callback;
  369. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_2_INDEX].isr.Irq_Udf_Callback = TMRA_2_Udf_callback;
  370. #endif
  371. #ifdef BSP_USING_PULSE_ENCODER_TMRA_3
  372. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].isr.Irq_Ovf_Callback = TMRA_3_Ovf_callback;
  373. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_3_INDEX].isr.Irq_Udf_Callback = TMRA_3_Udf_callback;
  374. #endif
  375. #ifdef BSP_USING_PULSE_ENCODER_TMRA_4
  376. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].isr.Irq_Ovf_Callback = TMRA_4_Ovf_callback;
  377. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_4_INDEX].isr.Irq_Udf_Callback = TMRA_4_Udf_callback;
  378. #endif
  379. #ifdef BSP_USING_PULSE_ENCODER_TMRA_5
  380. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].isr.Irq_Ovf_Callback = TMRA_5_Ovf_callback;
  381. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_5_INDEX].isr.Irq_Udf_Callback = TMRA_5_Udf_callback;
  382. #endif
  383. #ifdef BSP_USING_PULSE_ENCODER_TMRA_6
  384. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].isr.Irq_Ovf_Callback = TMRA_6_Ovf_callback;
  385. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_6_INDEX].isr.Irq_Udf_Callback = TMRA_6_Udf_callback;
  386. #endif
  387. #ifdef BSP_USING_PULSE_ENCODER_TMRA_7
  388. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].isr.Irq_Ovf_Callback = TMRA_7_Ovf_callback;
  389. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_7_INDEX].isr.Irq_Udf_Callback = TMRA_7_Udf_callback;
  390. #endif
  391. #ifdef BSP_USING_PULSE_ENCODER_TMRA_8
  392. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].isr.Irq_Ovf_Callback = TMRA_8_Ovf_callback;
  393. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_8_INDEX].isr.Irq_Udf_Callback = TMRA_8_Udf_callback;
  394. #endif
  395. #ifdef BSP_USING_PULSE_ENCODER_TMRA_9
  396. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].isr.Irq_Ovf_Callback = TMRA_9_Ovf_callback;
  397. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_9_INDEX].isr.Irq_Udf_Callback = TMRA_9_Udf_callback;
  398. #endif
  399. #ifdef BSP_USING_PULSE_ENCODER_TMRA_10
  400. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].isr.Irq_Ovf_Callback = TMRA_10_Ovf_callback;
  401. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_10_INDEX].isr.Irq_Udf_Callback = TMRA_10_Udf_callback;
  402. #endif
  403. #ifdef BSP_USING_PULSE_ENCODER_TMRA_11
  404. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].isr.Irq_Ovf_Callback = TMRA_11_Ovf_callback;
  405. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_11_INDEX].isr.Irq_Udf_Callback = TMRA_11_Udf_callback;
  406. #endif
  407. #ifdef BSP_USING_PULSE_ENCODER_TMRA_12
  408. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].isr.Irq_Ovf_Callback = TMRA_12_Ovf_callback;
  409. hc32_pulse_encoder_tmra_obj[PULSE_ENCODER_TMRA_12_INDEX].isr.Irq_Udf_Callback = TMRA_12_Udf_callback;
  410. #endif
  411. }
  412. rt_err_t _tmra_pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder)
  413. {
  414. stc_tmra_init_t stcTmraInit;
  415. struct hc32_irq_config irq_config;
  416. struct hc32_pulse_encoder_tmra_device *hc32_device;
  417. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  418. /* Enable TimerA peripheral clock. */
  419. FCG_Fcg2PeriphClockCmd(hc32_device->u32PeriphClock, ENABLE);
  420. (void)TMRA_StructInit(&stcTmraInit);
  421. /* Initializes position-count unit. */
  422. stcTmraInit.u8CountSrc = TMRA_CNT_SRC_HW;
  423. stcTmraInit.hw_count.u16CountUpCond = hc32_device->hw_count.u16CountUpCond;
  424. stcTmraInit.hw_count.u16CountDownCond = hc32_device->hw_count.u16CountDownCond;
  425. stcTmraInit.u32PeriodValue = hc32_device->u32PeriodValue;
  426. (void)TMRA_Init(hc32_device->tmr_handler, &stcTmraInit);
  427. /* OVF interrupt configuration */
  428. irq_config.irq_num = hc32_device->isr.enIRQn_Ovf;
  429. irq_config.int_src = hc32_device->isr.enIntSrc_Ovf;
  430. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Ovf;
  431. /* register interrupt */
  432. hc32_install_irq_handler(&irq_config, hc32_device->isr.Irq_Ovf_Callback, RT_TRUE);
  433. /* UDF interrupt configuration */
  434. irq_config.irq_num = hc32_device->isr.enIRQn_Udf;
  435. irq_config.int_src = hc32_device->isr.enIntSrc_Udf;
  436. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Udf;
  437. /* register interrupt */
  438. hc32_install_irq_handler(&irq_config, hc32_device->isr.Irq_Udf_Callback, RT_TRUE);
  439. /* Enable the specified interrupts of TimerA. */
  440. TMRA_IntCmd(hc32_device->tmr_handler, TMRA_INT_OVF | TMRA_INT_UDF, ENABLE);
  441. LOG_D("_tmra_pulse_encoder_init");
  442. return RT_EOK;
  443. }
  444. rt_err_t _tmra_pulse_encoder_clear_count(struct rt_pulse_encoder_device *pulse_encoder)
  445. {
  446. rt_uint8_t startFlag = RT_FALSE;
  447. struct hc32_pulse_encoder_tmra_device *hc32_device;
  448. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  449. hc32_device->Over_Under_Flowcount = 0;
  450. if (READ_REG8_BIT(hc32_device->tmr_handler->BCSTRL, TMRA_BCSTRL_START) == TMRA_BCSTRL_START)
  451. {
  452. startFlag = RT_TRUE;
  453. }
  454. TMRA_Stop(hc32_device->tmr_handler);
  455. TMRA_SetCountValue(hc32_device->tmr_handler, 0);
  456. if (RT_TRUE == startFlag)
  457. {
  458. TMRA_Start(hc32_device->tmr_handler);
  459. }
  460. return RT_EOK;
  461. }
  462. rt_int32_t _tmra_pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder)
  463. {
  464. struct hc32_pulse_encoder_tmra_device *hc32_device;
  465. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  466. return (rt_int32_t)((rt_int16_t)TMRA_GetCountValue(hc32_device->tmr_handler) + (hc32_device->Over_Under_Flowcount * (hc32_device->u32PeriodValue + 1)));
  467. }
  468. rt_err_t _tmra_pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args)
  469. {
  470. rt_err_t result;
  471. struct hc32_pulse_encoder_tmra_device *hc32_device;
  472. hc32_device = (struct hc32_pulse_encoder_tmra_device *)pulse_encoder;
  473. result = RT_EOK;
  474. switch (cmd)
  475. {
  476. case PULSE_ENCODER_CMD_ENABLE:
  477. TMRA_Start(hc32_device->tmr_handler);
  478. LOG_D("TMRA_Start");
  479. break;
  480. case PULSE_ENCODER_CMD_DISABLE:
  481. TMRA_Stop(hc32_device->tmr_handler);
  482. LOG_D("TMRA_Stop");
  483. break;
  484. default:
  485. result = -RT_ENOSYS;
  486. break;
  487. }
  488. return result;
  489. }
  490. static const struct rt_pulse_encoder_ops _tmra_ops =
  491. {
  492. .init = _tmra_pulse_encoder_init,
  493. .get_count = _tmra_pulse_encoder_get_count,
  494. .clear_count = _tmra_pulse_encoder_clear_count,
  495. .control = _tmra_pulse_encoder_control,
  496. };
  497. #endif /* BSP_USING_TMRA_PULSE_ENCODER */
  498. #if defined(BSP_USING_TMR6_PULSE_ENCODER)
  499. #if !defined(BSP_USING_PULSE_ENCODER_TMR6_1) && !defined(BSP_USING_PULSE_ENCODER_TMR6_2) && !defined(BSP_USING_PULSE_ENCODER_TMR6_3) && \
  500. !defined(BSP_USING_PULSE_ENCODER_TMR6_4) && !defined(BSP_USING_PULSE_ENCODER_TMR6_5) && !defined(BSP_USING_PULSE_ENCODER_TMR6_6) && \
  501. !defined(BSP_USING_PULSE_ENCODER_TMR6_7) && !defined(BSP_USING_PULSE_ENCODER_TMR6_8) && !defined(BSP_USING_PULSE_ENCODER_TMR6_9) && \
  502. !defined(BSP_USING_PULSE_ENCODER_TMR6_10)
  503. #error "Please define at least one BSP_USING_PULSE_ENCODERx"
  504. /* this driver can be disabled at menuconfig -> RT-Thread Components -> Device Drivers */
  505. #endif
  506. enum
  507. {
  508. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  509. PULSE_ENCODER_TMR6_1_INDEX,
  510. #endif
  511. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  512. PULSE_ENCODER_TMR6_2_INDEX,
  513. #endif
  514. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  515. PULSE_ENCODER_TMR6_3_INDEX,
  516. #endif
  517. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  518. PULSE_ENCODER_TMR6_4_INDEX,
  519. #endif
  520. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  521. PULSE_ENCODER_TMR6_5_INDEX,
  522. #endif
  523. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  524. PULSE_ENCODER_TMR6_6_INDEX,
  525. #endif
  526. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  527. PULSE_ENCODER_TMR6_7_INDEX,
  528. #endif
  529. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  530. PULSE_ENCODER_TMR6_8_INDEX,
  531. #endif
  532. #ifdef BSP_USING_PULSE_ENCODER_TMR6_9
  533. PULSE_ENCODER_TMR6_9_INDEX,
  534. #endif
  535. #ifdef BSP_USING_PULSE_ENCODER_TMR6_10
  536. PULSE_ENCODER_TMR6_10_INDEX,
  537. #endif
  538. };
  539. struct hc32_pulse_encoder_tmr6_device
  540. {
  541. struct rt_pulse_encoder_device pulse_encoder;
  542. CM_TMR6_TypeDef *tmr_handler;
  543. uint32_t u32PeriphClock;
  544. struct
  545. {
  546. uint32_t u32CountUpCond;
  547. uint32_t u32CountDownCond;
  548. } hw_count;
  549. struct
  550. {
  551. en_int_src_t enIntSrc_Ovf;
  552. IRQn_Type enIRQn_Ovf;
  553. uint8_t u8Int_Prio_Ovf;
  554. func_ptr_t Irq_Ovf_Callback;
  555. en_int_src_t enIntSrc_Udf;
  556. IRQn_Type enIRQn_Udf;
  557. uint8_t u8Int_Prio_Udf;
  558. func_ptr_t Irq_Udf_Callback;
  559. } isr;
  560. rt_uint32_t u32PeriodValue;
  561. rt_int32_t Over_Under_Flowcount;
  562. char *name;
  563. };
  564. static struct hc32_pulse_encoder_tmr6_device hc32_pulse_encoder_tmr6_obj[] =
  565. {
  566. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  567. PULSE_ENCODER_TMR6_1_CONFIG,
  568. #endif
  569. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  570. PULSE_ENCODER_TMR6_2_CONFIG,
  571. #endif
  572. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  573. PULSE_ENCODER_TMR6_3_CONFIG,
  574. #endif
  575. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  576. PULSE_ENCODER_TMR6_4_CONFIG,
  577. #endif
  578. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  579. PULSE_ENCODER_TMR6_5_CONFIG,
  580. #endif
  581. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  582. PULSE_ENCODER_TMR6_6_CONFIG,
  583. #endif
  584. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  585. PULSE_ENCODER_TMR6_7_CONFIG,
  586. #endif
  587. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  588. PULSE_ENCODER_TMR6_8_CONFIG,
  589. #endif
  590. #ifdef BSP_USING_PULSE_ENCODER_TMR6_9
  591. PULSE_ENCODER_TMR6_9_CONFIG,
  592. #endif
  593. #ifdef BSP_USING_PULSE_ENCODER_TMR6_10
  594. PULSE_ENCODER_TMR6_10_CONFIG,
  595. #endif
  596. };
  597. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  598. void TMR6_1_Ovf_callback(void)
  599. {
  600. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler, TMR6_FLAG_OVF);
  601. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].Over_Under_Flowcount++;
  602. }
  603. void TMR6_1_Udf_callback(void)
  604. {
  605. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler, TMR6_FLAG_UDF);
  606. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].Over_Under_Flowcount--;
  607. }
  608. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  609. void TMR6_1_Ovf_Udf_Handler(void)
  610. {
  611. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].tmr_handler;
  612. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  613. {
  614. TMR6_1_Ovf_callback();
  615. }
  616. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  617. {
  618. TMR6_1_Udf_callback();
  619. }
  620. }
  621. #endif
  622. #endif
  623. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  624. void TMR6_2_Ovf_callback(void)
  625. {
  626. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler, TMR6_FLAG_OVF);
  627. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].Over_Under_Flowcount++;
  628. }
  629. void TMR6_2_Udf_callback(void)
  630. {
  631. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler, TMR6_FLAG_UDF);
  632. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].Over_Under_Flowcount--;
  633. }
  634. #if defined (HC32F448) || defined (HC32F472) || defined (HC32F334)
  635. void TMR6_2_Ovf_Udf_Handler(void)
  636. {
  637. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].tmr_handler;
  638. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  639. {
  640. TMR6_2_Ovf_callback();
  641. }
  642. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  643. {
  644. TMR6_2_Udf_callback();
  645. }
  646. }
  647. #endif
  648. #endif
  649. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  650. void TMR6_3_Ovf_callback(void)
  651. {
  652. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler, TMR6_FLAG_OVF);
  653. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].Over_Under_Flowcount++;
  654. }
  655. void TMR6_3_Udf_callback(void)
  656. {
  657. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler, TMR6_FLAG_UDF);
  658. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].Over_Under_Flowcount--;
  659. }
  660. #if defined (HC32F472) || defined (HC32F334)
  661. void TMR6_3_Ovf_Udf_Handler(void)
  662. {
  663. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].tmr_handler;
  664. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  665. {
  666. TMR6_3_Ovf_callback();
  667. }
  668. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  669. {
  670. TMR6_3_Udf_callback();
  671. }
  672. }
  673. #endif
  674. #endif
  675. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  676. void TMR6_4_Ovf_callback(void)
  677. {
  678. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler, TMR6_FLAG_OVF);
  679. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].Over_Under_Flowcount++;
  680. }
  681. void TMR6_4_Udf_callback(void)
  682. {
  683. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler, TMR6_FLAG_UDF);
  684. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].Over_Under_Flowcount--;
  685. }
  686. #if defined (HC32F472) || defined (HC32F334)
  687. void TMR6_4_Ovf_Udf_Handler(void)
  688. {
  689. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].tmr_handler;
  690. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  691. {
  692. TMR6_4_Ovf_callback();
  693. }
  694. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  695. {
  696. TMR6_4_Udf_callback();
  697. }
  698. }
  699. #endif
  700. #endif
  701. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  702. void TMR6_5_Ovf_callback(void)
  703. {
  704. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler, TMR6_FLAG_OVF);
  705. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].Over_Under_Flowcount++;
  706. }
  707. void TMR6_5_Udf_callback(void)
  708. {
  709. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler, TMR6_FLAG_UDF);
  710. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].Over_Under_Flowcount--;
  711. }
  712. #if defined (HC32F472) || defined (HC32F334)
  713. void TMR6_5_Ovf_Udf_Handler(void)
  714. {
  715. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].tmr_handler;
  716. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  717. {
  718. TMR6_5_Ovf_callback();
  719. }
  720. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  721. {
  722. TMR6_5_Udf_callback();
  723. }
  724. }
  725. #endif
  726. #endif
  727. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  728. void TMR6_6_Ovf_callback(void)
  729. {
  730. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler, TMR6_FLAG_OVF);
  731. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].Over_Under_Flowcount++;
  732. }
  733. void TMR6_6_Udf_callback(void)
  734. {
  735. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler, TMR6_FLAG_UDF);
  736. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].Over_Under_Flowcount--;
  737. }
  738. #if defined (HC32F472) || defined (HC32F334)
  739. void TMR6_6_Ovf_Udf_Handler(void)
  740. {
  741. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].tmr_handler;
  742. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  743. {
  744. TMR6_6_Ovf_callback();
  745. }
  746. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  747. {
  748. TMR6_6_Udf_callback();
  749. }
  750. }
  751. #endif
  752. #endif
  753. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  754. void TMR6_7_Ovf_callback(void)
  755. {
  756. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].tmr_handler, TMR6_FLAG_OVF);
  757. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].Over_Under_Flowcount++;
  758. }
  759. void TMR6_7_Udf_callback(void)
  760. {
  761. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].tmr_handler, TMR6_FLAG_UDF);
  762. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].Over_Under_Flowcount--;
  763. }
  764. #if defined (HC32F472)
  765. void TMR6_7_Ovf_Udf_Handler(void)
  766. {
  767. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].tmr_handler;
  768. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  769. {
  770. TMR6_7_Ovf_callback();
  771. }
  772. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  773. {
  774. TMR6_7_Udf_callback();
  775. }
  776. }
  777. #endif
  778. #endif
  779. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  780. void TMR6_8_Ovf_callback(void)
  781. {
  782. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].tmr_handler, TMR6_FLAG_OVF);
  783. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].Over_Under_Flowcount++;
  784. }
  785. void TMR6_8_Udf_callback(void)
  786. {
  787. TMR6_ClearStatus(hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].tmr_handler, TMR6_FLAG_UDF);
  788. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].Over_Under_Flowcount--;
  789. }
  790. #if defined (HC32F472)
  791. void TMR6_8_Ovf_Udf_Handler(void)
  792. {
  793. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].tmr_handler;
  794. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  795. {
  796. TMR6_8_Ovf_callback();
  797. }
  798. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  799. {
  800. TMR6_8_Udf_callback();
  801. }
  802. }
  803. #endif
  804. #endif
  805. #ifdef BSP_USING_PULSE_ENCODER_TMR6_9
  806. #if defined (HC32F472)
  807. void TMR6_9_Ovf_Udf_Handler(void)
  808. {
  809. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_9_INDEX].tmr_handler;
  810. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  811. {
  812. TMR6_ClearStatus(tmr_handler, TMR6_FLAG_OVF);
  813. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_9_INDEX].Over_Under_Flowcount++;
  814. }
  815. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  816. {
  817. TMR6_ClearStatus(tmr_handler, TMR6_FLAG_UDF);
  818. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_9_INDEX].Over_Under_Flowcount--;
  819. }
  820. }
  821. #endif
  822. #endif
  823. #ifdef BSP_USING_PULSE_ENCODER_TMR6_10
  824. #if defined (HC32F472)
  825. void TMR6_10_Ovf_Udf_Handler(void)
  826. {
  827. CM_TMR6_TypeDef *tmr_handler = hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_10_INDEX].tmr_handler;
  828. if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_OVF) == SET)
  829. {
  830. TMR6_ClearStatus(tmr_handler, TMR6_FLAG_OVF);
  831. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_10_INDEX].Over_Under_Flowcount++;
  832. }
  833. else if (TMR6_GetStatus(tmr_handler, TMR6_FLAG_UDF) == SET)
  834. {
  835. TMR6_ClearStatus(tmr_handler, TMR6_FLAG_UDF);
  836. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_10_INDEX].Over_Under_Flowcount--;
  837. }
  838. }
  839. #endif
  840. #endif
  841. /**
  842. * @brief This function gets pulse_encoder_tim6 irq handle.
  843. * @param None
  844. * @retval None
  845. */
  846. static void hc32_get_pulse_encoder_tmr6_callback(void)
  847. {
  848. #ifdef BSP_USING_PULSE_ENCODER_TMR6_1
  849. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].isr.Irq_Ovf_Callback = TMR6_1_Ovf_callback;
  850. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_1_INDEX].isr.Irq_Udf_Callback = TMR6_1_Udf_callback;
  851. #endif
  852. #ifdef BSP_USING_PULSE_ENCODER_TMR6_2
  853. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].isr.Irq_Ovf_Callback = TMR6_2_Ovf_callback;
  854. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_2_INDEX].isr.Irq_Udf_Callback = TMR6_2_Udf_callback;
  855. #endif
  856. #ifdef BSP_USING_PULSE_ENCODER_TMR6_3
  857. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].isr.Irq_Ovf_Callback = TMR6_3_Ovf_callback;
  858. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_3_INDEX].isr.Irq_Udf_Callback = TMR6_3_Udf_callback;
  859. #endif
  860. #ifdef BSP_USING_PULSE_ENCODER_TMR6_4
  861. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].isr.Irq_Ovf_Callback = TMR6_4_Ovf_callback;
  862. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_4_INDEX].isr.Irq_Udf_Callback = TMR6_4_Udf_callback;
  863. #endif
  864. #ifdef BSP_USING_PULSE_ENCODER_TMR6_5
  865. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].isr.Irq_Ovf_Callback = TMR6_5_Ovf_callback;
  866. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_5_INDEX].isr.Irq_Udf_Callback = TMR6_5_Udf_callback;
  867. #endif
  868. #ifdef BSP_USING_PULSE_ENCODER_TMR6_6
  869. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].isr.Irq_Ovf_Callback = TMR6_6_Ovf_callback;
  870. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_6_INDEX].isr.Irq_Udf_Callback = TMR6_6_Udf_callback;
  871. #endif
  872. #ifdef BSP_USING_PULSE_ENCODER_TMR6_7
  873. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].isr.Irq_Ovf_Callback = TMR6_7_Ovf_callback;
  874. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_7_INDEX].isr.Irq_Udf_Callback = TMR6_7_Udf_callback;
  875. #endif
  876. #ifdef BSP_USING_PULSE_ENCODER_TMR6_8
  877. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].isr.Irq_Ovf_Callback = TMR6_8_Ovf_callback;
  878. hc32_pulse_encoder_tmr6_obj[PULSE_ENCODER_TMR6_8_INDEX].isr.Irq_Udf_Callback = TMR6_8_Udf_callback;
  879. #endif
  880. }
  881. rt_err_t _tmr6_pulse_encoder_init(struct rt_pulse_encoder_device *pulse_encoder)
  882. {
  883. stc_tmr6_init_t stcTmr6Init;
  884. struct hc32_irq_config irq_config;
  885. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  886. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  887. /* Enable Timer6 peripheral clock. */
  888. FCG_Fcg2PeriphClockCmd(hc32_device->u32PeriphClock, ENABLE);
  889. (void)TMR6_StructInit(&stcTmr6Init);
  890. /* Initializes position-count unit. */
  891. stcTmr6Init.u8CountSrc = TMR6_CNT_SRC_HW;
  892. stcTmr6Init.hw_count.u32CountUpCond = hc32_device->hw_count.u32CountUpCond;
  893. stcTmr6Init.hw_count.u32CountDownCond = hc32_device->hw_count.u32CountDownCond;
  894. stcTmr6Init.u32PeriodValue = hc32_device->u32PeriodValue;
  895. (void)TMR6_Init(hc32_device->tmr_handler, &stcTmr6Init);
  896. /* OVF interrupt configuration */
  897. irq_config.irq_num = hc32_device->isr.enIRQn_Ovf;
  898. irq_config.int_src = hc32_device->isr.enIntSrc_Ovf;
  899. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Ovf;
  900. /* register interrupt */
  901. hc32_install_irq_handler(&irq_config, hc32_device->isr.Irq_Ovf_Callback, RT_TRUE);
  902. /* UDF interrupt configuration */
  903. irq_config.irq_num = hc32_device->isr.enIRQn_Udf;
  904. irq_config.int_src = hc32_device->isr.enIntSrc_Udf;
  905. irq_config.irq_prio = hc32_device->isr.u8Int_Prio_Udf;
  906. /* register interrupt */
  907. hc32_install_irq_handler(&irq_config, hc32_device->isr.Irq_Udf_Callback, RT_TRUE);
  908. /* Enable the specified interrupts of Timer6. */
  909. TMR6_IntCmd(hc32_device->tmr_handler, TMR6_INT_OVF | TMR6_INT_UDF, ENABLE);
  910. LOG_D("_tmr6_pulse_encoder_init");
  911. return RT_EOK;
  912. }
  913. rt_err_t _tmr6_pulse_encoder_clear_count(struct rt_pulse_encoder_device *pulse_encoder)
  914. {
  915. rt_uint8_t startFlag = RT_FALSE;
  916. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  917. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  918. hc32_device->Over_Under_Flowcount = 0;
  919. if (READ_REG32_BIT(hc32_device->tmr_handler->GCONR, TMR6_GCONR_START) == TMR6_GCONR_START)
  920. {
  921. startFlag = RT_TRUE;
  922. }
  923. TMR6_Stop(hc32_device->tmr_handler);
  924. TMR6_SetCountValue(hc32_device->tmr_handler, 0);
  925. if (RT_TRUE == startFlag)
  926. {
  927. TMR6_Start(hc32_device->tmr_handler);
  928. }
  929. return RT_EOK;
  930. }
  931. rt_int32_t _tmr6_pulse_encoder_get_count(struct rt_pulse_encoder_device *pulse_encoder)
  932. {
  933. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  934. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  935. return (rt_int32_t)((rt_int16_t)TMR6_GetCountValue(hc32_device->tmr_handler) + (hc32_device->Over_Under_Flowcount * (hc32_device->u32PeriodValue + 1)));
  936. }
  937. rt_err_t _tmr6_pulse_encoder_control(struct rt_pulse_encoder_device *pulse_encoder, rt_uint32_t cmd, void *args)
  938. {
  939. rt_err_t result;
  940. struct hc32_pulse_encoder_tmr6_device *hc32_device;
  941. hc32_device = (struct hc32_pulse_encoder_tmr6_device *)pulse_encoder;
  942. result = RT_EOK;
  943. switch (cmd)
  944. {
  945. case PULSE_ENCODER_CMD_ENABLE:
  946. TMR6_Start(hc32_device->tmr_handler);
  947. LOG_D("TMR6_Start");
  948. break;
  949. case PULSE_ENCODER_CMD_DISABLE:
  950. TMR6_Stop(hc32_device->tmr_handler);
  951. LOG_D("TMR6_Stop");
  952. break;
  953. default:
  954. result = -RT_ENOSYS;
  955. break;
  956. }
  957. return result;
  958. }
  959. static const struct rt_pulse_encoder_ops _tmr6_ops =
  960. {
  961. .init = _tmr6_pulse_encoder_init,
  962. .get_count = _tmr6_pulse_encoder_get_count,
  963. .clear_count = _tmr6_pulse_encoder_clear_count,
  964. .control = _tmr6_pulse_encoder_control,
  965. };
  966. #endif /* BSP_USING_TMR6_PULSE_ENCODER */
  967. static int rt_hw_pulse_encoder_init(void)
  968. {
  969. int result;
  970. result = RT_EOK;
  971. #if defined(BSP_USING_TMRA_PULSE_ENCODER)
  972. extern rt_err_t rt_hw_board_pulse_encoder_tmra_init(void);
  973. result = rt_hw_board_pulse_encoder_tmra_init();
  974. hc32_get_pulse_encoder_tmra_callback();
  975. for (int i = 0; i < sizeof(hc32_pulse_encoder_tmra_obj) / sizeof(hc32_pulse_encoder_tmra_obj[0]); i++)
  976. {
  977. hc32_pulse_encoder_tmra_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER;
  978. hc32_pulse_encoder_tmra_obj[i].pulse_encoder.ops = &_tmra_ops;
  979. 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)
  980. {
  981. LOG_E("%s register failed", hc32_pulse_encoder_tmra_obj[i].name);
  982. result = -RT_ERROR;
  983. }
  984. }
  985. #endif /* BSP_USING_TMRA_PULSE_ENCODER */
  986. #if defined(BSP_USING_TMR6_PULSE_ENCODER)
  987. extern rt_err_t rt_hw_board_pulse_encoder_tmr6_init(void);
  988. result = rt_hw_board_pulse_encoder_tmr6_init();
  989. hc32_get_pulse_encoder_tmr6_callback();
  990. for (int i = 0; i < sizeof(hc32_pulse_encoder_tmr6_obj) / sizeof(hc32_pulse_encoder_tmr6_obj[0]); i++)
  991. {
  992. hc32_pulse_encoder_tmr6_obj[i].pulse_encoder.type = AB_PHASE_PULSE_ENCODER;
  993. hc32_pulse_encoder_tmr6_obj[i].pulse_encoder.ops = &_tmr6_ops;
  994. 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)
  995. {
  996. LOG_E("%s register failed", hc32_pulse_encoder_tmr6_obj[i].name);
  997. result = -RT_ERROR;
  998. }
  999. }
  1000. #endif /* BSP_USING_TMR6_PULSE_ENCODER */
  1001. return result;
  1002. }
  1003. INIT_BOARD_EXPORT(rt_hw_pulse_encoder_init);
  1004. #endif /* RT_USING_PULSE_ENCODER */