pwm.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. /**
  2. * @file pwm.c
  3. * @author chipsea
  4. * @brief
  5. * @version 0.1
  6. * @date 2020-11-30
  7. * @copyright Copyright (c) 2020, CHIPSEA Co., Ltd.
  8. * @note
  9. */
  10. /*******************************************************************************
  11. * @file pwm.c
  12. * @brief Contains all functions support for pwm driver
  13. * @version 0.0
  14. * @date 30. Oct. 2017
  15. * @author Ding
  16. *
  17. *
  18. *******************************************************************************/
  19. #include "sdk_config.h"
  20. #include "rom_sym_def.h"
  21. #include "gpio.h"
  22. #include "clock.h"
  23. #include "pwm.h"
  24. #include "pwrmgr.h"
  25. /**************************************************************************************
  26. * @fn HalPwmInit
  27. *
  28. * @brief This function process for pwm initial
  29. *
  30. * input parameters
  31. *
  32. * @param PwmCh_t pwmN : pwm channel
  33. * PwmClkDiv_t pwmDiv : clock prescaler of PWM channel
  34. * PwmMode_t pwmMode : count mode of PWM channel
  35. * PwmPolarity_t pwmPolarity : output polarity setting of PWM channel
  36. * unsigned short cmpVal : the compare value of PWM channel
  37. * unsigned short cntTopVal : the counter top value of PWM channel
  38. *
  39. * output parameters
  40. *
  41. * @param None.
  42. *
  43. * @return None.
  44. **************************************************************************************/
  45. void HalPwmInit(
  46. PwmCh_t pwmN,
  47. PwmClkDiv_t pwmDiv,
  48. PwmMode_t pwmMode,
  49. PwmPolarity_t pwmPolarity)
  50. {
  51. hal_clk_gate_enable(MOD_PWM);
  52. PWM_DISABLE_CH(pwmN);
  53. PWM_SET_DIV(pwmN, pwmDiv);
  54. PWM_SET_MODE(pwmN, pwmMode);
  55. PWM_SET_POL(pwmN, pwmPolarity);
  56. PWM_INSTANT_LOAD_CH(pwmN);
  57. hal_pwrmgr_register(MOD_PWM, NULL, NULL);
  58. }
  59. static GpioPin_t pwm_gpio_map[]={
  60. GPIO_DUMMY,
  61. GPIO_DUMMY,
  62. GPIO_DUMMY,
  63. GPIO_DUMMY,
  64. GPIO_DUMMY,
  65. GPIO_DUMMY,
  66. };
  67. /**************************************************************************************
  68. * @fn HalPwmOpenChannel
  69. *
  70. * @brief This function process for pwm start working
  71. *
  72. * input parameters
  73. *
  74. * @param PwmCh_t pwmN : pwm channel
  75. * GpioPin_t pwmPin : pwm pin number
  76. *
  77. * output parameters
  78. *
  79. * @param None.
  80. *
  81. * @return None.
  82. **************************************************************************************/
  83. void HalPwmOpenChannel(PwmCh_t pwmN,GpioPin_t pwmPin)
  84. {
  85. HalGpioFmuxConfig(pwmPin, (gpio_fmux_e)(FMUX_PWM0 + pwmN));
  86. PWM_ENABLE_CH(pwmN);
  87. pwm_gpio_map[pwmN] = pwmPin;
  88. }
  89. /**************************************************************************************
  90. * @fn HalPwmCloseChannel
  91. *
  92. * @brief This function process for pwm stop working
  93. *
  94. * input parameters
  95. *
  96. * @param PwmCh_t pwmN : pwm channel
  97. *
  98. * output parameters
  99. *
  100. * @param None.
  101. *
  102. * @return None.
  103. **************************************************************************************/
  104. void HalPwmCloseChannel(PwmCh_t pwmN)
  105. {
  106. if(pwm_gpio_map[pwmN] != GPIO_DUMMY)
  107. {
  108. HalGpioFmuxEnable(pwm_gpio_map[pwmN],Bit_DISABLE);
  109. pwm_gpio_map[pwmN] = GPIO_DUMMY;
  110. }
  111. PWM_DISABLE_CH(pwmN);
  112. }
  113. /**************************************************************************************
  114. * @fn HalPwmDestroy
  115. *
  116. * @brief This function process for pwm clear and disable
  117. *
  118. * input parameters
  119. *
  120. * @param PwmCh_t pwmN : pwm channel
  121. *
  122. * output parameters
  123. *
  124. * @param None.
  125. *
  126. * @return None.
  127. **************************************************************************************/
  128. void HalPwmDestroy(PwmCh_t pwmN)
  129. {
  130. PWM_DISABLE_CH(pwmN);
  131. PWM_NO_LOAD_CH(pwmN);
  132. PWM_NO_INSTANT_LOAD_CH(pwmN);
  133. PWM_SET_DIV(pwmN, 0);
  134. PWM_SET_MODE(pwmN, 0);
  135. PWM_SET_POL(pwmN, 0);
  136. PWM_SET_TOP_VAL(pwmN, 0);
  137. PWM_SET_CMP_VAL(pwmN, 0);
  138. }
  139. /**************************************************************************************
  140. * @fn HalPwmSetCountVal
  141. *
  142. * @brief This function process for change pwm count value
  143. *
  144. * input parameters
  145. *
  146. * @param PwmCh_t pwmN : pwm channel
  147. * uint16_t cmpVal : the compare value of PWM channel
  148. * uint16_t cntTopVal : the counter top value of PWM channel
  149. *
  150. * output parameters
  151. *
  152. * @param None.
  153. *
  154. * @return None.
  155. **************************************************************************************/
  156. void HalPwmSetCountVal(PwmCh_t pwmN, uint16_t cmpVal, uint16_t cntTopVal)
  157. {
  158. if(cmpVal > cntTopVal)
  159. return;
  160. PWM_NO_LOAD_CH(pwmN);
  161. PWM_SET_CMP_VAL(pwmN, cmpVal);
  162. PWM_SET_TOP_VAL(pwmN, cntTopVal);
  163. PWM_LOAD_CH(pwmN);
  164. }
  165. static unsigned int pwm_en = 0;
  166. void HalPwmStart(void)
  167. {
  168. if(pwm_en == 0)
  169. {
  170. hal_pwrmgr_lock(MOD_PWM);
  171. PWM_ENABLE_ALL;
  172. pwm_en = 1;
  173. }
  174. }
  175. void HalPwmStop(void)
  176. {
  177. if(pwm_en == 1)
  178. {
  179. hal_pwrmgr_unlock(MOD_PWM);
  180. PWM_DISABLE_ALL;
  181. pwm_en = 0;
  182. hal_clk_gate_disable(MOD_PWM);
  183. }
  184. }
  185. //------------------------------------------------------------
  186. //new api,make use easily
  187. typedef struct {
  188. bool enable;
  189. bool ch_en[6];
  190. PwmCfg_t ch[6];
  191. }pwm_Ctx_t;
  192. static pwm_Ctx_t pwmCtx =
  193. {
  194. .enable = FALSE,
  195. .ch_en = {FALSE,FALSE,FALSE,FALSE,FALSE,FALSE},
  196. };
  197. void HalPwmModuleInit(void)
  198. {
  199. int i = 0;
  200. if(pwmCtx.enable == TRUE)
  201. return;
  202. pwmCtx.enable = TRUE;
  203. for(i = 0;i < 6;i++)
  204. {
  205. pwmCtx.ch_en[i] = FALSE;
  206. pwmCtx.ch[i].pwmN = (PwmCh_t)i;
  207. pwmCtx.ch[i].pwmPin = GPIO_DUMMY;
  208. pwmCtx.ch[i].pwmDiv = PWM_CLK_NO_DIV;
  209. pwmCtx.ch[i].pwmMode = PWM_CNT_UP;
  210. pwmCtx.ch[i].pwmPolarity = PWM_POLARITY_RISING;
  211. pwmCtx.ch[i].cmpVal = 0;
  212. pwmCtx.ch[i].cntTopVal = 0;
  213. HalPwmDestroy((PwmCh_t)i);
  214. }
  215. HalPwmStop();
  216. }
  217. void HalPwmModuleDeinit(void)
  218. {
  219. int i = 0;
  220. if(pwmCtx.enable == FALSE)
  221. return;
  222. pwmCtx.enable = FALSE;
  223. for(i = 0;i < 6;i++)
  224. {
  225. pwmCtx.ch_en[i] = FALSE;
  226. pwmCtx.ch[i].pwmN = (PwmCh_t)i;
  227. pwmCtx.ch[i].pwmPin = GPIO_DUMMY;
  228. pwmCtx.ch[i].pwmDiv = PWM_CLK_NO_DIV;
  229. pwmCtx.ch[i].pwmMode = PWM_CNT_UP;
  230. pwmCtx.ch[i].pwmPolarity = PWM_POLARITY_RISING;
  231. pwmCtx.ch[i].cmpVal = 0;
  232. pwmCtx.ch[i].cntTopVal = 0;
  233. HalPwmCloseChannel((PwmCh_t)i);
  234. HalPwmDestroy((PwmCh_t)i);
  235. }
  236. HalPwmStop();
  237. }
  238. void HalPwmChannelStart(PwmCfg_t ch)
  239. {
  240. if(pwmCtx.enable == FALSE)
  241. return;
  242. if(pwmCtx.ch_en[ch.pwmN] == TRUE)
  243. {
  244. HalPwmSetCountVal(ch.pwmN,ch.cmpVal,ch.cntTopVal);
  245. PWM_SET_DIV(ch.pwmN, ch.pwmDiv);
  246. }
  247. else
  248. {
  249. HalPwmInit(ch.pwmN,ch.pwmDiv,ch.pwmMode,ch.pwmPolarity);
  250. HalPwmSetCountVal(ch.pwmN,ch.cmpVal,ch.cntTopVal);
  251. HalPwmOpenChannel(ch.pwmN,ch.pwmPin);
  252. pwmCtx.ch_en[ch.pwmN] = TRUE;
  253. HalPwmStart();
  254. }
  255. }
  256. void HalPwmChannelStop(PwmCh_t pwmN)
  257. {
  258. if(pwmCtx.ch_en[pwmN] == FALSE)
  259. return;
  260. else
  261. {
  262. pwmCtx.ch_en[pwmN] = FALSE;
  263. HalPwmDestroy(pwmN);
  264. HalPwmCloseChannel(pwmN);
  265. }
  266. }
  267. bool HalPwmChannelEnable(PwmCh_t pwmN)
  268. {
  269. return pwmCtx.ch_en[pwmN];
  270. }
  271. PwmCfg_t HalPwmChannelReg(PwmCh_t pwmN)
  272. {
  273. return pwmCtx.ch[pwmN];
  274. }