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