drv_pwm.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606
  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. * 2022-06-27 lianghongquan first version
  9. * 2023-02-22 CDT support HC32F4A0
  10. * 2024-11-20 CDT support HC32F448
  11. * 2025-01-03 CDT support HC32F472
  12. */
  13. #include <board.h>
  14. #include "drv_config.h"
  15. #include <drivers/dev_pwm.h>
  16. #include <pwm_tmr_config.h>
  17. #if defined(BSP_USING_PWM)
  18. // #define DRV_DEBUG
  19. #define LOG_TAG "drv_pwm"
  20. #include <drv_log.h>
  21. #if defined(BSP_USING_PWM_TMRA)
  22. #if defined(HC32F460) || defined(HC32F448)
  23. #define TMRA_CHANNEL_NUM_MAX 8U
  24. #elif defined(HC32F4A0) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  25. #define TMRA_CHANNEL_NUM_MAX 4U
  26. #endif
  27. enum
  28. {
  29. #ifdef BSP_USING_PWM_TMRA_1
  30. PWM_TMRA_1_INDEX,
  31. #endif
  32. #ifdef BSP_USING_PWM_TMRA_2
  33. PWM_TMRA_2_INDEX,
  34. #endif
  35. #ifdef BSP_USING_PWM_TMRA_3
  36. PWM_TMRA_3_INDEX,
  37. #endif
  38. #ifdef BSP_USING_PWM_TMRA_4
  39. PWM_TMRA_4_INDEX,
  40. #endif
  41. #ifdef BSP_USING_PWM_TMRA_5
  42. PWM_TMRA_5_INDEX,
  43. #endif
  44. #ifdef BSP_USING_PWM_TMRA_6
  45. PWM_TMRA_6_INDEX,
  46. #endif
  47. #ifdef BSP_USING_PWM_TMRA_7
  48. PWM_TMRA_7_INDEX,
  49. #endif
  50. #ifdef BSP_USING_PWM_TMRA_8
  51. PWM_TMRA_8_INDEX,
  52. #endif
  53. #ifdef BSP_USING_PWM_TMRA_9
  54. PWM_TMRA_9_INDEX,
  55. #endif
  56. #ifdef BSP_USING_PWM_TMRA_10
  57. PWM_TMRA_10_INDEX,
  58. #endif
  59. #ifdef BSP_USING_PWM_TMRA_11
  60. PWM_TMRA_11_INDEX,
  61. #endif
  62. #ifdef BSP_USING_PWM_TMRA_12
  63. PWM_TMRA_12_INDEX,
  64. #endif
  65. PWM_TMRA_UNIT_NUM,
  66. };
  67. struct hc32_pwm_tmra
  68. {
  69. struct rt_device_pwm pwm_device;
  70. char *name;
  71. CM_TMRA_TypeDef *instance;
  72. rt_uint32_t channel;
  73. uint32_t CompareValue[TMRA_CHANNEL_NUM_MAX];
  74. rt_bool_t complementary[TMRA_CHANNEL_NUM_MAX];
  75. stc_tmra_init_t stcTmraInit;
  76. stc_tmra_pwm_init_t stcPwmInit;
  77. };
  78. static struct hc32_pwm_tmra g_pwm_tmra_array[] =
  79. {
  80. #ifdef BSP_USING_PWM_TMRA_1
  81. PWM_TMRA_1_CONFIG,
  82. #endif
  83. #ifdef BSP_USING_PWM_TMRA_2
  84. PWM_TMRA_2_CONFIG,
  85. #endif
  86. #ifdef BSP_USING_PWM_TMRA_3
  87. PWM_TMRA_3_CONFIG,
  88. #endif
  89. #ifdef BSP_USING_PWM_TMRA_4
  90. PWM_TMRA_4_CONFIG,
  91. #endif
  92. #ifdef BSP_USING_PWM_TMRA_5
  93. PWM_TMRA_5_CONFIG,
  94. #endif
  95. #ifdef BSP_USING_PWM_TMRA_6
  96. PWM_TMRA_6_CONFIG,
  97. #endif
  98. #ifdef BSP_USING_PWM_TMRA_7
  99. PWM_TMRA_7_CONFIG,
  100. #endif
  101. #ifdef BSP_USING_PWM_TMRA_8
  102. PWM_TMRA_8_CONFIG,
  103. #endif
  104. #ifdef BSP_USING_PWM_TMRA_9
  105. PWM_TMRA_9_CONFIG,
  106. #endif
  107. #ifdef BSP_USING_PWM_TMRA_10
  108. PWM_TMRA_10_CONFIG,
  109. #endif
  110. #ifdef BSP_USING_PWM_TMRA_11
  111. PWM_TMRA_11_CONFIG,
  112. #endif
  113. #ifdef BSP_USING_PWM_TMRA_12
  114. PWM_TMRA_12_CONFIG,
  115. #endif
  116. };
  117. static rt_uint32_t tmra_get_clk_notdiv(CM_TMRA_TypeDef *TMRAx)
  118. {
  119. rt_uint32_t u32clkFreq;
  120. rt_uint32_t u32BusName;
  121. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  122. switch ((rt_uint32_t)TMRAx)
  123. {
  124. case (rt_uint32_t)CM_TMRA_1:
  125. case (rt_uint32_t)CM_TMRA_2:
  126. case (rt_uint32_t)CM_TMRA_3:
  127. case (rt_uint32_t)CM_TMRA_4:
  128. u32BusName = CLK_BUS_PCLK0;
  129. break;
  130. default:
  131. u32BusName = CLK_BUS_PCLK1; /* Uint5-12 */
  132. break;
  133. }
  134. #elif defined(HC32F460)
  135. u32BusName = CLK_BUS_PCLK1;
  136. #endif
  137. u32clkFreq = CLK_GetBusClockFreq(u32BusName);
  138. return (u32clkFreq ? u32clkFreq : HCLK_VALUE);
  139. }
  140. static rt_uint32_t tmra_get_clk_bydiv(CM_TMRA_TypeDef *TMRAx)
  141. {
  142. rt_uint32_t u32clkFreq;
  143. uint16_t u16Div;
  144. u32clkFreq = tmra_get_clk_notdiv(TMRAx);
  145. u16Div = (READ_REG16(TMRAx->BCSTRL) & TMRA_BCSTRL_CKDIV);
  146. switch (u16Div)
  147. {
  148. case (TMRA_CLK_DIV1):
  149. break;
  150. case (TMRA_CLK_DIV2):
  151. u32clkFreq /= 2;
  152. break;
  153. case (TMRA_CLK_DIV4):
  154. u32clkFreq /= 4;
  155. break;
  156. case (TMRA_CLK_DIV8):
  157. u32clkFreq /= 8;
  158. break;
  159. case (TMRA_CLK_DIV16):
  160. u32clkFreq /= 16;
  161. break;
  162. case (TMRA_CLK_DIV32):
  163. u32clkFreq /= 32;
  164. break;
  165. case (TMRA_CLK_DIV64):
  166. u32clkFreq /= 64;
  167. break;
  168. case (TMRA_CLK_DIV128):
  169. u32clkFreq /= 128;
  170. break;
  171. case (TMRA_CLK_DIV256):
  172. u32clkFreq /= 256;
  173. break;
  174. case (TMRA_CLK_DIV512):
  175. u32clkFreq /= 512;
  176. break;
  177. case (TMRA_CLK_DIV1024):
  178. u32clkFreq /= 1024;
  179. break;
  180. default:
  181. break;
  182. }
  183. return u32clkFreq;
  184. }
  185. static void tmra_duyt100or0_output(CM_TMRA_TypeDef *TMRAx, uint32_t channel, uint32_t CompareValue)
  186. {
  187. if ((TMRA_GetPeriodValue(TMRAx) + 1) == CompareValue)
  188. {
  189. TMRA_PWM_SetForcePolarity(TMRAx, channel, TMRA_PWM_FORCE_HIGH);
  190. }
  191. else if (CompareValue <= 1)
  192. {
  193. TMRA_PWM_SetForcePolarity(TMRAx, channel, TMRA_PWM_FORCE_LOW);
  194. }
  195. else
  196. {
  197. TMRA_PWM_SetForcePolarity(TMRAx, (channel), TMRA_PWM_FORCE_INVD);
  198. }
  199. }
  200. static rt_err_t tmra_pwm_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  201. {
  202. struct hc32_pwm_tmra *pwm = (struct hc32_pwm_tmra *)device;
  203. CM_TMRA_TypeDef *TMRAx = pwm->instance;
  204. rt_uint32_t compare_value = TMRA_GetCompareValue(TMRAx, configuration->channel) + 1;
  205. if (configuration->complementary)
  206. {
  207. return -RT_EPERM;
  208. }
  209. tmra_duyt100or0_output(TMRAx, configuration->channel, compare_value);
  210. if (enable)
  211. {
  212. TMRA_PWM_OutputCmd(TMRAx, configuration->channel, ENABLE);
  213. }
  214. else
  215. {
  216. TMRA_PWM_OutputCmd(TMRAx, configuration->channel, DISABLE);
  217. }
  218. return RT_EOK;
  219. }
  220. static rt_err_t tmra_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  221. {
  222. rt_uint32_t u32clkFreq;
  223. struct hc32_pwm_tmra *pwm = (struct hc32_pwm_tmra *)device;
  224. CM_TMRA_TypeDef *TMRAx = pwm->instance;
  225. u32clkFreq = tmra_get_clk_bydiv(TMRAx);
  226. configuration->period = (rt_uint64_t)1000000000UL * (TMRA_GetPeriodValue(TMRAx) + 1) / u32clkFreq;
  227. configuration->pulse = (rt_uint64_t)1000000000UL * (TMRA_GetCompareValue(TMRAx, configuration->channel) + 1) / u32clkFreq;
  228. return RT_EOK;
  229. }
  230. static rt_uint32_t tmra_auto_set_div(CM_TMRA_TypeDef *TMRAx, uint32_t period)
  231. {
  232. rt_uint8_t i;
  233. rt_uint32_t u32clkFreq, division;
  234. rt_uint64_t period_value;
  235. u32clkFreq = tmra_get_clk_notdiv(TMRAx);
  236. period_value = (rt_uint64_t)period * u32clkFreq / (rt_uint64_t)1000000000UL;
  237. if (!period_value)
  238. {
  239. return 0;
  240. }
  241. division = period_value / 0xFFFF + 1;
  242. for (i = 0; i <= 10; i++)
  243. {
  244. if (division == 1)
  245. {
  246. break;
  247. }
  248. division = division / 2 + division % 2;
  249. }
  250. if (i > 10)
  251. {
  252. return 0;
  253. }
  254. TMRA_SetClockDiv(TMRAx, i << TMRA_BCSTRL_CKDIV_POS);
  255. u32clkFreq = tmra_get_clk_bydiv(TMRAx);
  256. return u32clkFreq;
  257. }
  258. static rt_err_t tmra_pwm_set_period(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  259. {
  260. rt_uint32_t u32clkFreq;
  261. rt_uint32_t period_value, compare_value;
  262. rt_uint32_t *compare_value_channelx = (rt_uint32_t *)device->parent.user_data;
  263. struct hc32_pwm_tmra *pwm = (struct hc32_pwm_tmra *)device;
  264. CM_TMRA_TypeDef *TMRAx = pwm->instance;
  265. /* if need to modify the clock division */
  266. u32clkFreq = tmra_auto_set_div(TMRAx, configuration->period);
  267. if (!u32clkFreq)
  268. {
  269. return -RT_ERROR;
  270. }
  271. period_value = configuration->period * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  272. period_value = period_value > 1 ? period_value - 1 : 1;
  273. TMRA_SetPeriodValue(TMRAx, period_value);
  274. /* setting PeriodValue maybe change the div,so we need to recalculate the CompareValue */
  275. for (rt_uint32_t i = 0; i < TMRA_CHANNEL_NUM_MAX; i++)
  276. {
  277. if (pwm->channel & (0x01UL << i))
  278. {
  279. compare_value = (*(compare_value_channelx + i)) * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  280. compare_value = compare_value >= period_value ? period_value : compare_value > 1 ? compare_value - 1 : compare_value;
  281. TMRA_SetCompareValue(TMRAx, i, compare_value);
  282. tmra_duyt100or0_output(TMRAx, i, compare_value + 1);
  283. }
  284. }
  285. return RT_EOK;
  286. }
  287. static rt_err_t tmra_pwm_set_pulse(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  288. {
  289. rt_uint32_t u32clkFreq;
  290. rt_uint32_t compare_value, period_value;
  291. rt_uint32_t *compare_value_channel = (rt_uint32_t *)device->parent.user_data;
  292. struct hc32_pwm_tmra *pwm = (struct hc32_pwm_tmra *)device;
  293. CM_TMRA_TypeDef *TMRAx = pwm->instance;
  294. u32clkFreq = tmra_get_clk_bydiv(TMRAx);
  295. period_value = TMRA_GetPeriodValue(TMRAx) + 1;
  296. compare_value = configuration->pulse * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  297. compare_value = compare_value > period_value ? period_value - 1 : compare_value > 1 ? compare_value - 1 : compare_value;
  298. TMRA_SetCompareValue(TMRAx, configuration->channel, compare_value);
  299. tmra_duyt100or0_output(TMRAx, configuration->channel, compare_value + 1);
  300. *(compare_value_channel + configuration->channel) = configuration->pulse;
  301. return RT_EOK;
  302. }
  303. static rt_err_t tmra_pwm_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  304. {
  305. tmra_pwm_set_period(device, configuration);
  306. tmra_pwm_set_pulse(device, configuration);
  307. return RT_EOK;
  308. }
  309. static rt_err_t pwm_tmra_init(struct hc32_pwm_tmra *device)
  310. {
  311. CM_TMRA_TypeDef *TMRAx;
  312. uint32_t i;
  313. RT_ASSERT(device != RT_NULL);
  314. TMRAx = device->instance;
  315. TMRA_Init(TMRAx, &device->stcTmraInit);
  316. for (i = 0; i < TMRA_CHANNEL_NUM_MAX; i++)
  317. {
  318. if ((device->channel >> i) & 0x01)
  319. {
  320. TMRA_PWM_Init(TMRAx, i, &device->stcPwmInit);
  321. }
  322. }
  323. TMRA_Start(TMRAx);
  324. return RT_EOK;
  325. }
  326. static void pwm_tmra_get_channel(void)
  327. {
  328. #ifdef BSP_USING_PWM_TMRA_1
  329. #ifdef BSP_USING_PWM_TMRA_1_CH1
  330. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 0);
  331. #endif
  332. #ifdef BSP_USING_PWM_TMRA_1_CH2
  333. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 1);
  334. #endif
  335. #ifdef BSP_USING_PWM_TMRA_1_CH3
  336. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 2);
  337. #endif
  338. #ifdef BSP_USING_PWM_TMRA_1_CH4
  339. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 3);
  340. #endif
  341. #ifdef BSP_USING_PWM_TMRA_1_CH5
  342. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 4);
  343. #endif
  344. #ifdef BSP_USING_PWM_TMRA_1_CH6
  345. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 5);
  346. #endif
  347. #ifdef BSP_USING_PWM_TMRA_1_CH7
  348. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 6);
  349. #endif
  350. #ifdef BSP_USING_PWM_TMRA_1_CH8
  351. g_pwm_tmra_array[PWM_TMRA_1_INDEX].channel |= (1 << 7);
  352. #endif
  353. #endif
  354. #ifdef BSP_USING_PWM_TMRA_2
  355. #ifdef BSP_USING_PWM_TMRA_2_CH1
  356. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 0);
  357. #endif
  358. #ifdef BSP_USING_PWM_TMRA_2_CH2
  359. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 1);
  360. #endif
  361. #ifdef BSP_USING_PWM_TMRA_2_CH3
  362. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 2);
  363. #endif
  364. #ifdef BSP_USING_PWM_TMRA_2_CH4
  365. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 3);
  366. #endif
  367. #ifdef BSP_USING_PWM_TMRA_2_CH5
  368. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 4);
  369. #endif
  370. #ifdef BSP_USING_PWM_TMRA_2_CH6
  371. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 5);
  372. #endif
  373. #ifdef BSP_USING_PWM_TMRA_2_CH7
  374. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 6);
  375. #endif
  376. #ifdef BSP_USING_PWM_TMRA_2_CH8
  377. g_pwm_tmra_array[PWM_TMRA_2_INDEX].channel |= (1 << 7);
  378. #endif
  379. #endif
  380. #ifdef BSP_USING_PWM_TMRA_3
  381. #ifdef BSP_USING_PWM_TMRA_3_CH1
  382. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 0);
  383. #endif
  384. #ifdef BSP_USING_PWM_TMRA_3_CH2
  385. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 1);
  386. #endif
  387. #ifdef BSP_USING_PWM_TMRA_3_CH3
  388. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 2);
  389. #endif
  390. #ifdef BSP_USING_PWM_TMRA_3_CH4
  391. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 3);
  392. #endif
  393. #ifdef BSP_USING_PWM_TMRA_3_CH5
  394. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 4);
  395. #endif
  396. #ifdef BSP_USING_PWM_TMRA_3_CH6
  397. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 5);
  398. #endif
  399. #ifdef BSP_USING_PWM_TMRA_3_CH7
  400. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 6);
  401. #endif
  402. #ifdef BSP_USING_PWM_TMRA_3_CH8
  403. g_pwm_tmra_array[PWM_TMRA_3_INDEX].channel |= (1 << 7);
  404. #endif
  405. #endif
  406. #ifdef BSP_USING_PWM_TMRA_4
  407. #ifdef BSP_USING_PWM_TMRA_4_CH1
  408. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 0);
  409. #endif
  410. #ifdef BSP_USING_PWM_TMRA_4_CH2
  411. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 1);
  412. #endif
  413. #ifdef BSP_USING_PWM_TMRA_4_CH3
  414. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 2);
  415. #endif
  416. #ifdef BSP_USING_PWM_TMRA_4_CH4
  417. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 3);
  418. #endif
  419. #ifdef BSP_USING_PWM_TMRA_4_CH5
  420. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 4);
  421. #endif
  422. #ifdef BSP_USING_PWM_TMRA_4_CH6
  423. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 5);
  424. #endif
  425. #ifdef BSP_USING_PWM_TMRA_4_CH7
  426. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 6);
  427. #endif
  428. #ifdef BSP_USING_PWM_TMRA_4_CH8
  429. g_pwm_tmra_array[PWM_TMRA_4_INDEX].channel |= (1 << 7);
  430. #endif
  431. #endif
  432. #ifdef BSP_USING_PWM_TMRA_5
  433. #ifdef BSP_USING_PWM_TMRA_5_CH1
  434. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 0);
  435. #endif
  436. #ifdef BSP_USING_PWM_TMRA_5_CH2
  437. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 1);
  438. #endif
  439. #ifdef BSP_USING_PWM_TMRA_5_CH3
  440. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 2);
  441. #endif
  442. #ifdef BSP_USING_PWM_TMRA_5_CH4
  443. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 3);
  444. #endif
  445. #ifdef BSP_USING_PWM_TMRA_5_CH5
  446. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 4);
  447. #endif
  448. #ifdef BSP_USING_PWM_TMRA_5_CH6
  449. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 5);
  450. #endif
  451. #ifdef BSP_USING_PWM_TMRA_5_CH7
  452. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 6);
  453. #endif
  454. #ifdef BSP_USING_PWM_TMRA_5_CH8
  455. g_pwm_tmra_array[PWM_TMRA_5_INDEX].channel |= (1 << 7);
  456. #endif
  457. #endif
  458. #ifdef BSP_USING_PWM_TMRA_6
  459. #ifdef BSP_USING_PWM_TMRA_6_CH1
  460. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 0);
  461. #endif
  462. #ifdef BSP_USING_PWM_TMRA_6_CH2
  463. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 1);
  464. #endif
  465. #ifdef BSP_USING_PWM_TMRA_6_CH3
  466. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 2);
  467. #endif
  468. #ifdef BSP_USING_PWM_TMRA_6_CH4
  469. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 3);
  470. #endif
  471. #ifdef BSP_USING_PWM_TMRA_6_CH5
  472. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 4);
  473. #endif
  474. #ifdef BSP_USING_PWM_TMRA_6_CH6
  475. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 5);
  476. #endif
  477. #ifdef BSP_USING_PWM_TMRA_6_CH7
  478. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 6);
  479. #endif
  480. #ifdef BSP_USING_PWM_TMRA_6_CH8
  481. g_pwm_tmra_array[PWM_TMRA_6_INDEX].channel |= (1 << 7);
  482. #endif
  483. #endif
  484. #ifdef BSP_USING_PWM_TMRA_7
  485. #ifdef BSP_USING_PWM_TMRA_7_CH1
  486. g_pwm_tmra_array[PWM_TMRA_7_INDEX].channel |= (1 << 0);
  487. #endif
  488. #ifdef BSP_USING_PWM_TMRA_7_CH2
  489. g_pwm_tmra_array[PWM_TMRA_7_INDEX].channel |= (1 << 1);
  490. #endif
  491. #ifdef BSP_USING_PWM_TMRA_7_CH3
  492. g_pwm_tmra_array[PWM_TMRA_7_INDEX].channel |= (1 << 2);
  493. #endif
  494. #ifdef BSP_USING_PWM_TMRA_7_CH4
  495. g_pwm_tmra_array[PWM_TMRA_7_INDEX].channel |= (1 << 3);
  496. #endif
  497. #endif
  498. #ifdef BSP_USING_PWM_TMRA_8
  499. #ifdef BSP_USING_PWM_TMRA_8_CH1
  500. g_pwm_tmra_array[PWM_TMRA_8_INDEX].channel |= (1 << 0);
  501. #endif
  502. #ifdef BSP_USING_PWM_TMRA_8_CH2
  503. g_pwm_tmra_array[PWM_TMRA_8_INDEX].channel |= (1 << 1);
  504. #endif
  505. #ifdef BSP_USING_PWM_TMRA_8_CH3
  506. g_pwm_tmra_array[PWM_TMRA_8_INDEX].channel |= (1 << 2);
  507. #endif
  508. #ifdef BSP_USING_PWM_TMRA_8_CH4
  509. g_pwm_tmra_array[PWM_TMRA_8_INDEX].channel |= (1 << 3);
  510. #endif
  511. #endif
  512. #ifdef BSP_USING_PWM_TMRA_9
  513. #ifdef BSP_USING_PWM_TMRA_9_CH1
  514. g_pwm_tmra_array[PWM_TMRA_9_INDEX].channel |= (1 << 0);
  515. #endif
  516. #ifdef BSP_USING_PWM_TMRA_9_CH2
  517. g_pwm_tmra_array[PWM_TMRA_9_INDEX].channel |= (1 << 1);
  518. #endif
  519. #ifdef BSP_USING_PWM_TMRA_9_CH3
  520. g_pwm_tmra_array[PWM_TMRA_9_INDEX].channel |= (1 << 2);
  521. #endif
  522. #ifdef BSP_USING_PWM_TMRA_9_CH4
  523. g_pwm_tmra_array[PWM_TMRA_9_INDEX].channel |= (1 << 3);
  524. #endif
  525. #endif
  526. #ifdef BSP_USING_PWM_TMRA_10
  527. #ifdef BSP_USING_PWM_TMRA_10_CH1
  528. g_pwm_tmra_array[PWM_TMRA_10_INDEX].channel |= (1 << 0);
  529. #endif
  530. #ifdef BSP_USING_PWM_TMRA_10_CH2
  531. g_pwm_tmra_array[PWM_TMRA_10_INDEX].channel |= (1 << 1);
  532. #endif
  533. #ifdef BSP_USING_PWM_TMRA_10_CH3
  534. g_pwm_tmra_array[PWM_TMRA_10_INDEX].channel |= (1 << 2);
  535. #endif
  536. #ifdef BSP_USING_PWM_TMRA_10_CH4
  537. g_pwm_tmra_array[PWM_TMRA_10_INDEX].channel |= (1 << 3);
  538. #endif
  539. #endif
  540. #ifdef BSP_USING_PWM_TMRA_11
  541. #ifdef BSP_USING_PWM_TMRA_11_CH1
  542. g_pwm_tmra_array[PWM_TMRA_11_INDEX].channel |= (1 << 0);
  543. #endif
  544. #ifdef BSP_USING_PWM_TMRA_11_CH2
  545. g_pwm_tmra_array[PWM_TMRA_11_INDEX].channel |= (1 << 1);
  546. #endif
  547. #ifdef BSP_USING_PWM_TMRA_11_CH3
  548. g_pwm_tmra_array[PWM_TMRA_11_INDEX].channel |= (1 << 2);
  549. #endif
  550. #ifdef BSP_USING_PWM_TMRA_11_CH4
  551. g_pwm_tmra_array[PWM_TMRA_11_INDEX].channel |= (1 << 3);
  552. #endif
  553. #endif
  554. #ifdef BSP_USING_PWM_TMRA_12
  555. #ifdef BSP_USING_PWM_TMRA_12_CH1
  556. g_pwm_tmra_array[PWM_TMRA_12_INDEX].channel |= (1 << 0);
  557. #endif
  558. #ifdef BSP_USING_PWM_TMRA_12_CH2
  559. g_pwm_tmra_array[PWM_TMRA_12_INDEX].channel |= (1 << 1);
  560. #endif
  561. #ifdef BSP_USING_PWM_TMRA_12_CH3
  562. g_pwm_tmra_array[PWM_TMRA_12_INDEX].channel |= (1 << 2);
  563. #endif
  564. #ifdef BSP_USING_PWM_TMRA_12_CH4
  565. g_pwm_tmra_array[PWM_TMRA_12_INDEX].channel |= (1 << 3);
  566. #endif
  567. #endif
  568. }
  569. static void enable_tmra_unit_clk(void)
  570. {
  571. #ifdef BSP_USING_PWM_TMRA_1
  572. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_1, ENABLE);
  573. #endif
  574. #ifdef BSP_USING_PWM_TMRA_2
  575. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_2, ENABLE);
  576. #endif
  577. #ifdef BSP_USING_PWM_TMRA_3
  578. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_3, ENABLE);
  579. #endif
  580. #ifdef BSP_USING_PWM_TMRA_4
  581. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_4, ENABLE);
  582. #endif
  583. #ifdef BSP_USING_PWM_TMRA_5
  584. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_5, ENABLE);
  585. #endif
  586. #ifdef BSP_USING_PWM_TMRA_6
  587. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_6, ENABLE);
  588. #endif
  589. #ifdef BSP_USING_PWM_TMRA_7
  590. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_7, ENABLE);
  591. #endif
  592. #ifdef BSP_USING_PWM_TMRA_8
  593. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_8, ENABLE);
  594. #endif
  595. #ifdef BSP_USING_PWM_TMRA_9
  596. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_9, ENABLE);
  597. #endif
  598. #ifdef BSP_USING_PWM_TMRA_10
  599. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_10, ENABLE);
  600. #endif
  601. #ifdef BSP_USING_PWM_TMRA_11
  602. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_11, ENABLE);
  603. #endif
  604. #ifdef BSP_USING_PWM_TMRA_12
  605. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMRA_12, ENABLE);
  606. #endif
  607. }
  608. static rt_err_t _tmra_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  609. {
  610. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  611. if (!configuration->channel) return -RT_EINVAL;
  612. configuration->channel = (configuration->channel - 1) % TMRA_CHANNEL_NUM_MAX;
  613. switch (cmd)
  614. {
  615. case PWM_CMD_ENABLE:
  616. return tmra_pwm_enable(device, configuration, RT_TRUE);
  617. case PWM_CMD_DISABLE:
  618. return tmra_pwm_enable(device, configuration, RT_FALSE);
  619. case PWM_CMD_SET:
  620. return tmra_pwm_set(device, configuration);
  621. case PWM_CMD_GET:
  622. return tmra_pwm_get(device, configuration);
  623. case PWM_CMD_SET_PERIOD:
  624. return tmra_pwm_set_period(device, configuration);
  625. case PWM_CMD_SET_PULSE:
  626. return tmra_pwm_set_pulse(device, configuration);
  627. default:
  628. return -RT_EINVAL;
  629. }
  630. }
  631. static struct rt_pwm_ops _tmra_ops =
  632. {
  633. _tmra_pwm_control
  634. };
  635. #endif /* BSP_USING_PWM_TMRA */
  636. #if defined(BSP_USING_PWM_TMR4)
  637. #if defined (HC32F4A8) || defined (HC32F472) || defined (HC32F4A0) || defined (HC32F460)
  638. #define TMR4_CHANNEL_NUM_MAX 6U
  639. #elif defined (HC32F448) || defined (HC32F334)
  640. #define TMR4_CHANNEL_NUM_MAX 8U
  641. #endif
  642. enum
  643. {
  644. #ifdef BSP_USING_PWM_TMR4_1
  645. PWM_TMR4_1_INDEX,
  646. #endif
  647. #ifdef BSP_USING_PWM_TMR4_2
  648. PWM_TMR4_2_INDEX,
  649. #endif
  650. #ifdef BSP_USING_PWM_TMR4_3
  651. PWM_TMR4_3_INDEX,
  652. #endif
  653. PWM_TMR4_UNIT_NUM,
  654. };
  655. struct hc32_pwm_tmr4
  656. {
  657. struct rt_device_pwm pwm_device;
  658. char *name;
  659. CM_TMR4_TypeDef *instance;
  660. rt_uint32_t channel;
  661. rt_uint32_t PeriodValue;
  662. rt_uint32_t CompareValue[TMR4_CHANNEL_NUM_MAX];
  663. stc_tmr4_init_t stcTmr4Init;
  664. stc_tmr4_oc_init_t stcTmr4OcInit;
  665. stc_tmr4_pwm_init_t stcTmr4PwmInit;
  666. };
  667. static struct hc32_pwm_tmr4 g_pwm_tmr4_array[] =
  668. {
  669. #ifdef BSP_USING_PWM_TMR4_1
  670. PWM_TMR4_1_CONFIG,
  671. #endif
  672. #ifdef BSP_USING_PWM_TMR4_2
  673. PWM_TMR4_2_CONFIG,
  674. #endif
  675. #ifdef BSP_USING_PWM_TMR4_3
  676. PWM_TMR4_3_CONFIG,
  677. #endif
  678. };
  679. static rt_uint32_t tmr4_get_clk_notdiv(CM_TMR4_TypeDef *TMR4x)
  680. {
  681. rt_uint32_t u32clkFreq;
  682. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  683. u32clkFreq = CLK_GetBusClockFreq(CLK_BUS_PCLK0);
  684. #elif defined(HC32F460)
  685. u32clkFreq = CLK_GetBusClockFreq(CLK_BUS_PCLK1);
  686. #endif
  687. return (u32clkFreq ? u32clkFreq : HCLK_VALUE);
  688. }
  689. static rt_uint32_t tmr4_get_clk_bydiv(CM_TMR4_TypeDef *TMR4x)
  690. {
  691. rt_uint32_t u32clkFreq;
  692. uint16_t u16Div;
  693. u32clkFreq = tmr4_get_clk_notdiv(TMR4x);
  694. u16Div = (READ_REG16(TMR4x->CCSR) & TMR4_CCSR_CKDIV);
  695. switch (u16Div)
  696. {
  697. case (TMR4_CLK_DIV1):
  698. break;
  699. case (TMR4_CLK_DIV2):
  700. u32clkFreq /= 2;
  701. break;
  702. case (TMR4_CLK_DIV4):
  703. u32clkFreq /= 4;
  704. break;
  705. case (TMR4_CLK_DIV8):
  706. u32clkFreq /= 8;
  707. break;
  708. case (TMR4_CLK_DIV16):
  709. u32clkFreq /= 16;
  710. break;
  711. case (TMR4_CLK_DIV32):
  712. u32clkFreq /= 32;
  713. break;
  714. case (TMR4_CLK_DIV64):
  715. u32clkFreq /= 64;
  716. break;
  717. case (TMR4_CLK_DIV128):
  718. u32clkFreq /= 128;
  719. break;
  720. case (TMR4_CLK_DIV256):
  721. u32clkFreq /= 256;
  722. break;
  723. case (TMR4_CLK_DIV512):
  724. u32clkFreq /= 512;
  725. break;
  726. case (TMR4_CLK_DIV1024):
  727. u32clkFreq /= 1024;
  728. break;
  729. default:
  730. break;
  731. }
  732. return u32clkFreq;
  733. }
  734. static rt_err_t tmr4_pwm_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  735. {
  736. struct hc32_pwm_tmr4 *pwm = (struct hc32_pwm_tmr4 *)device;
  737. CM_TMR4_TypeDef *TMR4x = pwm->instance;
  738. if (configuration->complementary)
  739. {
  740. return -RT_EPERM;
  741. }
  742. if (enable)
  743. {
  744. TMR4_OC_Cmd(TMR4x, configuration->channel, ENABLE);
  745. }
  746. else
  747. {
  748. TMR4_OC_Cmd(TMR4x, configuration->channel, DISABLE);
  749. }
  750. return RT_EOK;
  751. }
  752. static rt_err_t tmr4_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  753. {
  754. rt_uint32_t u32clkFreq;
  755. struct hc32_pwm_tmr4 *pwm = (struct hc32_pwm_tmr4 *)device;
  756. CM_TMR4_TypeDef *TMR4x = pwm->instance;
  757. u32clkFreq = tmr4_get_clk_bydiv(TMR4x);
  758. configuration->period = (rt_uint64_t)1000000000UL * (TMR4_GetPeriodValue(TMR4x) + 1) / u32clkFreq;
  759. configuration->pulse = (rt_uint64_t)1000000000UL * (TMR4_OC_GetCompareValue(TMR4x, configuration->channel) + 1) / u32clkFreq;
  760. return RT_EOK;
  761. }
  762. static rt_uint32_t tmr4_auto_set_div(CM_TMR4_TypeDef *TMR4x, uint32_t period)
  763. {
  764. rt_uint8_t i;
  765. rt_uint32_t u32clkFreq, division;
  766. rt_uint64_t period_value;
  767. u32clkFreq = tmr4_get_clk_notdiv(TMR4x);
  768. period_value = (rt_uint64_t)period * u32clkFreq / (rt_uint64_t)1000000000UL;
  769. if (!period_value)
  770. {
  771. return 0;
  772. }
  773. division = period_value / 0xFFFF + 1;
  774. for (i = 0; i <= 10; i++)
  775. {
  776. if (division == 1)
  777. {
  778. break;
  779. }
  780. division = division / 2 + division % 2;
  781. }
  782. if (i > 10)
  783. {
  784. return 0;
  785. }
  786. TMR4_SetClockDiv(TMR4x, i << TMR4_CCSR_CKDIV_POS);
  787. u32clkFreq = tmr4_get_clk_bydiv(TMR4x);
  788. return u32clkFreq;
  789. }
  790. static rt_err_t tmr4_pwm_set_period(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  791. {
  792. rt_uint32_t u32clkFreq;
  793. rt_uint32_t period_value, compare_value;
  794. rt_uint32_t *compare_value_channelx = (rt_uint32_t *)device->parent.user_data;
  795. struct hc32_pwm_tmr4 *pwm = (struct hc32_pwm_tmr4 *)device;
  796. CM_TMR4_TypeDef *TMR4x = pwm->instance;
  797. u32clkFreq = tmr4_auto_set_div(TMR4x, configuration->period);
  798. if (!u32clkFreq)
  799. {
  800. return -RT_ERROR;
  801. }
  802. period_value = configuration->period * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  803. period_value = period_value > 1 ? period_value - 1 : 1;
  804. TMR4_SetPeriodValue(TMR4x, period_value);
  805. for (rt_uint32_t i = 0; i < TMR4_CHANNEL_NUM_MAX; i++)
  806. {
  807. if (pwm->channel & (0x01UL << i))
  808. {
  809. compare_value = (*(compare_value_channelx + i)) * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  810. compare_value = compare_value >= period_value ? period_value : compare_value > 1 ? compare_value - 1 : compare_value;
  811. TMR4_OC_SetCompareValue(TMR4x, i, compare_value);
  812. }
  813. }
  814. return RT_EOK;
  815. }
  816. static void tmr4_pwm_set_cmpmode(CM_TMR4_TypeDef *TMR4x, uint32_t channel)
  817. {
  818. un_tmr4_oc_ocmrh_t unTmr4OcOcmrh;
  819. un_tmr4_oc_ocmrl_t unTmr4OcOcmrl;
  820. uint32_t ch = channel % TMR4_CHANNEL_NUM_MAX;
  821. if (ch % 2)
  822. {
  823. /* TMR4 OC low channel: compare mode OCMR[31:0] 0x4A60 4A6F = b 0100 1010 0110 0000 0100 1010 0110 1111 */
  824. unTmr4OcOcmrl.OCMRx = 0x4A604A6FU;
  825. TMR4_OC_SetLowChCompareMode(TMR4x, ch, unTmr4OcOcmrl);
  826. }
  827. else
  828. {
  829. /* TMR4 OC high channel: compare mode OCMR[15:0] = 0x4A6F = b 0100 1010 0110 1111 */
  830. unTmr4OcOcmrh.OCMRx = 0x4A6F;
  831. TMR4_OC_SetHighChCompareMode(TMR4x, ch, unTmr4OcOcmrh);
  832. }
  833. }
  834. static rt_err_t tmr4_pwm_set_pulse(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  835. {
  836. rt_uint32_t u32clkFreq;
  837. rt_uint32_t compare_value, period_value;
  838. rt_uint32_t *compare_value_channelx = (rt_uint32_t *)device->parent.user_data;
  839. struct hc32_pwm_tmr4 *pwm = (struct hc32_pwm_tmr4 *)device;
  840. CM_TMR4_TypeDef *TMR4x = pwm->instance;
  841. u32clkFreq = tmr4_get_clk_bydiv(TMR4x);
  842. period_value = TMR4_GetPeriodValue(TMR4x) + 1;
  843. compare_value = (rt_uint64_t)configuration->pulse * u32clkFreq / (rt_uint64_t)1000000000;;
  844. compare_value = compare_value > period_value ? period_value - 1 : compare_value > 1 ? compare_value - 1 : compare_value;
  845. TMR4_OC_SetCompareValue(TMR4x, configuration->channel, compare_value);
  846. *(compare_value_channelx + configuration->channel) = configuration->pulse;
  847. return RT_EOK;
  848. }
  849. static rt_err_t tmr4_pwm_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  850. {
  851. tmr4_pwm_set_period(device, configuration);
  852. tmr4_pwm_set_pulse(device, configuration);
  853. return RT_EOK;
  854. }
  855. static void enable_tmr4_unit_clk(void)
  856. {
  857. #ifdef BSP_USING_PWM_TMR4_1
  858. #if defined(HC32F472) || defined (HC32F334)
  859. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4, ENABLE);
  860. #else
  861. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_1, ENABLE);
  862. #endif
  863. #endif
  864. #ifdef BSP_USING_PWM_TMR4_2
  865. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_2, ENABLE);
  866. #endif
  867. #ifdef BSP_USING_PWM_TMR4_3
  868. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR4_3, ENABLE);
  869. #endif
  870. }
  871. static rt_err_t pwm_tmr4_init(struct hc32_pwm_tmr4 *device)
  872. {
  873. CM_TMR4_TypeDef *TMR4x;
  874. uint32_t i;
  875. RT_ASSERT(device != RT_NULL);
  876. TMR4x = device->instance;
  877. TMR4_Init(TMR4x, &device->stcTmr4Init);
  878. for (i = 0; i < TMR4_CHANNEL_NUM_MAX; i++)
  879. {
  880. if ((device->channel >> i) & 0x01)
  881. {
  882. TMR4_OC_Init(TMR4x, i, &device->stcTmr4OcInit);
  883. TMR4_PWM_Init(TMR4x, (i >> 1), &device->stcTmr4PwmInit);
  884. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  885. TMR4_PWM_SetPortOutputMode(TMR4x, i, TMR4_PWM_PIN_OUTPUT_NORMAL);
  886. #endif
  887. tmr4_pwm_set_cmpmode(TMR4x, i);
  888. }
  889. }
  890. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  891. TMR4_PWM_MainOutputCmd(TMR4x, ENABLE);
  892. #endif
  893. TMR4_Start(TMR4x);
  894. return RT_EOK;
  895. }
  896. static void pwm_tmr4_get_channel(void)
  897. {
  898. #ifdef BSP_USING_PWM_TMR4_1
  899. #ifdef BSP_USING_PWM_TMR4_1_OUH
  900. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 0);
  901. #endif
  902. #ifdef BSP_USING_PWM_TMR4_1_OUL
  903. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 1);
  904. #endif
  905. #ifdef BSP_USING_PWM_TMR4_1_OVH
  906. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 2);
  907. #endif
  908. #ifdef BSP_USING_PWM_TMR4_1_OVL
  909. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 3);
  910. #endif
  911. #ifdef BSP_USING_PWM_TMR4_1_OWH
  912. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 4);
  913. #endif
  914. #ifdef BSP_USING_PWM_TMR4_1_OWL
  915. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 5);
  916. #endif
  917. #if defined (HC32F448) || defined (HC32F334)
  918. #ifdef BSP_USING_PWM_TMR4_1_OXH
  919. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 6);
  920. #endif
  921. #ifdef BSP_USING_PWM_TMR4_1_OXL
  922. g_pwm_tmr4_array[PWM_TMR4_1_INDEX].channel |= (1 << 7);
  923. #endif
  924. #endif
  925. #endif
  926. #ifdef BSP_USING_PWM_TMR4_2
  927. #ifdef BSP_USING_PWM_TMR4_2_OUH
  928. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 0);
  929. #endif
  930. #ifdef BSP_USING_PWM_TMR4_2_OUL
  931. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 1);
  932. #endif
  933. #ifdef BSP_USING_PWM_TMR4_2_OVH
  934. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 2);
  935. #endif
  936. #ifdef BSP_USING_PWM_TMR4_2_OVL
  937. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 3);
  938. #endif
  939. #ifdef BSP_USING_PWM_TMR4_2_OWH
  940. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 4);
  941. #endif
  942. #ifdef BSP_USING_PWM_TMR4_2_OWL
  943. g_pwm_tmr4_array[PWM_TMR4_2_INDEX].channel |= (1 << 5);
  944. #endif
  945. #endif
  946. #ifdef BSP_USING_PWM_TMR4_3
  947. #ifdef BSP_USING_PWM_TMR4_3_OUH
  948. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 0);
  949. #endif
  950. #ifdef BSP_USING_PWM_TMR4_3_OUL
  951. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 1);
  952. #endif
  953. #ifdef BSP_USING_PWM_TMR4_3_OVH
  954. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 2);
  955. #endif
  956. #ifdef BSP_USING_PWM_TMR4_3_OVL
  957. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 3);
  958. #endif
  959. #ifdef BSP_USING_PWM_TMR4_3_OWH
  960. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 4);
  961. #endif
  962. #ifdef BSP_USING_PWM_TMR4_3_OWL
  963. g_pwm_tmr4_array[PWM_TMR4_3_INDEX].channel |= (1 << 5);
  964. #endif
  965. #endif
  966. }
  967. static rt_err_t _tmr4_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  968. {
  969. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  970. if (!configuration->channel) return -RT_EPERM;
  971. configuration->channel = (configuration->channel - 1) % TMR4_CHANNEL_NUM_MAX;
  972. switch (cmd)
  973. {
  974. case PWM_CMD_ENABLE:
  975. return tmr4_pwm_enable(device, configuration, RT_TRUE);
  976. case PWM_CMD_DISABLE:
  977. return tmr4_pwm_enable(device, configuration, RT_FALSE);
  978. case PWM_CMD_SET:
  979. return tmr4_pwm_set(device, configuration);
  980. case PWM_CMD_GET:
  981. return tmr4_pwm_get(device, configuration);
  982. case PWM_CMD_SET_PERIOD:
  983. return tmr4_pwm_set_period(device, configuration);
  984. case PWM_CMD_SET_PULSE:
  985. return tmr4_pwm_set_pulse(device, configuration);
  986. default:
  987. return -RT_EINVAL;
  988. }
  989. }
  990. static struct rt_pwm_ops _tmr4_ops =
  991. {
  992. _tmr4_pwm_control
  993. };
  994. #endif /* BSP_USING_PWM_TMR4 */
  995. #if defined(BSP_USING_PWM_TMR6)
  996. #define TMR6_CHANNEL_NUM_MAX 2U
  997. enum
  998. {
  999. #ifdef BSP_USING_PWM_TMR6_1
  1000. PWM_TMR6_1_INDEX,
  1001. #endif
  1002. #ifdef BSP_USING_PWM_TMR6_2
  1003. PWM_TMR6_2_INDEX,
  1004. #endif
  1005. #ifdef BSP_USING_PWM_TMR6_3
  1006. PWM_TMR6_3_INDEX,
  1007. #endif
  1008. #ifdef BSP_USING_PWM_TMR6_4
  1009. PWM_TMR6_4_INDEX,
  1010. #endif
  1011. #ifdef BSP_USING_PWM_TMR6_5
  1012. PWM_TMR6_5_INDEX,
  1013. #endif
  1014. #ifdef BSP_USING_PWM_TMR6_6
  1015. PWM_TMR6_6_INDEX,
  1016. #endif
  1017. #ifdef BSP_USING_PWM_TMR6_7
  1018. PWM_TMR6_7_INDEX,
  1019. #endif
  1020. #ifdef BSP_USING_PWM_TMR6_8
  1021. PWM_TMR6_8_INDEX,
  1022. #endif
  1023. #ifdef BSP_USING_PWM_TMR6_9
  1024. PWM_TMR6_9_INDEX,
  1025. #endif
  1026. #ifdef BSP_USING_PWM_TMR6_10
  1027. PWM_TMR6_10_INDEX,
  1028. #endif
  1029. PWM_TMR6_UNIT_NUM,
  1030. };
  1031. struct hc32_pwm_tmr6
  1032. {
  1033. struct rt_device_pwm pwm_device;
  1034. char *name;
  1035. CM_TMR6_TypeDef *instance;
  1036. rt_uint32_t channel;
  1037. stc_tmr6_init_t stcTmr6Init;
  1038. stc_tmr6_pwm_init_t stcPwmInit[TMR6_CHANNEL_NUM_MAX];
  1039. rt_bool_t complementary[TMR6_CHANNEL_NUM_MAX];
  1040. };
  1041. static struct hc32_pwm_tmr6 g_pwm_tmr6_array[] =
  1042. {
  1043. #ifdef BSP_USING_PWM_TMR6_1
  1044. PWM_TMR6_1_CONFIG,
  1045. #endif
  1046. #ifdef BSP_USING_PWM_TMR6_2
  1047. PWM_TMR6_2_CONFIG,
  1048. #endif
  1049. #ifdef BSP_USING_PWM_TMR6_3
  1050. PWM_TMR6_3_CONFIG,
  1051. #endif
  1052. #ifdef BSP_USING_PWM_TMR6_4
  1053. PWM_TMR6_4_CONFIG,
  1054. #endif
  1055. #ifdef BSP_USING_PWM_TMR6_5
  1056. PWM_TMR6_5_CONFIG,
  1057. #endif
  1058. #ifdef BSP_USING_PWM_TMR6_6
  1059. PWM_TMR6_6_CONFIG,
  1060. #endif
  1061. #ifdef BSP_USING_PWM_TMR6_7
  1062. PWM_TMR6_7_CONFIG,
  1063. #endif
  1064. #ifdef BSP_USING_PWM_TMR6_8
  1065. PWM_TMR6_8_CONFIG,
  1066. #endif
  1067. #ifdef BSP_USING_PWM_TMR6_9
  1068. PWM_TMR6_9_CONFIG,
  1069. #endif
  1070. #ifdef BSP_USING_PWM_TMR6_10
  1071. PWM_TMR6_10_CONFIG,
  1072. #endif
  1073. };
  1074. static rt_uint32_t tmr6_get_clk_notdiv(CM_TMR6_TypeDef *TMR6x)
  1075. {
  1076. rt_uint32_t u32clkFreq;
  1077. u32clkFreq = CLK_GetBusClockFreq(CLK_BUS_PCLK0);
  1078. return (u32clkFreq ? u32clkFreq : HCLK_VALUE);
  1079. }
  1080. static rt_uint32_t tmr6_get_clk_bydiv(CM_TMR6_TypeDef *TMR6x)
  1081. {
  1082. rt_uint32_t u32clkFreq;
  1083. uint16_t u16Div;
  1084. u32clkFreq = tmr6_get_clk_notdiv(TMR6x);
  1085. u16Div = (READ_REG16(TMR6x->GCONR) & TMR6_GCONR_CKDIV);
  1086. switch (u16Div)
  1087. {
  1088. case (TMR6_CLK_DIV1):
  1089. break;
  1090. case (TMR6_CLK_DIV2):
  1091. u32clkFreq /= 2;
  1092. break;
  1093. case (TMR6_CLK_DIV4):
  1094. u32clkFreq /= 4;
  1095. break;
  1096. case (TMR6_CLK_DIV8):
  1097. u32clkFreq /= 8;
  1098. break;
  1099. case (TMR6_CLK_DIV16):
  1100. u32clkFreq /= 16;
  1101. break;
  1102. case (TMR6_CLK_DIV64):
  1103. u32clkFreq /= 64;
  1104. break;
  1105. case (TMR6_CLK_DIV256):
  1106. u32clkFreq /= 256;
  1107. break;
  1108. case (TMR6_CLK_DIV1024):
  1109. u32clkFreq /= 1024;
  1110. break;
  1111. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  1112. case (TMR6_CLK_DIV32):
  1113. u32clkFreq /= 32;
  1114. break;
  1115. case (TMR6_CLK_DIV128):
  1116. u32clkFreq /= 128;
  1117. break;
  1118. case (TMR6_CLK_DIV512):
  1119. u32clkFreq /= 512;
  1120. break;
  1121. #endif
  1122. default:
  1123. break;
  1124. }
  1125. return u32clkFreq;
  1126. }
  1127. static void tmr6_duyt100or0_output(CM_TMR6_TypeDef *TMR6x, rt_uint32_t channel, rt_uint32_t compare_value)
  1128. {
  1129. if (compare_value <= 1)
  1130. {
  1131. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  1132. TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_OVF, TMR6_PWM_LOW);
  1133. #elif defined(HC32F460)
  1134. TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_MATCH_PERIOD, TMR6_PWM_LOW);
  1135. #endif
  1136. }
  1137. else
  1138. {
  1139. #if defined(HC32F4A0) || defined(HC32F448) || defined(HC32F472) || defined(HC32F4A8) || defined (HC32F334)
  1140. TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_OVF, TMR6_PWM_HIGH);
  1141. #elif defined(HC32F460)
  1142. TMR6_PWM_SetPolarity(TMR6x, channel, TMR6_STAT_MATCH_PERIOD, TMR6_PWM_HIGH);
  1143. #endif
  1144. }
  1145. }
  1146. static rt_err_t tmr6_pwm_enable(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration, rt_bool_t enable)
  1147. {
  1148. rt_uint32_t compare_value;
  1149. struct hc32_pwm_tmr6 *pwm = (struct hc32_pwm_tmr6 *)device;
  1150. CM_TMR6_TypeDef *TMR6x = pwm->instance;
  1151. if (configuration->complementary)
  1152. {
  1153. return -RT_EPERM;
  1154. }
  1155. compare_value = TMR6_GetCompareValue(TMR6x, configuration->channel) + 1;
  1156. tmr6_duyt100or0_output(TMR6x, configuration->channel, compare_value);
  1157. if (enable)
  1158. {
  1159. TMR6_PWM_OutputCmd(TMR6x, configuration->channel, ENABLE);
  1160. }
  1161. else
  1162. {
  1163. TMR6_PWM_OutputCmd(TMR6x, configuration->channel, DISABLE);
  1164. }
  1165. return RT_EOK;
  1166. }
  1167. static rt_err_t tmr6_pwm_get(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  1168. {
  1169. rt_uint32_t u32clkFreq;
  1170. struct hc32_pwm_tmr6 *pwm = (struct hc32_pwm_tmr6 *)device;
  1171. CM_TMR6_TypeDef *TMR6x = pwm->instance;
  1172. u32clkFreq = tmr6_get_clk_bydiv(TMR6x);
  1173. configuration->period = (rt_uint64_t)1000000000UL * (TMR6_GetPeriodValue(TMR6x, TMR6_PERIOD_REG_A) + 1) / u32clkFreq;
  1174. configuration->pulse = (rt_uint64_t)1000000000UL * (TMR6_GetCompareValue(TMR6x, configuration->channel) + 1) / u32clkFreq;
  1175. return RT_EOK;
  1176. }
  1177. static rt_uint32_t tmr6_auto_set_div(CM_TMR6_TypeDef *TMR6x, uint32_t period)
  1178. {
  1179. rt_uint8_t i;
  1180. rt_uint32_t u32clkFreq, division;
  1181. rt_uint64_t period_value;
  1182. u32clkFreq = tmr6_get_clk_notdiv(TMR6x);
  1183. period_value = (rt_uint64_t)period * u32clkFreq / (rt_uint64_t)1000000000UL;
  1184. if (!period_value)
  1185. {
  1186. return 0;
  1187. }
  1188. division = period_value / 0xFFFF + 1;
  1189. for (i = 0; i <= 10; i++)
  1190. {
  1191. if (division == 1)
  1192. {
  1193. break;
  1194. }
  1195. division = division / 2 + division % 2;
  1196. }
  1197. if (i > 10)
  1198. {
  1199. return 0;
  1200. }
  1201. TMR6_SetClockDiv(TMR6x, i << TMR6_GCONR_CKDIV_POS);
  1202. u32clkFreq = tmr6_get_clk_bydiv(TMR6x);
  1203. return u32clkFreq;
  1204. }
  1205. static rt_err_t tmr6_pwm_set_period(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  1206. {
  1207. rt_uint8_t i;
  1208. rt_uint32_t compare_value, period_value;
  1209. stc_tmr6_pwm_init_t *pwm_init_t = (stc_tmr6_pwm_init_t *)device->parent.user_data;
  1210. struct hc32_pwm_tmr6 *pwm = (struct hc32_pwm_tmr6 *)device;
  1211. CM_TMR6_TypeDef *TMR6x = pwm->instance;
  1212. rt_uint32_t u32clkFreq = tmr6_auto_set_div(TMR6x, configuration->period);
  1213. if (!u32clkFreq)
  1214. {
  1215. return -RT_ERROR;
  1216. }
  1217. period_value = configuration->period * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  1218. period_value = period_value > 1 ? period_value - 1 : 1;
  1219. TMR6_SetPeriodValue(TMR6x, TMR6_PERIOD_REG_A, period_value);
  1220. for (i = 0; i < TMR6_CHANNEL_NUM_MAX; i++)
  1221. {
  1222. if (pwm->channel & (0x01UL << i))
  1223. {
  1224. compare_value = (pwm_init_t + i)->u32CompareValue * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  1225. compare_value = compare_value >= period_value ? period_value : compare_value > 1 ? compare_value - 1 : compare_value;
  1226. TMR6_SetCompareValue(TMR6x, i, compare_value);
  1227. tmr6_duyt100or0_output(TMR6x, i, compare_value + 1);
  1228. }
  1229. }
  1230. return RT_EOK;
  1231. }
  1232. static rt_err_t tmr6_pwm_set_pulse(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  1233. {
  1234. rt_uint32_t u32clkFreq;
  1235. rt_uint32_t compare_value, period_value;
  1236. stc_tmr6_pwm_init_t *pwm_init_t = (stc_tmr6_pwm_init_t *)device->parent.user_data;
  1237. struct hc32_pwm_tmr6 *pwm = (struct hc32_pwm_tmr6 *)device;
  1238. CM_TMR6_TypeDef *TMR6x = pwm->instance;
  1239. u32clkFreq = tmr6_get_clk_bydiv(TMR6x);
  1240. period_value = TMR6_GetPeriodValue(TMR6x, TMR6_PERIOD_REG_A) + 1;
  1241. compare_value = configuration->pulse * (rt_uint64_t)u32clkFreq / (rt_uint64_t)1000000000;
  1242. compare_value = compare_value > period_value ? period_value - 1 : compare_value > 1 ? compare_value - 1 : compare_value;
  1243. TMR6_SetCompareValue(TMR6x, configuration->channel, compare_value);
  1244. tmr6_duyt100or0_output(TMR6x, configuration->channel, compare_value + 1);
  1245. (pwm_init_t + configuration->channel)->u32CompareValue = configuration->pulse;
  1246. return RT_EOK;
  1247. }
  1248. static rt_err_t tmr6_pwm_set(struct rt_device_pwm *device, struct rt_pwm_configuration *configuration)
  1249. {
  1250. tmr6_pwm_set_period(device, configuration);
  1251. tmr6_pwm_set_pulse(device, configuration);
  1252. return RT_EOK;
  1253. }
  1254. static void enable_tmr6_unit_clk(void)
  1255. {
  1256. #ifdef BSP_USING_PWM_TMR6_1
  1257. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_1, ENABLE);
  1258. #endif
  1259. #ifdef BSP_USING_PWM_TMR6_2
  1260. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_2, ENABLE);
  1261. #endif
  1262. #ifdef BSP_USING_PWM_TMR6_3
  1263. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_3, ENABLE);
  1264. #endif
  1265. #ifdef BSP_USING_PWM_TMR6_4
  1266. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_4, ENABLE);
  1267. #endif
  1268. #ifdef BSP_USING_PWM_TMR6_5
  1269. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_5, ENABLE);
  1270. #endif
  1271. #ifdef BSP_USING_PWM_TMR6_6
  1272. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_6, ENABLE);
  1273. #endif
  1274. #ifdef BSP_USING_PWM_TMR6_7
  1275. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_7, ENABLE);
  1276. #endif
  1277. #ifdef BSP_USING_PWM_TMR6_8
  1278. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_8, ENABLE);
  1279. #endif
  1280. #ifdef BSP_USING_PWM_TMR6_9
  1281. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_9, ENABLE);
  1282. #endif
  1283. #ifdef BSP_USING_PWM_TMR6_10
  1284. FCG_Fcg2PeriphClockCmd(FCG2_PERIPH_TMR6_10, ENABLE);
  1285. #endif
  1286. }
  1287. static rt_err_t pwm_tmr6_init(struct hc32_pwm_tmr6 *device)
  1288. {
  1289. CM_TMR6_TypeDef *TMR6x;
  1290. uint32_t i;
  1291. RT_ASSERT(device != RT_NULL);
  1292. TMR6x = device->instance;
  1293. TMR6_Init(TMR6x, &device->stcTmr6Init);
  1294. for (i = 0; i < TMR6_CHANNEL_NUM_MAX; i++)
  1295. {
  1296. if ((device->channel >> i) & 0x01)
  1297. {
  1298. TMR6_PWM_Init(TMR6x, i, &device->stcPwmInit[i]);
  1299. }
  1300. }
  1301. TMR6_Start(TMR6x);
  1302. return RT_EOK;
  1303. }
  1304. static void pwm_tmr6_get_channel(void)
  1305. {
  1306. #ifdef BSP_USING_PWM_TMR6_1
  1307. #ifdef BSP_USING_PWM_TMR6_1_A
  1308. g_pwm_tmr6_array[PWM_TMR6_1_INDEX].channel |= (1 << 0);
  1309. #endif
  1310. #ifdef BSP_USING_PWM_TMR6_1_B
  1311. g_pwm_tmr6_array[PWM_TMR6_1_INDEX].channel |= (1 << 1);
  1312. #endif
  1313. #endif
  1314. #ifdef BSP_USING_PWM_TMR6_2
  1315. #ifdef BSP_USING_PWM_TMR6_2_A
  1316. g_pwm_tmr6_array[PWM_TMR6_2_INDEX].channel |= (1 << 0);
  1317. #endif
  1318. #ifdef BSP_USING_PWM_TMR6_2_B
  1319. g_pwm_tmr6_array[PWM_TMR6_2_INDEX].channel |= (1 << 1);
  1320. #endif
  1321. #endif
  1322. #ifdef BSP_USING_PWM_TMR6_3
  1323. #ifdef BSP_USING_PWM_TMR6_3_A
  1324. g_pwm_tmr6_array[PWM_TMR6_3_INDEX].channel |= (1 << 0);
  1325. #endif
  1326. #ifdef BSP_USING_PWM_TMR6_3_B
  1327. g_pwm_tmr6_array[PWM_TMR6_3_INDEX].channel |= (1 << 1);
  1328. #endif
  1329. #endif
  1330. #ifdef BSP_USING_PWM_TMR6_4
  1331. #ifdef BSP_USING_PWM_TMR6_4_A
  1332. g_pwm_tmr6_array[PWM_TMR6_4_INDEX].channel |= (1 << 0);
  1333. #endif
  1334. #ifdef BSP_USING_PWM_TMR6_4_B
  1335. g_pwm_tmr6_array[PWM_TMR6_4_INDEX].channel |= (1 << 1);
  1336. #endif
  1337. #endif
  1338. #ifdef BSP_USING_PWM_TMR6_5
  1339. #ifdef BSP_USING_PWM_TMR6_5_A
  1340. g_pwm_tmr6_array[PWM_TMR6_5_INDEX].channel |= (1 << 0);
  1341. #endif
  1342. #ifdef BSP_USING_PWM_TMR6_5_B
  1343. g_pwm_tmr6_array[PWM_TMR6_5_INDEX].channel |= (1 << 1);
  1344. #endif
  1345. #endif
  1346. #ifdef BSP_USING_PWM_TMR6_6
  1347. #ifdef BSP_USING_PWM_TMR6_6_A
  1348. g_pwm_tmr6_array[PWM_TMR6_6_INDEX].channel |= (1 << 0);
  1349. #endif
  1350. #ifdef BSP_USING_PWM_TMR6_6_B
  1351. g_pwm_tmr6_array[PWM_TMR6_6_INDEX].channel |= (1 << 1);
  1352. #endif
  1353. #endif
  1354. #ifdef BSP_USING_PWM_TMR6_7
  1355. #ifdef BSP_USING_PWM_TMR6_7_A
  1356. g_pwm_tmr6_array[PWM_TMR6_7_INDEX].channel |= (1 << 0);
  1357. #endif
  1358. #ifdef BSP_USING_PWM_TMR6_7_B
  1359. g_pwm_tmr6_array[PWM_TMR6_7_INDEX].channel |= (1 << 1);
  1360. #endif
  1361. #endif
  1362. #ifdef BSP_USING_PWM_TMR6_8
  1363. #ifdef BSP_USING_PWM_TMR6_8_A
  1364. g_pwm_tmr6_array[PWM_TMR6_8_INDEX].channel |= (1 << 0);
  1365. #endif
  1366. #ifdef BSP_USING_PWM_TMR6_8_B
  1367. g_pwm_tmr6_array[PWM_TMR6_8_INDEX].channel |= (1 << 1);
  1368. #endif
  1369. #endif
  1370. #ifdef BSP_USING_PWM_TMR6_9
  1371. #ifdef BSP_USING_PWM_TMR6_9_A
  1372. g_pwm_tmr6_array[PWM_TMR6_9_INDEX].channel |= (1 << 0);
  1373. #endif
  1374. #ifdef BSP_USING_PWM_TMR6_9_B
  1375. g_pwm_tmr6_array[PWM_TMR6_9_INDEX].channel |= (1 << 1);
  1376. #endif
  1377. #endif
  1378. #ifdef BSP_USING_PWM_TMR6_10
  1379. #ifdef BSP_USING_PWM_TMR6_10_A
  1380. g_pwm_tmr6_array[PWM_TMR6_10_INDEX].channel |= (1 << 0);
  1381. #endif
  1382. #ifdef BSP_USING_PWM_TMR6_10_B
  1383. g_pwm_tmr6_array[PWM_TMR6_10_INDEX].channel |= (1 << 1);
  1384. #endif
  1385. #endif
  1386. }
  1387. static rt_err_t _tmr6_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
  1388. {
  1389. struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg;
  1390. if (!configuration->channel) return -RT_EINVAL;
  1391. configuration->channel = (configuration->channel - 1) % TMR6_CHANNEL_NUM_MAX;
  1392. switch (cmd)
  1393. {
  1394. case PWM_CMD_ENABLE:
  1395. return tmr6_pwm_enable(device, configuration, RT_TRUE);
  1396. case PWM_CMD_DISABLE:
  1397. return tmr6_pwm_enable(device, configuration, RT_FALSE);
  1398. case PWM_CMD_SET:
  1399. return tmr6_pwm_set(device, configuration);
  1400. case PWM_CMD_GET:
  1401. return tmr6_pwm_get(device, configuration);
  1402. case PWM_CMD_SET_PERIOD:
  1403. return tmr6_pwm_set_period(device, configuration);
  1404. case PWM_CMD_SET_PULSE:
  1405. return tmr6_pwm_set_pulse(device, configuration);
  1406. default:
  1407. return -RT_EINVAL;
  1408. }
  1409. }
  1410. static struct rt_pwm_ops _tmr6_ops =
  1411. {
  1412. _tmr6_pwm_control
  1413. };
  1414. #endif /* BSP_USING_PWM_TMR6 */
  1415. static int rt_hw_pwm_tmr_init(void)
  1416. {
  1417. int i = 0;
  1418. rt_err_t result = RT_EOK;
  1419. #if defined(BSP_USING_PWM_TMRA)
  1420. pwm_tmra_get_channel();
  1421. enable_tmra_unit_clk();
  1422. for (i = 0; i < sizeof(g_pwm_tmra_array) / sizeof(g_pwm_tmra_array[0]); i++)
  1423. {
  1424. /* pwm init */
  1425. pwm_tmra_init(&g_pwm_tmra_array[i]);
  1426. /* gpio init */
  1427. extern rt_err_t rt_hw_board_pwm_tmra_init(CM_TMRA_TypeDef * TMRAx);
  1428. rt_hw_board_pwm_tmra_init(g_pwm_tmra_array[i].instance);
  1429. /* register pwm device */
  1430. result = rt_device_pwm_register(&g_pwm_tmra_array[i].pwm_device, g_pwm_tmra_array[i].name, &_tmra_ops, &g_pwm_tmra_array[i].CompareValue[0]);
  1431. RT_ASSERT(result == RT_EOK);
  1432. }
  1433. #endif
  1434. #if defined(BSP_USING_PWM_TMR4)
  1435. pwm_tmr4_get_channel();
  1436. enable_tmr4_unit_clk();
  1437. for (i = 0; i < sizeof(g_pwm_tmr4_array) / sizeof(g_pwm_tmr4_array[0]); i++)
  1438. {
  1439. /* pwm init */
  1440. pwm_tmr4_init(&g_pwm_tmr4_array[i]);
  1441. /* gpio init */
  1442. extern rt_err_t rt_hw_board_pwm_tmr4_init(CM_TMR4_TypeDef * TMR4x);
  1443. rt_hw_board_pwm_tmr4_init(g_pwm_tmr4_array[i].instance);
  1444. /* register pwm device */
  1445. result = rt_device_pwm_register(&g_pwm_tmr4_array[i].pwm_device, g_pwm_tmr4_array[i].name, &_tmr4_ops, &g_pwm_tmr4_array[i].CompareValue[0]);
  1446. RT_ASSERT(result == RT_EOK);
  1447. }
  1448. #endif
  1449. #if defined(BSP_USING_PWM_TMR6)
  1450. pwm_tmr6_get_channel();
  1451. enable_tmr6_unit_clk();
  1452. for (i = 0; i < sizeof(g_pwm_tmr6_array) / sizeof(g_pwm_tmr6_array[0]); i++)
  1453. {
  1454. /* pwm init */
  1455. pwm_tmr6_init(&g_pwm_tmr6_array[i]);
  1456. /* gpio init */
  1457. extern rt_err_t rt_hw_board_pwm_tmr6_init(CM_TMR6_TypeDef * TMR6x);
  1458. rt_hw_board_pwm_tmr6_init(g_pwm_tmr6_array[i].instance);
  1459. /* register pwm device */
  1460. result = rt_device_pwm_register(&g_pwm_tmr6_array[i].pwm_device, g_pwm_tmr6_array[i].name, &_tmr6_ops, &g_pwm_tmr6_array[i].stcPwmInit[0]);
  1461. RT_ASSERT(result == RT_EOK);
  1462. }
  1463. #endif
  1464. return result;
  1465. }
  1466. INIT_DEVICE_EXPORT(rt_hw_pwm_tmr_init);
  1467. #endif /* BSP_USING_PWM */