SWM320_pwm.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  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) PWMG->IE |= (0x01 << PWMG_IE_NEWP0A_Pos);
  262. else PWMG->IE |= (0x01 << PWMG_IE_NEWP0B_Pos);
  263. break;
  264. case((uint32_t)PWM1):
  265. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP1A_Pos);
  266. else PWMG->IE |= (0x01 << PWMG_IE_NEWP1B_Pos);
  267. break;
  268. case((uint32_t)PWM2):
  269. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP2A_Pos);
  270. else PWMG->IE |= (0x01 << PWMG_IE_NEWP2B_Pos);
  271. break;
  272. case((uint32_t)PWM3):
  273. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP3A_Pos);
  274. else PWMG->IE |= (0x01 << PWMG_IE_NEWP3B_Pos);
  275. break;
  276. case((uint32_t)PWM4):
  277. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP4A_Pos);
  278. else PWMG->IE |= (0x01 << PWMG_IE_NEWP4B_Pos);
  279. break;
  280. case((uint32_t)PWM5):
  281. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_NEWP5A_Pos);
  282. else PWMG->IE |= (0x01 << PWMG_IE_NEWP5B_Pos);
  283. break;
  284. }
  285. }
  286. /******************************************************************************************************************************************
  287. * 函数名称: PWM_IntNCycleDis()
  288. * 功能说明: 新周期开始中断禁能
  289. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  290. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  291. * 输 出: 无
  292. * 注意事项: 无
  293. ******************************************************************************************************************************************/
  294. void PWM_IntNCycleDis(PWM_TypeDef * PWMx, uint32_t chn)
  295. {
  296. switch((uint32_t)PWMx)
  297. {
  298. case((uint32_t)PWM0):
  299. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0A_Pos);
  300. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP0B_Pos);
  301. break;
  302. case((uint32_t)PWM1):
  303. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1A_Pos);
  304. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP1B_Pos);
  305. break;
  306. case((uint32_t)PWM2):
  307. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2A_Pos);
  308. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP2B_Pos);
  309. break;
  310. case((uint32_t)PWM3):
  311. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3A_Pos);
  312. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP3B_Pos);
  313. break;
  314. case((uint32_t)PWM4):
  315. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4A_Pos);
  316. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP4B_Pos);
  317. break;
  318. case((uint32_t)PWM5):
  319. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5A_Pos);
  320. else PWMG->IE &= ~(0x01 << PWMG_IE_NEWP5B_Pos);
  321. break;
  322. }
  323. }
  324. /******************************************************************************************************************************************
  325. * 函数名称: PWM_IntNCycleClr()
  326. * 功能说明: 新周期开始中断标志清除
  327. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  328. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  329. * 输 出: 无
  330. * 注意事项: 无
  331. ******************************************************************************************************************************************/
  332. void PWM_IntNCycleClr(PWM_TypeDef * PWMx, uint32_t chn)
  333. {
  334. switch((uint32_t)PWMx)
  335. {
  336. case((uint32_t)PWM0):
  337. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP0A_Pos);
  338. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP0B_Pos);
  339. break;
  340. case((uint32_t)PWM1):
  341. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP1A_Pos);
  342. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP1B_Pos);
  343. break;
  344. case((uint32_t)PWM2):
  345. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP2A_Pos);
  346. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP2B_Pos);
  347. break;
  348. case((uint32_t)PWM3):
  349. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP3A_Pos);
  350. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP3B_Pos);
  351. break;
  352. case((uint32_t)PWM4):
  353. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP4A_Pos);
  354. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP4B_Pos);
  355. break;
  356. case((uint32_t)PWM5):
  357. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_NEWP5A_Pos);
  358. else PWMG->IRS = (0x01 << PWMG_IRS_NEWP5B_Pos);
  359. break;
  360. }
  361. }
  362. /******************************************************************************************************************************************
  363. * 函数名称: PWM_IntNCycleStat()
  364. * 功能说明: 新周期开始中断是否发生
  365. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  366. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  367. * 输 出: uint32_t 1 新周期开始中断已发生 0 新周期开始中断未发生
  368. * 注意事项: 无
  369. ******************************************************************************************************************************************/
  370. uint32_t PWM_IntNCycleStat(PWM_TypeDef * PWMx, uint32_t chn)
  371. {
  372. uint32_t int_stat = 0;
  373. switch((uint32_t)PWMx)
  374. {
  375. case((uint32_t)PWM0):
  376. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP0A_Msk);
  377. else int_stat = (PWMG->IF & PWMG_IF_NEWP0B_Msk);
  378. break;
  379. case((uint32_t)PWM1):
  380. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP1A_Msk);
  381. else int_stat = (PWMG->IF & PWMG_IF_NEWP1B_Msk);
  382. break;
  383. case((uint32_t)PWM2):
  384. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP2A_Msk);
  385. else int_stat = (PWMG->IF & PWMG_IF_NEWP2B_Msk);
  386. break;
  387. case((uint32_t)PWM3):
  388. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP3A_Msk);
  389. else int_stat = (PWMG->IF & PWMG_IF_NEWP3B_Msk);
  390. break;
  391. case((uint32_t)PWM4):
  392. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP4A_Msk);
  393. else int_stat = (PWMG->IF & PWMG_IF_NEWP4B_Msk);
  394. break;
  395. case((uint32_t)PWM5):
  396. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_NEWP5A_Msk);
  397. else int_stat = (PWMG->IF & PWMG_IF_NEWP5B_Msk);
  398. break;
  399. }
  400. return int_stat;
  401. }
  402. /******************************************************************************************************************************************
  403. * 函数名称: PWM_IntHEndEn()
  404. * 功能说明: 高电平结束中断使能
  405. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  406. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  407. * 输 出: 无
  408. * 注意事项: 无
  409. ******************************************************************************************************************************************/
  410. void PWM_IntHEndEn(PWM_TypeDef * PWMx, uint32_t chn)
  411. {
  412. switch((uint32_t)PWMx)
  413. {
  414. case((uint32_t)PWM0):
  415. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND0A_Pos);
  416. else PWMG->IE |= (0x01 << PWMG_IE_HEND0B_Pos);
  417. break;
  418. case((uint32_t)PWM1):
  419. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND1A_Pos);
  420. else PWMG->IE |= (0x01 << PWMG_IE_HEND1B_Pos);
  421. break;
  422. case((uint32_t)PWM2):
  423. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND2A_Pos);
  424. else PWMG->IE |= (0x01 << PWMG_IE_HEND2B_Pos);
  425. break;
  426. case((uint32_t)PWM3):
  427. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND3A_Pos);
  428. else PWMG->IE |= (0x01 << PWMG_IE_HEND3B_Pos);
  429. break;
  430. case((uint32_t)PWM4):
  431. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND4A_Pos);
  432. else PWMG->IE |= (0x01 << PWMG_IE_HEND4B_Pos);
  433. break;
  434. case((uint32_t)PWM5):
  435. if(chn == PWM_CH_A) PWMG->IE |= (0x01 << PWMG_IE_HEND5A_Pos);
  436. else PWMG->IE |= (0x01 << PWMG_IE_HEND5B_Pos);
  437. break;
  438. }
  439. }
  440. /******************************************************************************************************************************************
  441. * 函数名称: PWM_IntHEndDis()
  442. * 功能说明: 高电平结束中断禁能
  443. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  444. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  445. * 输 出: 无
  446. * 注意事项: 无
  447. ******************************************************************************************************************************************/
  448. void PWM_IntHEndDis(PWM_TypeDef * PWMx, uint32_t chn)
  449. {
  450. switch((uint32_t)PWMx)
  451. {
  452. case((uint32_t)PWM0):
  453. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND0A_Pos);
  454. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND0B_Pos);
  455. break;
  456. case((uint32_t)PWM1):
  457. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND1A_Pos);
  458. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND1B_Pos);
  459. break;
  460. case((uint32_t)PWM2):
  461. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND2A_Pos);
  462. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND2B_Pos);
  463. break;
  464. case((uint32_t)PWM3):
  465. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND3A_Pos);
  466. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND3B_Pos);
  467. break;
  468. case((uint32_t)PWM4):
  469. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND4A_Pos);
  470. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND4B_Pos);
  471. break;
  472. case((uint32_t)PWM5):
  473. if(chn == PWM_CH_A) PWMG->IE &= ~(0x01 << PWMG_IE_HEND5A_Pos);
  474. else PWMG->IE &= ~(0x01 << PWMG_IE_HEND5B_Pos);
  475. break;
  476. }
  477. }
  478. /******************************************************************************************************************************************
  479. * 函数名称: PWM_IntHEndClr()
  480. * 功能说明: 高电平结束中断标志清除
  481. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  482. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  483. * 输 出: 无
  484. * 注意事项: 无
  485. ******************************************************************************************************************************************/
  486. void PWM_IntHEndClr(PWM_TypeDef * PWMx, uint32_t chn)
  487. {
  488. switch((uint32_t)PWMx)
  489. {
  490. case((uint32_t)PWM0):
  491. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND0A_Pos);
  492. else PWMG->IRS = (0x01 << PWMG_IRS_HEND0B_Pos);
  493. break;
  494. case((uint32_t)PWM1):
  495. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND1A_Pos);
  496. else PWMG->IRS = (0x01 << PWMG_IRS_HEND1B_Pos);
  497. break;
  498. case((uint32_t)PWM2):
  499. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND2A_Pos);
  500. else PWMG->IRS = (0x01 << PWMG_IRS_HEND2B_Pos);
  501. break;
  502. case((uint32_t)PWM3):
  503. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND3A_Pos);
  504. else PWMG->IRS = (0x01 << PWMG_IRS_HEND3B_Pos);
  505. break;
  506. case((uint32_t)PWM4):
  507. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND4A_Pos);
  508. else PWMG->IRS = (0x01 << PWMG_IRS_HEND4B_Pos);
  509. break;
  510. case((uint32_t)PWM5):
  511. if(chn == PWM_CH_A) PWMG->IRS = (0x01 << PWMG_IRS_HEND5A_Pos);
  512. else PWMG->IRS = (0x01 << PWMG_IRS_HEND5B_Pos);
  513. break;
  514. }
  515. }
  516. /******************************************************************************************************************************************
  517. * 函数名称: PWM_IntHEndStat()
  518. * 功能说明: 高电平结束中断是否发生
  519. * 输 入: PWM_TypeDef * PWMx 指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4、PWM5
  520. * uint32_t chn 选择要设置哪个通道,有效值:PWM_CH_A、PWM_CH_B
  521. * 输 出: uint32_t 1 高电平结束中断已发生 0 高电平结束中断未发生
  522. * 注意事项: 无
  523. ******************************************************************************************************************************************/
  524. uint32_t PWM_IntHEndStat(PWM_TypeDef * PWMx, uint32_t chn)
  525. {
  526. uint32_t int_stat = 0;
  527. switch((uint32_t)PWMx)
  528. {
  529. case((uint32_t)PWM0):
  530. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND0A_Msk);
  531. else int_stat = (PWMG->IF & PWMG_IF_HEND0B_Msk);
  532. break;
  533. case((uint32_t)PWM1):
  534. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND1A_Msk);
  535. else int_stat = (PWMG->IF & PWMG_IF_HEND1B_Msk);
  536. break;
  537. case((uint32_t)PWM2):
  538. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND2A_Msk);
  539. else int_stat = (PWMG->IF & PWMG_IF_HEND2B_Msk);
  540. break;
  541. case((uint32_t)PWM3):
  542. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND3A_Msk);
  543. else int_stat = (PWMG->IF & PWMG_IF_HEND3B_Msk);
  544. break;
  545. case((uint32_t)PWM4):
  546. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND4A_Msk);
  547. else int_stat = (PWMG->IF & PWMG_IF_HEND4B_Msk);
  548. break;
  549. case((uint32_t)PWM5):
  550. if(chn == PWM_CH_A) int_stat = (PWMG->IF & PWMG_IF_HEND5A_Msk);
  551. else int_stat = (PWMG->IF & PWMG_IF_HEND5B_Msk);
  552. break;
  553. }
  554. return int_stat;
  555. }