lib_pwm.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. /**
  2. ******************************************************************************
  3. * @file lib_pwm.c
  4. * @author Application Team
  5. * @version V4.4.0
  6. * @date 2018-09-27
  7. * @brief PWM library.
  8. ******************************************************************************
  9. * @attention
  10. *
  11. ******************************************************************************
  12. */
  13. #include "lib_pwm.h"
  14. /**
  15. * @brief PWM timebase initialization.
  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_TypeDef *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_TESL);
  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 OutMode member */
  74. OCInitType->OutMode = PWM_OUTMOD_CONST;
  75. /* Initialize the Period member */
  76. OCInitType->Period = 0;
  77. }
  78. /**
  79. * @brief PWM output compare channel 0.
  80. * @param PWMx: PWM0~PWM3
  81. OCInitType:PWM output compare configuration.
  82. OutMode:
  83. PWM_OUTMOD_CONST
  84. PWM_OUTMOD_SET
  85. PWM_OUTMOD_TOGGLE_RESET
  86. PWM_OUTMOD_SET_RESET
  87. PWM_OUTMOD_TOGGLE
  88. PWM_OUTMOD_RESET
  89. PWM_OUTMOD_TOGGLE_SET
  90. PWM_OUTMOD_RESET_SET
  91. Period: 0 ~ 0xFFFF
  92. * @retval None
  93. */
  94. void PWM_OC0Init(PWM_TypeDef *PWMx, PWM_OCInitType *OCInitType)
  95. {
  96. uint32_t tmp;
  97. /* Check parameters */
  98. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  99. assert_parameters(IS_PWM_OUTMODE(OCInitType->OutMode));
  100. assert_parameters(IS_PWM_CCR(OCInitType->Period));
  101. tmp = PWMx->CCTL0;
  102. tmp &= ~(PWM_CCTL_OUTMOD | PWM_CCTL_CCIGG);
  103. tmp |= OCInitType->OutMode;
  104. PWMx->CCTL0 = tmp;
  105. PWMx->CCR0 = OCInitType->Period;
  106. }
  107. /**
  108. * @brief PWM output compare channel 1.
  109. * @param PWMx: PWM0~PWM3
  110. OCInitType:PWM output compare configuration.
  111. OutMode:
  112. PWM_OUTMOD_CONST
  113. PWM_OUTMOD_SET
  114. PWM_OUTMOD_TOGGLE_RESET
  115. PWM_OUTMOD_SET_RESET
  116. PWM_OUTMOD_TOGGLE
  117. PWM_OUTMOD_RESET
  118. PWM_OUTMOD_TOGGLE_SET
  119. PWM_OUTMOD_RESET_SET
  120. Period: 0 ~ 0xFFFF
  121. * @retval None
  122. */
  123. void PWM_OC1Init(PWM_TypeDef *PWMx, PWM_OCInitType *OCInitType)
  124. {
  125. uint32_t tmp;
  126. /* Check parameters */
  127. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  128. assert_parameters(IS_PWM_OUTMODE(OCInitType->OutMode));
  129. assert_parameters(IS_PWM_CCR(OCInitType->Period));
  130. tmp = PWMx->CCTL1;
  131. tmp &= ~(PWM_CCTL_OUTMOD | PWM_CCTL_CCIGG);
  132. tmp |= OCInitType->OutMode;
  133. PWMx->CCTL1 = tmp;
  134. PWMx->CCR1 = OCInitType->Period;
  135. }
  136. /**
  137. * @brief PWM output compare channel 2.
  138. * @param PWMx: PWM0~PWM3
  139. OCInitType:PWM output compare configuration.
  140. OutMode:
  141. PWM_OUTMOD_CONST
  142. PWM_OUTMOD_SET
  143. PWM_OUTMOD_TOGGLE_RESET
  144. PWM_OUTMOD_SET_RESET
  145. PWM_OUTMOD_TOGGLE
  146. PWM_OUTMOD_RESET
  147. PWM_OUTMOD_TOGGLE_SET
  148. PWM_OUTMOD_RESET_SET
  149. Period: 0 ~ 0xFFFF
  150. * @retval None
  151. */
  152. void PWM_OC2Init(PWM_TypeDef *PWMx, PWM_OCInitType *OCInitType)
  153. {
  154. uint32_t tmp;
  155. /* Check parameters */
  156. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  157. assert_parameters(IS_PWM_OUTMODE(OCInitType->OutMode));
  158. assert_parameters(IS_PWM_CCR(OCInitType->Period));
  159. tmp = PWMx->CCTL2;
  160. tmp &= ~(PWM_CCTL_OUTMOD | PWM_CCTL_CCIGG);
  161. tmp |= OCInitType->OutMode;
  162. PWMx->CCTL2 = tmp;
  163. PWMx->CCR2 = OCInitType->Period;
  164. }
  165. /**
  166. * @brief PWM base interrupt configure.
  167. * @param PWMx: PWM0~PWM3
  168. NewState:
  169. ENABLE
  170. DISABLE
  171. * @retval None
  172. */
  173. void PWM_BaseINTConfig(PWM_TypeDef *PWMx, uint32_t NewState)
  174. {
  175. uint32_t tmp;
  176. /* Check parameters */
  177. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  178. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  179. tmp = PWMx->CTL;
  180. tmp &= ~(PWM_CTL_IE | PWM_CTL_IFG);
  181. if (NewState == ENABLE)
  182. {
  183. tmp |= PWM_CTL_IE;
  184. }
  185. PWMx->CTL = tmp;
  186. }
  187. /**
  188. * @brief Get PWM base interrupt status.
  189. * @param PWMx: PWM0~PWM3
  190. * @retval interrupt status.
  191. */
  192. uint8_t PWM_GetBaseINTStatus(PWM_TypeDef *PWMx)
  193. {
  194. /* Check parameters */
  195. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  196. if (PWMx->CTL&PWM_CTL_IFG)
  197. return 1;
  198. else
  199. return 0;
  200. }
  201. /**
  202. * @brief Clear PWM base interrupt status.
  203. * @param PWMx: PWM0~PWM3
  204. * @retval None.
  205. */
  206. void PWM_ClearBaseINTStatus(PWM_TypeDef *PWMx)
  207. {
  208. /* Check parameters */
  209. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  210. PWMx->CTL |= PWM_CTL_IFG;
  211. }
  212. /**
  213. * @brief channel interrupt configure.
  214. * @param PWMx: PWM0~PWM3
  215. Channel:
  216. PWM_CHANNEL_0
  217. PWM_CHANNEL_1
  218. PWM_CHANNEL_2
  219. NewState:
  220. ENABLE
  221. DISABLE
  222. * @retval None
  223. */
  224. void PWM_ChannelINTConfig(PWM_TypeDef *PWMx, uint32_t Channel, uint32_t NewState)
  225. {
  226. __IO uint32_t *addr;
  227. uint32_t tmp;
  228. /* Check parameters */
  229. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  230. assert_parameters(IS_PWM_CHANNEL(Channel));
  231. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  232. addr = &PWMx->CCTL0 + Channel;
  233. tmp = *addr;
  234. tmp &= ~(PWM_CCTL_CCIE | PWM_CCTL_CCIGG);
  235. if (NewState == ENABLE)
  236. {
  237. tmp |= PWM_CCTL_CCIE;
  238. }
  239. *addr = tmp;
  240. }
  241. /**
  242. * @brief Get channel interrupt status.
  243. * @param PWMx: PWM0~PWM3
  244. Channel:
  245. PWM_CHANNEL_0
  246. PWM_CHANNEL_1
  247. PWM_CHANNEL_2
  248. * @retval interrupt status
  249. */
  250. uint8_t PWM_GetChannelINTStatus(PWM_TypeDef *PWMx, uint32_t Channel)
  251. {
  252. __IO uint32_t *addr;
  253. uint32_t tmp;
  254. /* Check parameters */
  255. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  256. assert_parameters(IS_PWM_CHANNEL(Channel));
  257. addr = &PWMx->CCTL0 + Channel;
  258. tmp = *addr;
  259. if (tmp & PWM_CCTL_CCIGG)
  260. {
  261. return 1;
  262. }
  263. else
  264. {
  265. return 0;
  266. }
  267. }
  268. /**
  269. * @brief Clear channel interrupt status.
  270. * @param PWMx: PWM0~PWM3
  271. Channel:
  272. PWM_CHANNEL_0
  273. PWM_CHANNEL_1
  274. PWM_CHANNEL_2
  275. * @retval None
  276. */
  277. void PWM_ClearChannelINTStatus(PWM_TypeDef *PWMx, uint32_t Channel)
  278. {
  279. __IO uint32_t *addr;
  280. uint32_t tmp;
  281. /* Check parameters */
  282. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  283. assert_parameters(IS_PWM_CHANNEL(Channel));
  284. addr = &PWMx->CCTL0 + Channel;
  285. tmp = *addr;
  286. tmp &= ~PWM_CCTL_CCIGG;
  287. tmp |= PWM_CCTL_CCIGG;
  288. *addr = tmp;
  289. }
  290. /**
  291. * @brief PWM clear counter.
  292. * @param PWMx: PWM0~PWM3
  293. * @retval None
  294. */
  295. void PWM_ClearCounter(PWM_TypeDef *PWMx)
  296. {
  297. /* Check parameters */
  298. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  299. PWMx->CTL |= PWM_CTL_CLR;
  300. }
  301. /**
  302. * @brief Configure PWMx channelx's CCR value.
  303. * @param PWMx: PWM0~PWM3
  304. Channel:
  305. PWM_CHANNEL_0
  306. PWM_CHANNEL_1
  307. PWM_CHANNEL_2
  308. Period: 0 ~ 0xFFFF
  309. * @retval None
  310. */
  311. void PWM_CCRConfig(PWM_TypeDef *PWMx, uint32_t Channel, uint16_t Period)
  312. {
  313. __IO uint32_t *addr;
  314. /* Check parameters */
  315. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  316. assert_parameters(IS_PWM_CHANNEL(Channel));
  317. addr = &PWMx->CCR0 + Channel;
  318. *addr = Period;
  319. }
  320. /**
  321. * @brief pwm output line selection.
  322. * @param OutSelection:
  323. PWM0_OUT0
  324. PWM0_OUT1
  325. PWM0_OUT2
  326. PWM1_OUT0
  327. PWM1_OUT1
  328. PWM1_OUT2
  329. PWM2_OUT0
  330. PWM2_OUT1
  331. PWM2_OUT2
  332. PWM3_OUT0
  333. PWM3_OUT1
  334. PWM3_OUT2
  335. OLine: can use the ¡®|¡¯ operator
  336. PWM_OLINE_0
  337. PWM_OLINE_1
  338. PWM_OLINE_2
  339. PWM_OLINE_3
  340. * @note PWM Single channel's output waveform can be output on multiple output lines.
  341. * Multiple-line configuration can be performed by using the ¡®|¡¯ operator.
  342. * ex: PWM_OLineConfig(PWM0_OUT0, PWM_OLINE_0 | PWM_OLINE_2)
  343. * PWM0 channel0 output by PWM0&PWM2's lien.
  344. * @retval None
  345. */
  346. void PWM_OLineConfig(uint32_t OutSelection, uint32_t OLine)
  347. {
  348. uint32_t tmp;
  349. uint32_t position = 0;
  350. /* Check parameters */
  351. assert_parameters(IS_PWM_OUTLINE(OLine));
  352. assert_parameters(IS_PWM_OUTSEL(OutSelection));
  353. tmp = PWMMUX->OSEL;
  354. while ((OLine >> position) != 0UL)
  355. {
  356. if ((OLine >> position) & 1UL)
  357. {
  358. tmp &= ~(PWM_O_SEL_O_SEL0 << (position * 4));
  359. tmp |= (OutSelection << (position * 4));
  360. }
  361. position++;
  362. }
  363. PWMMUX->OSEL = tmp;
  364. }
  365. /**
  366. * @brief PWM output enable.
  367. * @param PWMx: PWM0~PWM3
  368. Channel:
  369. PWM_CHANNEL_0
  370. PWM_CHANNEL_1
  371. PWM_CHANNEL_2
  372. NewState:
  373. ENABLE
  374. DISABLE
  375. * @retval None
  376. */
  377. void PWM_OutputCmd(PWM_TypeDef *PWMx, uint32_t Channel, uint32_t NewState)
  378. {
  379. __IO uint32_t *addr;
  380. uint32_t tmp;
  381. /* Check parameters */
  382. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  383. assert_parameters(IS_PWM_CHANNEL(Channel));
  384. assert_parameters(IS_FUNCTIONAL_STATE(NewState));
  385. addr = &PWMx->CCTL0 + Channel;
  386. tmp = *addr;
  387. tmp &= ~PWM_CCTL_CCIGG;
  388. if (NewState == ENABLE)
  389. tmp |= PWM_CCTL_OUTEN;
  390. else
  391. tmp &= ~PWM_CCTL_OUTEN;
  392. *addr = tmp;
  393. }
  394. /**
  395. * @brief Set channel output level.
  396. * @param PWMx: PWM0~PWM3
  397. Channel:
  398. PWM_CHANNEL_0
  399. PWM_CHANNEL_1
  400. PWM_CHANNEL_2
  401. Level:
  402. PWM_LEVEL_HIGH
  403. PWM_LEVEL_LOW
  404. * @retval None
  405. */
  406. void PWM_SetOutLevel(PWM_TypeDef *PWMx, uint32_t Channel, uint32_t Level)
  407. {
  408. __IO uint32_t *addr;
  409. uint32_t tmp;
  410. /* Check parameters */
  411. assert_parameters(IS_PWM_ALL_INSTANCE(PWMx));
  412. assert_parameters(IS_PWM_CHANNEL(Channel));
  413. assert_parameters(IS_PWM_OUTLVL(Level));
  414. addr = &PWMx->CCTL0 + Channel;
  415. tmp = *addr;
  416. tmp &= ~(PWM_CCTL_OUT | PWM_CCTL_CCIGG);
  417. tmp |= Level;
  418. *addr = tmp;
  419. }
  420. /*********************************** END OF FILE ******************************/