SWM320_pwm.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. /******************************************************************************************************************************************
  2. * 文件名称: SWM320_pwm.c
  3. * 功能说明: SWM320单片机的PWM功能驱动库
  4. * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
  5. * 注意事项:
  6. * 版本日期: V1.1.0 2017年10月25日
  7. * 升级记录:
  8. *
  9. *
  10. *******************************************************************************************************************************************
  11. * @attention
  12. *
  13. * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
  14. * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
  15. * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
  16. * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
  17. * -ECTION WITH THEIR PRODUCTS.
  18. *
  19. * COPYRIGHT 2012 Synwit Technology
  20. *******************************************************************************************************************************************/
  21. #include "SWM320.h"
  22. #include "SWM320_pwm.h"
  23. /******************************************************************************************************************************************
  24. * 函数名称: PWM_Init()
  25. * 功能说明: PWM初始化
  26. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  27. * PWM_InitStructure * initStruct 包含PWM相关设定值的结构体
  28. * 输 出: 无
  29. * 注意事项: 无
  30. ******************************************************************************************************************************************/
  31. void PWM_Init(PWM_TypeDef *PWMx, PWM_InitStructure *initStruct)
  32. {
  33. uint32_t bit_offset = 0;
  34. SYS->CLKEN |= (0x01 << SYS_CLKEN_PWM_Pos);
  35. SYS->CLKDIV &= ~SYS_CLKDIV_PWM_Msk;
  36. SYS->CLKDIV |= (initStruct->clk_div << SYS_CLKDIV_PWM_Pos);
  37. PWM_Stop(PWMx, 1, 1); //一些关键寄存器只能在PWM停止时设置
  38. PWMx->MODE = initStruct->mode;
  39. PWMx->PERA = initStruct->cycleA;
  40. PWMx->HIGHA = initStruct->hdutyA;
  41. PWMx->DZA = initStruct->deadzoneA;
  42. PWMx->PERB = initStruct->cycleB;
  43. PWMx->HIGHB = initStruct->hdutyB;
  44. PWMx->DZB = initStruct->deadzoneB;
  45. PWMx->INIOUT &= ~(PWM_INIOUT_PWMA_Msk | PWM_INIOUT_PWMB_Msk);
  46. PWMx->INIOUT |= (initStruct->initLevelA << PWM_INIOUT_PWMA_Pos) |
  47. (initStruct->initLevelB << PWM_INIOUT_PWMB_Pos);
  48. PWMG->IM = 0x00000000;
  49. switch ((uint32_t)PWMx)
  50. {
  51. case ((uint32_t)PWM0):
  52. bit_offset = 0;
  53. break;
  54. case ((uint32_t)PWM1):
  55. bit_offset = 2;
  56. break;
  57. case ((uint32_t)PWM2):
  58. bit_offset = 4;
  59. break;
  60. case ((uint32_t)PWM3):
  61. bit_offset = 6;
  62. break;
  63. case ((uint32_t)PWM4):
  64. bit_offset = 8;
  65. break;
  66. case ((uint32_t)PWM5):
  67. bit_offset = 10;
  68. break;
  69. }
  70. PWMG->IRS = ((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))); //清除中断标志
  71. PWMG->IE &= ~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13)));
  72. PWMG->IE |= (initStruct->NCycleAIEn << bit_offset) | (initStruct->NCycleBIEn << (bit_offset + 1)) |
  73. (initStruct->HEndAIEn << (bit_offset + 12)) | (initStruct->HEndBIEn << (bit_offset + 13));
  74. if (initStruct->NCycleAIEn | initStruct->NCycleBIEn | initStruct->HEndAIEn | initStruct->HEndBIEn)
  75. {
  76. NVIC_EnableIRQ(PWM_IRQn);
  77. }
  78. else if ((PWMG->IE & (~((0x01 << bit_offset) | (0x01 << (bit_offset + 1)) | (0x01 << (bit_offset + 12)) | (0x01 << (bit_offset + 13))))) == 0)
  79. {
  80. NVIC_DisableIRQ(PWM_IRQn);
  81. }
  82. }
  83. /******************************************************************************************************************************************
  84. * 函数名称: PWM_Start()
  85. * 功能说明: 启动PWM,开始PWM输出
  86. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  87. * uint32_t chA 0 通道A不启动 1 通道A启动
  88. * uint32_t chB 0 通道B不启动 1 通道B启动
  89. * 输 出: 无
  90. * 注意事项: 无
  91. ******************************************************************************************************************************************/
  92. void PWM_Start(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
  93. {
  94. switch ((uint32_t)PWMx)
  95. {
  96. case ((uint32_t)PWM0):
  97. PWMG->CHEN |= (chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos);
  98. break;
  99. case ((uint32_t)PWM1):
  100. PWMG->CHEN |= (chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos);
  101. break;
  102. case ((uint32_t)PWM2):
  103. PWMG->CHEN |= (chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos);
  104. break;
  105. case ((uint32_t)PWM3):
  106. PWMG->CHEN |= (chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos);
  107. break;
  108. case ((uint32_t)PWM4):
  109. PWMG->CHEN |= (chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos);
  110. break;
  111. case ((uint32_t)PWM5):
  112. PWMG->CHEN |= (chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos);
  113. break;
  114. }
  115. }
  116. /******************************************************************************************************************************************
  117. * 函数名称: PWM_Stop()
  118. * 功能说明: 关闭PWM,停止PWM输出
  119. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  120. * uint32_t chA 0 通道A不关闭 1 通道A关闭
  121. * uint32_t chB 0 通道B不关闭 1 通道B关闭
  122. * 输 出: 无
  123. * 注意事项: 无
  124. ******************************************************************************************************************************************/
  125. void PWM_Stop(PWM_TypeDef *PWMx, uint32_t chA, uint32_t chB)
  126. {
  127. switch ((uint32_t)PWMx)
  128. {
  129. case ((uint32_t)PWM0):
  130. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM0A_Pos) | (chB << PWMG_CHEN_PWM0B_Pos));
  131. break;
  132. case ((uint32_t)PWM1):
  133. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM1A_Pos) | (chB << PWMG_CHEN_PWM1B_Pos));
  134. break;
  135. case ((uint32_t)PWM2):
  136. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM2A_Pos) | (chB << PWMG_CHEN_PWM2B_Pos));
  137. break;
  138. case ((uint32_t)PWM3):
  139. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM3A_Pos) | (chB << PWMG_CHEN_PWM3B_Pos));
  140. break;
  141. case ((uint32_t)PWM4):
  142. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM4A_Pos) | (chB << PWMG_CHEN_PWM4B_Pos));
  143. break;
  144. case ((uint32_t)PWM5):
  145. PWMG->CHEN &= ~((chA << PWMG_CHEN_PWM5A_Pos) | (chB << PWMG_CHEN_PWM5B_Pos));
  146. break;
  147. }
  148. }
  149. /******************************************************************************************************************************************
  150. * 函数名称: PWM_SetCycle()
  151. * 功能说明: 设置周期
  152. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  153. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  154. * uint16_t cycle 要设定的周期值
  155. * 输 出: 无
  156. * 注意事项: 无
  157. ******************************************************************************************************************************************/
  158. void PWM_SetCycle(PWM_TypeDef *PWMx, uint32_t chn, uint16_t cycle)
  159. {
  160. if (chn == PWM_CH_A)
  161. PWMx->PERA = cycle;
  162. else if (chn == PWM_CH_B)
  163. PWMx->PERB = cycle;
  164. }
  165. /******************************************************************************************************************************************
  166. * 函数名称: PWM_GetCycle()
  167. * 功能说明: 获取周期
  168. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  169. * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
  170. * 输 出: uint16_t 获取到的周期值
  171. * 注意事项: 无
  172. ******************************************************************************************************************************************/
  173. uint16_t PWM_GetCycle(PWM_TypeDef *PWMx, uint32_t chn)
  174. {
  175. uint16_t cycle = 0;
  176. if (chn == PWM_CH_A)
  177. cycle = PWMx->PERA;
  178. else if (chn == PWM_CH_B)
  179. cycle = PWMx->PERB;
  180. return cycle;
  181. }
  182. /******************************************************************************************************************************************
  183. * 函数名称: PWM_SetHDuty()
  184. * 功能说明: 设置高电平时长
  185. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  186. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  187. * uint16_t hduty 要设定的高电平时长
  188. * 输 出: 无
  189. * 注意事项: 无
  190. ******************************************************************************************************************************************/
  191. void PWM_SetHDuty(PWM_TypeDef *PWMx, uint32_t chn, uint16_t hduty)
  192. {
  193. if (chn == PWM_CH_A)
  194. PWMx->HIGHA = hduty;
  195. else if (chn == PWM_CH_B)
  196. PWMx->HIGHB = hduty;
  197. }
  198. /******************************************************************************************************************************************
  199. * 函数名称: PWM_GetHDuty()
  200. * 功能说明: 获取高电平时长
  201. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  202. * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
  203. * 输 出: uint16_t 获取到的高电平时长
  204. * 注意事项: 无
  205. ******************************************************************************************************************************************/
  206. uint16_t PWM_GetHDuty(PWM_TypeDef *PWMx, uint32_t chn)
  207. {
  208. uint16_t hduty = 0;
  209. if (chn == PWM_CH_A)
  210. hduty = PWMx->HIGHA;
  211. else if (chn == PWM_CH_B)
  212. hduty = PWMx->HIGHB;
  213. return hduty;
  214. }
  215. /******************************************************************************************************************************************
  216. * 函数名称: PWM_SetDeadzone()
  217. * 功能说明: 设置死区时长
  218. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  219. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  220. * uint8_t deadzone 要设定的死区时长
  221. * 输 出: 无
  222. * 注意事项: 无
  223. ******************************************************************************************************************************************/
  224. void PWM_SetDeadzone(PWM_TypeDef *PWMx, uint32_t chn, uint8_t deadzone)
  225. {
  226. if (chn == PWM_CH_A)
  227. PWMx->DZA = deadzone;
  228. else if (chn == PWM_CH_B)
  229. PWMx->DZB = deadzone;
  230. }
  231. /******************************************************************************************************************************************
  232. * 函数名称: PWM_GetDeadzone()
  233. * 功能说明: 获取死区时长
  234. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  235. * uint32_t chn 选择要查询哪个通道,有效值:PWM_CH_A、PWM_CH_B
  236. * 输 出: uint8_t 获取到的死区时长
  237. * 注意事项: 无
  238. ******************************************************************************************************************************************/
  239. uint8_t PWM_GetDeadzone(PWM_TypeDef *PWMx, uint32_t chn)
  240. {
  241. uint8_t deadzone = 0;
  242. if (chn == PWM_CH_A)
  243. deadzone = PWMx->DZA;
  244. else if (chn == PWM_CH_B)
  245. deadzone = PWMx->DZB;
  246. return deadzone;
  247. }
  248. /******************************************************************************************************************************************
  249. * 函数名称: PWM_IntNCycleEn()
  250. * 功能说明: 新周期开始中断使能
  251. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  252. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  253. * 输 出: 无
  254. * 注意事项: 无
  255. ******************************************************************************************************************************************/
  256. void PWM_IntNCycleEn(PWM_TypeDef *PWMx, uint32_t chn)
  257. {
  258. switch ((uint32_t)PWMx)
  259. {
  260. case ((uint32_t)PWM0):
  261. if (chn == PWM_CH_A)
  262. PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
  263. else
  264. PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
  265. break;
  266. case ((uint32_t)PWM1):
  267. if (chn == PWM_CH_A)
  268. PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
  269. else
  270. PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
  271. break;
  272. case ((uint32_t)PWM2):
  273. if (chn == PWM_CH_A)
  274. PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
  275. else
  276. PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
  277. break;
  278. case ((uint32_t)PWM3):
  279. if (chn == PWM_CH_A)
  280. PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
  281. else
  282. PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
  283. break;
  284. case ((uint32_t)PWM4):
  285. if (chn == PWM_CH_A)
  286. PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
  287. else
  288. PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
  289. break;
  290. case ((uint32_t)PWM5):
  291. if (chn == PWM_CH_A)
  292. PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
  293. else
  294. PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
  295. break;
  296. }
  297. }
  298. /******************************************************************************************************************************************
  299. * 函数名称: PWM_IntNCycleDis()
  300. * 功能说明: 新周期开始中断禁能
  301. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  302. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  303. * 输 出: 无
  304. * 注意事项: 无
  305. ******************************************************************************************************************************************/
  306. void PWM_IntNCycleDis(PWM_TypeDef *PWMx, uint32_t chn)
  307. {
  308. switch ((uint32_t)PWMx)
  309. {
  310. case ((uint32_t)PWM0):
  311. if (chn == PWM_CH_A)
  312. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
  313. else
  314. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
  315. break;
  316. case ((uint32_t)PWM1):
  317. if (chn == PWM_CH_A)
  318. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
  319. else
  320. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
  321. break;
  322. case ((uint32_t)PWM2):
  323. if (chn == PWM_CH_A)
  324. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
  325. else
  326. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
  327. break;
  328. case ((uint32_t)PWM3):
  329. if (chn == PWM_CH_A)
  330. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
  331. else
  332. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
  333. break;
  334. case ((uint32_t)PWM4):
  335. if (chn == PWM_CH_A)
  336. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
  337. else
  338. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
  339. break;
  340. case ((uint32_t)PWM5):
  341. if (chn == PWM_CH_A)
  342. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
  343. else
  344. PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
  345. break;
  346. }
  347. }
  348. /******************************************************************************************************************************************
  349. * 函数名称: PWM_IntNCycleClr()
  350. * 功能说明: 新周期开始中断标志清除
  351. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  352. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  353. * 输 出: 无
  354. * 注意事项: 无
  355. ******************************************************************************************************************************************/
  356. void PWM_IntNCycleClr(PWM_TypeDef *PWMx, uint32_t chn)
  357. {
  358. switch ((uint32_t)PWMx)
  359. {
  360. case ((uint32_t)PWM0):
  361. if (chn == PWM_CH_A)
  362. PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
  363. else
  364. PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
  365. break;
  366. case ((uint32_t)PWM1):
  367. if (chn == PWM_CH_A)
  368. PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
  369. else
  370. PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
  371. break;
  372. case ((uint32_t)PWM2):
  373. if (chn == PWM_CH_A)
  374. PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
  375. else
  376. PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
  377. break;
  378. case ((uint32_t)PWM3):
  379. if (chn == PWM_CH_A)
  380. PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
  381. else
  382. PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
  383. break;
  384. case ((uint32_t)PWM4):
  385. if (chn == PWM_CH_A)
  386. PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
  387. else
  388. PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
  389. break;
  390. case ((uint32_t)PWM5):
  391. if (chn == PWM_CH_A)
  392. PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
  393. else
  394. PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
  395. break;
  396. }
  397. }
  398. /******************************************************************************************************************************************
  399. * 函数名称: PWM_IntNCycleStat()
  400. * 功能说明: 新周期开始中断是否发生
  401. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  402. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  403. * 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
  404. * 注意事项: 无
  405. ******************************************************************************************************************************************/
  406. uint32_t PWM_IntNCycleStat(PWM_TypeDef *PWMx, uint32_t chn)
  407. {
  408. uint32_t int_stat = 0;
  409. switch ((uint32_t)PWMx)
  410. {
  411. case ((uint32_t)PWM0):
  412. if (chn == PWM_CH_A)
  413. int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
  414. else
  415. int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
  416. break;
  417. case ((uint32_t)PWM1):
  418. if (chn == PWM_CH_A)
  419. int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
  420. else
  421. int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
  422. break;
  423. case ((uint32_t)PWM2):
  424. if (chn == PWM_CH_A)
  425. int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
  426. else
  427. int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
  428. break;
  429. case ((uint32_t)PWM3):
  430. if (chn == PWM_CH_A)
  431. int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
  432. else
  433. int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
  434. break;
  435. case ((uint32_t)PWM4):
  436. if (chn == PWM_CH_A)
  437. int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
  438. else
  439. int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
  440. break;
  441. case ((uint32_t)PWM5):
  442. if (chn == PWM_CH_A)
  443. int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
  444. else
  445. int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
  446. break;
  447. }
  448. return int_stat;
  449. }
  450. /******************************************************************************************************************************************
  451. * 函数名称: PWM_IntHEndEn()
  452. * 功能说明: 高电平结束中断使能
  453. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  454. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  455. * 输 出: 无
  456. * 注意事项: 无
  457. ******************************************************************************************************************************************/
  458. void PWM_IntHEndEn(PWM_TypeDef *PWMx, uint32_t chn)
  459. {
  460. switch ((uint32_t)PWMx)
  461. {
  462. case ((uint32_t)PWM0):
  463. if (chn == PWM_CH_A)
  464. PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
  465. else
  466. PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
  467. break;
  468. case ((uint32_t)PWM1):
  469. if (chn == PWM_CH_A)
  470. PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
  471. else
  472. PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
  473. break;
  474. case ((uint32_t)PWM2):
  475. if (chn == PWM_CH_A)
  476. PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
  477. else
  478. PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
  479. break;
  480. case ((uint32_t)PWM3):
  481. if (chn == PWM_CH_A)
  482. PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
  483. else
  484. PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
  485. break;
  486. case ((uint32_t)PWM4):
  487. if (chn == PWM_CH_A)
  488. PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
  489. else
  490. PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
  491. break;
  492. case ((uint32_t)PWM5):
  493. if (chn == PWM_CH_A)
  494. PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
  495. else
  496. PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
  497. break;
  498. }
  499. }
  500. /******************************************************************************************************************************************
  501. * 函数名称: PWM_IntHEndDis()
  502. * 功能说明: 高电平结束中断禁能
  503. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  504. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  505. * 输 出: 无
  506. * 注意事项: 无
  507. ******************************************************************************************************************************************/
  508. void PWM_IntHEndDis(PWM_TypeDef *PWMx, uint32_t chn)
  509. {
  510. switch ((uint32_t)PWMx)
  511. {
  512. case ((uint32_t)PWM0):
  513. if (chn == PWM_CH_A)
  514. PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
  515. else
  516. PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
  517. break;
  518. case ((uint32_t)PWM1):
  519. if (chn == PWM_CH_A)
  520. PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
  521. else
  522. PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
  523. break;
  524. case ((uint32_t)PWM2):
  525. if (chn == PWM_CH_A)
  526. PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
  527. else
  528. PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
  529. break;
  530. case ((uint32_t)PWM3):
  531. if (chn == PWM_CH_A)
  532. PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
  533. else
  534. PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
  535. break;
  536. case ((uint32_t)PWM4):
  537. if (chn == PWM_CH_A)
  538. PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
  539. else
  540. PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
  541. break;
  542. case ((uint32_t)PWM5):
  543. if (chn == PWM_CH_A)
  544. PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
  545. else
  546. PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
  547. break;
  548. }
  549. }
  550. /******************************************************************************************************************************************
  551. * 函数名称: PWM_IntHEndClr()
  552. * 功能说明: 高电平结束中断标志清除
  553. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  554. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  555. * 输 出: 无
  556. * 注意事项: 无
  557. ******************************************************************************************************************************************/
  558. void PWM_IntHEndClr(PWM_TypeDef *PWMx, uint32_t chn)
  559. {
  560. switch ((uint32_t)PWMx)
  561. {
  562. case ((uint32_t)PWM0):
  563. if (chn == PWM_CH_A)
  564. PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
  565. else
  566. PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
  567. break;
  568. case ((uint32_t)PWM1):
  569. if (chn == PWM_CH_A)
  570. PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
  571. else
  572. PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
  573. break;
  574. case ((uint32_t)PWM2):
  575. if (chn == PWM_CH_A)
  576. PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
  577. else
  578. PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
  579. break;
  580. case ((uint32_t)PWM3):
  581. if (chn == PWM_CH_A)
  582. PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
  583. else
  584. PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
  585. break;
  586. case ((uint32_t)PWM4):
  587. if (chn == PWM_CH_A)
  588. PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
  589. else
  590. PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
  591. break;
  592. case ((uint32_t)PWM5):
  593. if (chn == PWM_CH_A)
  594. PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
  595. else
  596. PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
  597. break;
  598. }
  599. }
  600. /******************************************************************************************************************************************
  601. * 函数名称: PWM_IntHEndStat()
  602. * 功能说明: 高电平结束中断是否发生
  603. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  604. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  605. * 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
  606. * 注意事项: 无
  607. ******************************************************************************************************************************************/
  608. uint32_t PWM_IntHEndStat(PWM_TypeDef *PWMx, uint32_t chn)
  609. {
  610. uint32_t int_stat = 0;
  611. switch ((uint32_t)PWMx)
  612. {
  613. case ((uint32_t)PWM0):
  614. if (chn == PWM_CH_A)
  615. int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
  616. else
  617. int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
  618. break;
  619. case ((uint32_t)PWM1):
  620. if (chn == PWM_CH_A)
  621. int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
  622. else
  623. int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
  624. break;
  625. case ((uint32_t)PWM2):
  626. if (chn == PWM_CH_A)
  627. int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
  628. else
  629. int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
  630. break;
  631. case ((uint32_t)PWM3):
  632. if (chn == PWM_CH_A)
  633. int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
  634. else
  635. int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
  636. break;
  637. case ((uint32_t)PWM4):
  638. if (chn == PWM_CH_A)
  639. int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
  640. else
  641. int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
  642. break;
  643. case ((uint32_t)PWM5):
  644. if (chn == PWM_CH_A)
  645. int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
  646. else
  647. int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
  648. break;
  649. }
  650. return int_stat;
  651. }