lib_pwm.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. /**
  2. ******************************************************************************
  3. * @file lib_pwm.c
  4. * @author Application Team
  5. * @version V1.1.0
  6. * @date 2019-10-28
  7. * @brief PWM library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_pwm.h"
  14. /**
  15. * @brief Initializes PWM timebase.
  16. * @param PWMx: PWM0~PWM3
  17. InitStruct:PWM BASE configuration.
  18. ClockDivision:
  19. PWM_CLKDIV_2
  20. PWM_CLKDIV_4
  21. PWM_CLKDIV_8
  22. PWM_CLKDIV_16
  23. Mode:
  24. PWM_MODE_STOP
  25. PWM_MODE_UPCOUNT
  26. PWM_MODE_CONTINUOUS
  27. PWM_MODE_UPDOWN
  28. ClockSource:
  29. PWM_CLKSRC_APB
  30. PWM_CLKSRC_APBD128
  31. * @retval None
  32. */
  33. void PWM_BaseInit(PWM_Type *PWMx, PWM_BaseInitType *InitStruct)
  34. {
  35. uint32_t tmp;
  36. /* Check parameters */
  37. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  38. assert_parameters(IS_PWM_CLKDIV(InitStruct->ClockDivision));
  39. assert_parameters(IS_PWM_CNTMODE(InitStruct->Mode));
  40. assert_parameters(IS_PWM_CLKSRC(InitStruct->ClockSource));
  41. tmp = PWMx->CTL;
  42. tmp &= ~(PWM_CTL_ID\
  43. |PWM_CTL_MC\
  44. |PWM_CTL_TSEL);
  45. tmp |= (InitStruct->ClockDivision\
  46. |InitStruct->Mode\
  47. |InitStruct->ClockSource);
  48. PWMx->CTL = tmp;
  49. }
  50. /**
  51. * @brief Fills each PWM_BaseInitType member with its default value.
  52. * @param InitStruct: pointer to an PWM_BaseInitType structure which will be initialized.
  53. * @retval None
  54. */
  55. void PWM_BaseStructInit(PWM_BaseInitType *InitStruct)
  56. {
  57. /*------------ Reset PWM base init structure parameters values ------------*/
  58. /* Initialize the ClockDivision member */
  59. InitStruct->ClockDivision = PWM_CLKDIV_2;
  60. /* Initialize the ClockSource member */
  61. InitStruct->ClockSource = PWM_CLKSRC_APBD128;
  62. /* Initialize the Mode member */
  63. InitStruct->Mode = PWM_MODE_STOP;
  64. }
  65. /**
  66. * @brief Fills each PWM_OCInitType member with its default value.
  67. * @param OCInitType: pointer to an PWM_OCInitType structure which will be initialized.
  68. * @retval None
  69. */
  70. void PWM_OCStructInit(PWM_OCInitType *OCInitType)
  71. {
  72. /*------- Reset PWM output channel init structure parameters values --------*/
  73. /* Initialize the Channel member */
  74. OCInitType->Channel = PWM_CHANNEL_0;
  75. /* Initialize the OutMode member */
  76. OCInitType->OutMode = PWM_OUTMOD_CONST;
  77. /* Initialize the Period member */
  78. OCInitType->Period = 0;
  79. }
  80. /**
  81. * @brief Initializes PWM channel output compare function.
  82. * @param PWMx: PWM0~PWM3
  83. OCInitType:PWM output compare configuration.
  84. Channel:
  85. PWM_CHANNEL_0
  86. PWM_CHANNEL_1
  87. PWM_CHANNEL_2
  88. OutMode:
  89. PWM_OUTMOD_CONST
  90. PWM_OUTMOD_SET
  91. PWM_OUTMOD_TOGGLE_RESET
  92. PWM_OUTMOD_SET_RESET
  93. PWM_OUTMOD_TOGGLE
  94. PWM_OUTMOD_RESET
  95. PWM_OUTMOD_TOGGLE_SET
  96. PWM_OUTMOD_RESET_SET
  97. Period: 0 ~ 0xFFFF
  98. * @retval None
  99. */
  100. void PWM_OCInit(PWM_Type *PWMx, PWM_OCInitType *OCInitType)
  101. {
  102. uint32_t tmp;
  103. /* Check parameters */
  104. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  105. assert_parameters(IS_PWM_CHANNEL(OCInitType->Channel));
  106. assert_parameters(IS_PWM_OUTMODE(OCInitType->OutMode));
  107. assert_parameters(IS_PWM_CCR(OCInitType->Period));
  108. tmp = PWMx->CCTL[OCInitType->Channel];
  109. tmp &= ~(PWM_CCTL_CAP | PWM_CCTL_OUTMOD | PWM_CCTL_CCIFG | PWM_CCTL_COV);
  110. tmp |= OCInitType->OutMode;
  111. PWMx->CCTL[OCInitType->Channel] = tmp;
  112. PWMx->CCR[OCInitType->Channel] = OCInitType->Period;
  113. }
  114. /**
  115. * @brief Fills each PWM_ICInitType member with its default value.
  116. * @param ICInitType: pointer to a PWM_OCInitType structure which will be initialized.
  117. * @retval None
  118. */
  119. void PWM_ICStructInit(PWM_ICInitType *ICInitType)
  120. {
  121. /*------- Reset PWM output channel init structure parameters values --------*/
  122. /* Initialize the Channel member */
  123. ICInitType->Channel = PWM_CHANNEL_0;
  124. /* Initialize the CaptureMode member */
  125. ICInitType->CaptureMode = PWM_CM_DISABLE;
  126. }
  127. /**
  128. * @brief Initializes PWM channel input capture function.
  129. * @param PWMx: PWM0~PWM3
  130. ICInitType:PWM output compare configuration.
  131. Channel:
  132. PWM_CHANNEL_0
  133. PWM_CHANNEL_1
  134. PWM_CHANNEL_2
  135. CaptureMode:
  136. PWM_CM_DISABLE
  137. PWM_CM_RISING
  138. PWM_CM_FALLING
  139. PWM_CM_BOTH
  140. * @retval None
  141. */
  142. void PWM_ICInit(PWM_Type *PWMx, PWM_ICInitType *ICInitType)
  143. {
  144. uint32_t tmp;
  145. /* Check parameters */
  146. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  147. assert_parameters(IS_PWM_CHANNEL(ICInitType->Channel));
  148. assert_parameters(IS_PWM_CAPMODE(ICInitType->CaptureMode));
  149. tmp = PWMx->CCTL[ICInitType->Channel];
  150. tmp &= ~(PWM_CCTL_CM | PWM_CCTL_CAP | PWM_CCTL_CCIFG | PWM_CCTL_COV);
  151. tmp |= (ICInitType->CaptureMode | PWM_CCTL_CAP);
  152. PWMx->CCTL[ICInitType->Channel] = tmp;
  153. }
  154. /**
  155. * @brief Enables or disables PWM base interrupt.
  156. * @param PWMx: PWM0~PWM3
  157. NewState:
  158. ENABLE
  159. DISABLE
  160. * @retval None
  161. */
  162. void PWM_BaseINTConfig(PWM_Type *PWMx, uint32_t NewState)
  163. {
  164. uint32_t tmp;
  165. /* Check parameters */
  166. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  167. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  168. tmp = PWMx->CTL;
  169. tmp &= ~(PWM_CTL_IE | PWM_CTL_IFG);
  170. if (NewState == ENABLE)
  171. {
  172. tmp |= PWM_CTL_IE;
  173. }
  174. PWMx->CTL = tmp;
  175. }
  176. /**
  177. * @brief Gets PWM base interrupt status.
  178. * @param PWMx: PWM0~PWM3
  179. * @retval interrupt status.
  180. */
  181. uint8_t PWM_GetBaseINTStatus(PWM_Type *PWMx)
  182. {
  183. /* Check parameters */
  184. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  185. if (PWMx->CTL&PWM_CTL_IFG)
  186. return 1;
  187. else
  188. return 0;
  189. }
  190. /**
  191. * @brief Clears PWM base interrupt status.
  192. * @param PWMx: PWM0~PWM3
  193. * @retval None.
  194. */
  195. void PWM_ClearBaseINTStatus(PWM_Type *PWMx)
  196. {
  197. /* Check parameters */
  198. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  199. PWMx->CTL |= PWM_CTL_IFG;
  200. }
  201. /**
  202. * @brief Enables or disables channel interrupt.
  203. * @param PWMx: PWM0~PWM3
  204. Channel:
  205. PWM_CHANNEL_0
  206. PWM_CHANNEL_1
  207. PWM_CHANNEL_2
  208. NewState:
  209. ENABLE
  210. DISABLE
  211. * @retval None
  212. */
  213. void PWM_ChannelINTConfig(PWM_Type *PWMx, uint32_t Channel, uint32_t NewState)
  214. {
  215. uint32_t tmp;
  216. /* Check parameters */
  217. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  218. assert_parameters(IS_PWM_CHANNEL(Channel));
  219. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  220. tmp = PWMx->CCTL[Channel];
  221. tmp &= ~(PWM_CCTL_CCIE | PWM_CCTL_CCIFG | PWM_CCTL_COV);
  222. if (NewState == ENABLE)
  223. {
  224. tmp |= PWM_CCTL_CCIE;
  225. }
  226. PWMx->CCTL[Channel] = tmp;
  227. }
  228. /**
  229. * @brief Gets channel interrupt status.
  230. * @param PWMx: PWM0~PWM3
  231. Channel:
  232. PWM_CHANNEL_0
  233. PWM_CHANNEL_1
  234. PWM_CHANNEL_2
  235. IntMask:
  236. PWM_INT_CCIFG
  237. PWM_INT_COV
  238. * @retval interrupt status
  239. */
  240. uint8_t PWM_GetChannelINTStatus(PWM_Type *PWMx, uint32_t Channel, uint32_t IntMask)
  241. {
  242. /* Check parameters */
  243. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  244. assert_parameters(IS_PWM_CHANNEL(Channel));
  245. assert_parameters(IS_PWM_INTFLAGR(IntMask));
  246. if (PWMx->CCTL[Channel] & IntMask)
  247. {
  248. return 1;
  249. }
  250. else
  251. {
  252. return 0;
  253. }
  254. }
  255. /**
  256. * @brief Clears channel interrupt status.
  257. * @param PWMx: PWM0~PWM3
  258. Channel:
  259. PWM_CHANNEL_0
  260. PWM_CHANNEL_1
  261. PWM_CHANNEL_2
  262. Int_Mask:
  263. PWM_INT_CCIFG
  264. PWM_INT_COV
  265. * @retval None
  266. */
  267. void PWM_ClearChannelINTStatus(PWM_Type *PWMx, uint32_t Channel, uint32_t IntMask)
  268. {
  269. uint32_t tmp;
  270. /* Check parameters */
  271. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  272. assert_parameters(IS_PWM_CHANNEL(Channel));
  273. assert_parameters(IS_PWM_INTFLAGC(IntMask));
  274. tmp = PWMx->CCTL[Channel];
  275. tmp &= ~PWM_INT_Msk;
  276. tmp |= IntMask;
  277. PWMx->CCTL[Channel] = tmp;
  278. }
  279. /**
  280. * @brief Clears PWM counter.
  281. * @param PWMx: PWM0~PWM3
  282. * @retval None
  283. */
  284. void PWM_ClearCounter(PWM_Type *PWMx)
  285. {
  286. /* Check parameters */
  287. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  288. PWMx->CTL |= PWM_CTL_CLR;
  289. }
  290. /**
  291. * @brief Configures PWM channel CCR value.
  292. * @param PWMx: PWM0~PWM3
  293. Channel:
  294. PWM_CHANNEL_0
  295. PWM_CHANNEL_1
  296. PWM_CHANNEL_2
  297. Period: 0 ~ 0xFFFF
  298. * @retval None
  299. */
  300. void PWM_CCRConfig(PWM_Type *PWMx, uint32_t Channel, uint16_t Period)
  301. {
  302. /* Check parameters */
  303. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  304. assert_parameters(IS_PWM_CHANNEL(Channel));
  305. PWMx->CCR[Channel] = Period;
  306. }
  307. /**
  308. * @brief Configures PWM output line.
  309. * @param OutSelection:
  310. PWM0_OUT0
  311. PWM0_OUT1
  312. PWM0_OUT2
  313. PWM1_OUT0
  314. PWM1_OUT1
  315. PWM1_OUT2
  316. PWM2_OUT0
  317. PWM2_OUT1
  318. PWM2_OUT2
  319. PWM3_OUT0
  320. PWM3_OUT1
  321. PWM3_OUT2
  322. OLine: can use the '|' operator
  323. PWM_OLINE_0
  324. PWM_OLINE_1
  325. PWM_OLINE_2
  326. PWM_OLINE_3
  327. * @note PWM Single channel's output waveform can be output on multiple output lines.
  328. * Multiple-line configuration can be performed by using the '|' operator.
  329. * ex: PWM_OLineConfig(PWM0_OUT0, PWM_OLINE_0 | PWM_OLINE_2)
  330. * PWM0 channel0 output by PWM0&PWM2's line.
  331. * @retval None
  332. */
  333. void PWM_OLineConfig(uint32_t OutSelection, uint32_t OLine)
  334. {
  335. uint32_t tmp;
  336. uint32_t position = 0;
  337. /* Check parameters */
  338. assert_parameters(IS_PWM_OUTLINE(OLine));
  339. assert_parameters(IS_PWM_OUTSEL(OutSelection));
  340. tmp = PWM_SEL->O_SEL;
  341. while ((OLine >> position) != 0UL)
  342. {
  343. if ((OLine >> position) & 1UL)
  344. {
  345. tmp &= ~(PWM_SEL_O_SEL_SEL0 << (position * 4));
  346. tmp |= (OutSelection << (position * 4));
  347. }
  348. position++;
  349. }
  350. PWM_SEL->O_SEL = tmp;
  351. }
  352. /**
  353. * @brief Enables disables PWM output function.
  354. * @param PWMx: PWM0~PWM3
  355. Channel:
  356. PWM_CHANNEL_0
  357. PWM_CHANNEL_1
  358. PWM_CHANNEL_2
  359. NewState:
  360. ENABLE
  361. DISABLE
  362. * @retval None
  363. */
  364. void PWM_OutputCmd(PWM_Type *PWMx, uint32_t Channel, uint32_t NewState)
  365. {
  366. uint32_t tmp;
  367. /* Check parameters */
  368. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  369. assert_parameters(IS_PWM_CHANNEL(Channel));
  370. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  371. tmp = PWMx->CCTL[Channel];
  372. tmp &= ~(PWM_CCTL_CCIFG | PWM_CCTL_COV);
  373. if (NewState == ENABLE)
  374. {
  375. tmp |= PWM_CCTL_OUTEN;
  376. }
  377. else
  378. {
  379. tmp &= ~PWM_CCTL_OUTEN;
  380. }
  381. PWMx->CCTL[Channel] = tmp;
  382. }
  383. /**
  384. * @brief Sets PWM channel output level.
  385. * @param PWMx: PWM0~PWM3
  386. Channel:
  387. PWM_CHANNEL_0
  388. PWM_CHANNEL_1
  389. PWM_CHANNEL_2
  390. Level:
  391. PWM_LEVEL_HIGH
  392. PWM_LEVEL_LOW
  393. * @retval None
  394. */
  395. void PWM_SetOutLevel(PWM_Type *PWMx, uint32_t Channel, uint32_t Level)
  396. {
  397. uint32_t tmp;
  398. /* Check parameters */
  399. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  400. assert_parameters(IS_PWM_CHANNEL(Channel));
  401. assert_parameters(IS_PWM_OUTLVL(Level));
  402. tmp = PWMx->CCTL[Channel];
  403. tmp &= ~(PWM_CCTL_OUT | PWM_CCTL_CCIFG | PWM_CCTL_COV);
  404. tmp |= Level;
  405. PWMx->CCTL[Channel] = tmp;
  406. }
  407. /**
  408. * @brief Configures PWM input line.
  409. * @param InSelection:
  410. PWM1_IN2
  411. PWM1_IN1
  412. PWM1_IN0
  413. PWM0_IN2
  414. PWM0_IN1
  415. PWM0_IN0
  416. PWM3_IN2
  417. PWM3_IN1
  418. PWM3_IN0
  419. PWM2_IN2
  420. PWM2_IN1
  421. PWM2_IN0
  422. ILine:
  423. PWM_ILINE_0
  424. PWM_ILINE_1
  425. PWM_ILINE_2
  426. PWM_ILINE_3
  427. * @retval None
  428. */
  429. void PWM_ILineConfig(uint32_t InSelection, uint32_t ILine)
  430. {
  431. __IO uint32_t *addr;
  432. uint32_t tmp;
  433. /* Check parameters */
  434. assert_parameters(IS_PWM_INLINE(ILine));
  435. assert_parameters(IS_PWM_INSEL(InSelection));
  436. addr = &PWM_SEL->I_SEL01 + ((InSelection&0xF00)>>8);
  437. tmp = *addr;
  438. tmp &= ~( 3 << (InSelection&0xFF));
  439. tmp |= (ILine << (InSelection&0xFF));
  440. *addr = tmp;
  441. }
  442. /**
  443. * @brief Gets PWM channel SCCI value.
  444. * @param PWMx: PWM0~PWM3
  445. Channel:
  446. PWM_CHANNEL_0
  447. PWM_CHANNEL_1
  448. PWM_CHANNEL_2
  449. * @retval INx¡¯s input value when the TAR is equal to CCRx
  450. */
  451. uint8_t PWM_GetSCCI(PWM_Type *PWMx, uint32_t Channel)
  452. {
  453. /* Check parameters */
  454. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  455. assert_parameters(IS_PWM_CHANNEL(Channel));
  456. if (PWMx->CCTL[Channel] & PWM_CCTL_SCCI)
  457. {
  458. return 1;
  459. }
  460. else
  461. {
  462. return 0;
  463. }
  464. }
  465. /**
  466. * @brief Gets PWM channel capture value.
  467. * @param PWMx: PWM0~PWM3
  468. Channel:
  469. PWM_CHANNEL_0
  470. PWM_CHANNEL_1
  471. PWM_CHANNEL_2
  472. * @retval The value of CCRx.
  473. */
  474. uint32_t PWM_GetCapture(PWM_Type *PWMx, uint32_t Channel)
  475. {
  476. /* Check parameters */
  477. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  478. assert_parameters(IS_PWM_CHANNEL(Channel));
  479. return PWMx->CCR[Channel];
  480. }
  481. /******************* (C) COPYRIGHT Vango Technologies, Inc *****END OF FILE****/