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