1 /******************************************************************************************************************************************
2 * 文件名称: SWM341_pwm.c
3 * 功能说明: SWM341单片机的PWM功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.0.0      2016年1月30日
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 "SWM341.h"
22 #include "SWM341_pwm.h"
23 
24 
25 /******************************************************************************************************************************************
26 * 函数名称: PWM_Init()
27 * 功能说明: PWM初始化
28 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
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     SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_PWM_Pos);
36 
37     PWMx->CR = (initStruct->Mode         << PWM_CR_MODE_Pos)   |
38                (1                        << PWM_CR_MULT_Pos)   |    // 多次计数模式(即非单次)
39                (0                        << PWM_CR_DIR_Pos)    |    // 向上计数
40                (0                        << PWM_CR_CLKSRC_Pos) |    // 系统时钟
41                ((initStruct->Clkdiv - 1) << PWM_CR_CLKDIV_Pos) |
42                (0                        << PWM_CR_RPTNUM_Pos); // 每次计数器溢出都执行寄存器重加载
43 
44     PWMx->OCR = ((initStruct->IdleLevelA  ? 1 : 0) << PWM_OCR_IDLEA_Pos)  |
45                 ((initStruct->IdleLevelB  ? 1 : 0) << PWM_OCR_IDLEB_Pos)  |
46                 ((initStruct->IdleLevelAN ? 1 : 0) << PWM_OCR_IDLEAN_Pos) |
47                 ((initStruct->IdleLevelBN ? 1 : 0) << PWM_OCR_IDLEBN_Pos) |
48                 ((initStruct->OutputInvA  ? 1 : 0) << PWM_OCR_INVA_Pos)   |
49                 ((initStruct->OutputInvB  ? 1 : 0) << PWM_OCR_INVB_Pos)   |
50                 ((initStruct->OutputInvAN ? 1 : 0) << PWM_OCR_INVAN_Pos)  |
51                 ((initStruct->OutputInvBN ? 1 : 0) << PWM_OCR_INVBN_Pos);
52 
53     PWMx->PERIOD = initStruct->Period - 1;
54 
55     PWMx->CMPA  = initStruct->HdutyA;
56     PWMx->CMPA2 = initStruct->HdutyA2;
57     PWMx->DZA   = initStruct->DeadzoneA;
58 
59     PWMx->CMPB  = initStruct->HdutyB;
60     PWMx->CMPB2 = initStruct->HdutyB2;
61     PWMx->DZB   = initStruct->DeadzoneB;
62 
63     PWMG->RELOADEN = 0x3F;
64 
65     PWMx->IF = 0x3F;
66     PWMx->IE = ((initStruct->UpOvfIE    ? 1 : 0) << PWM_IE_UPOVF_Pos)  |
67                ((initStruct->DownOvfIE  ? 1 : 0) << PWM_IE_DNOVF_Pos)  |
68                ((initStruct->UpCmpAIE   ? 1 : 0) << PWM_IE_UPCMPA_Pos) |
69                ((initStruct->DownCmpAIE ? 1 : 0) << PWM_IE_DNCMPA_Pos) |
70                ((initStruct->UpCmpBIE   ? 1 : 0) << PWM_IE_UPCMPB_Pos) |
71                ((initStruct->DownCmpBIE ? 1 : 0) << PWM_IE_DNCMPB_Pos);
72 
73     if(initStruct->UpOvfIE || initStruct->DownOvfIE || initStruct->UpCmpAIE ||
74        initStruct->DownCmpAIE || initStruct->UpCmpBIE || initStruct->DownCmpBIE)
75     {
76         switch((uint32_t)PWMx)
77         {
78         case((uint32_t)PWM0):
79             NVIC_EnableIRQ(PWM0_IRQn);
80             break;
81 
82         case((uint32_t)PWM1):
83             NVIC_EnableIRQ(PWM1_IRQn);
84             break;
85 
86         case((uint32_t)PWM2):
87             NVIC_EnableIRQ(PWM2_IRQn);
88             break;
89 
90         case((uint32_t)PWM3):
91             NVIC_EnableIRQ(PWM3_IRQn);
92             break;
93 
94         case((uint32_t)PWM4):
95             NVIC_EnableIRQ(PWM4_IRQn);
96             break;
97         }
98     }
99 }
100 
101 /******************************************************************************************************************************************
102 * 函数名称: PWM_Start()
103 * 功能说明: 启动PWM,开始PWM输出
104 * 输    入: uint32_t pwm          PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
105 * 输    出: 无
106 * 注意事项: 无
107 ******************************************************************************************************************************************/
PWM_Start(uint32_t pwm)108 void PWM_Start(uint32_t pwm)
109 {
110     PWMG->START |= pwm;
111 }
112 
113 /******************************************************************************************************************************************
114 * 函数名称: PWM_Stop()
115 * 功能说明: 关闭PWM,停止PWM输出
116 * 输    入: uint32_t pwm          PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
117 * 输    出: 无
118 * 注意事项: 无
119 ******************************************************************************************************************************************/
PWM_Stop(uint32_t pwm)120 void PWM_Stop(uint32_t pwm)
121 {
122     PWMG->START &= ~pwm;
123 }
124 
125 /******************************************************************************************************************************************
126 * 函数名称: PWM_Restart()
127 * 功能说明: 重启PWM,将PWM计数器清零,然后使用新的周期、高电平时长、死区时长设定值开始计数
128 * 输    入: uint32_t pwm          PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
129 * 输    出: 无
130 * 注意事项: 无
131 ******************************************************************************************************************************************/
PWM_Restart(uint32_t pwm)132 void PWM_Restart(uint32_t pwm)
133 {
134     PWMG->RESTART = (pwm << PWMG_RESTART_PWM0_Pos);
135 }
136 
137 /******************************************************************************************************************************************
138 * 函数名称: PWM_ReloadEn()
139 * 功能说明: 只有当 Reload Enable 时,写入 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器的值才会(在计数器溢出时)加载到内部工作寄存器
140 * 输    入: uint32_t pwm          PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
141 * 输    出: 无
142 * 注意事项: 如果需要保证在写 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器过程中,这些寄存器的值不会被加载到内部工作寄存器,可以如下操作:
143 *           第一步、PWM_ReloadDis(PWM0_MSK | PWM1_MSK);
144 *           第二步、写 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器
145 *           第三步、PWM_ReloadEn(PWM0_MSK | PWM1_MSK);
146 ******************************************************************************************************************************************/
PWM_ReloadEn(uint32_t pwm)147 void PWM_ReloadEn(uint32_t pwm)
148 {
149     PWMG->RELOADEN |= pwm;
150 }
151 
152 /******************************************************************************************************************************************
153 * 函数名称: PWM_ReloadDis()
154 * 功能说明: 只有当 Reload Enable 时,写入 PERIOD、CMPA、CMPB、DZA、DZB 等寄存器的值才会(在计数器溢出时)加载到内部工作寄存器
155 * 输    入: uint32_t pwm          PWM0_MSK、PWM1_MSK、PWM2_MSK、PWM3_MSK、PWM4_MSK、PWM5_MSK 及其“或”
156 * 输    出: 无
157 * 注意事项: 无
158 ******************************************************************************************************************************************/
PWM_ReloadDis(uint32_t pwm)159 void PWM_ReloadDis(uint32_t pwm)
160 {
161     PWMG->RELOADEN &= ~pwm;
162 }
163 
164 /******************************************************************************************************************************************
165 * 函数名称: PWM_BrkInPolarity()
166 * 功能说明: 设置刹车输入有效极性
167 * 输    入: uint32_t brk          PWM_BRK0、PWM_BRK1、PWM_BRK2 及其“或”
168 *           uint32_t level          0 低电平刹车   1 高电平刹车
169 * 输    出: 无
170 * 注意事项: 无
171 ******************************************************************************************************************************************/
PWM_BrkInPolarity(uint32_t brk,uint32_t level)172 void PWM_BrkInPolarity(uint32_t brk, uint32_t level)
173 {
174     if(level)
175         PWMG->BRKPOL |= brk;
176     else
177         PWMG->BRKPOL &= ~brk;
178 }
179 
180 /******************************************************************************************************************************************
181 * 函数名称: PWM_BrkConfig()
182 * 功能说明: 刹车配置
183 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
184 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
185 *           uint32_t brk            刹车输入,PWM_BRK0、PWM_BRK1、PWM_BRK2 及其“或”
186 *           uint32_t out            刹车过程中PWMxA/PWMxB输出电平
187 *           uint32_t outN           刹车过程中PWMxAN/PWMxBN输出电平
188 *           uint32_t outHold        刹车信号撤销后,0 输出立即恢复   1 输出保持到计数器溢出再恢复
189 *           uint32_t stpCount       刹车状态下是否停止计数,1 停止计数
190 * 输    出: 无
191 * 注意事项: 无
192 ******************************************************************************************************************************************/
PWM_BrkConfig(PWM_TypeDef * PWMx,uint32_t chn,uint32_t brk,uint32_t out,uint32_t outN,uint32_t outHold,uint32_t stpCount)193 void PWM_BrkConfig(PWM_TypeDef * PWMx, uint32_t chn, uint32_t brk, uint32_t out, uint32_t outN, uint32_t outHold, uint32_t stpCount)
194 {
195     if(chn == PWM_CH_A)
196     {
197         PWMx->BRKIN &= ~(0x7 << PWM_BRKIN_BRK0A_Pos);
198         PWMx->BRKIN |=  (brk << PWM_BRKIN_BRK0A_Pos);
199 
200         PWMx->BRKCR &= ~(PWM_BRKCR_OUTA_Msk | PWM_BRKCR_OUTAN_Msk | PWM_BRKCR_OFFA_Msk);
201         PWMx->BRKCR |= (out      << PWM_BRKCR_OUTA_Pos)  |
202                        (outN     << PWM_BRKCR_OUTAN_Pos) |
203                        (outHold  << PWM_BRKCR_OFFA_Pos)  |
204                        (stpCount << PWM_BRKCR_STPCNT_Pos);
205     }
206     else
207     {
208         PWMx->BRKIN &= ~(0x7 << PWM_BRKIN_BRK0B_Pos);
209         PWMx->BRKIN |=  (brk << PWM_BRKIN_BRK0B_Pos);
210 
211         PWMx->BRKCR &= ~(PWM_BRKCR_OUTB_Msk | PWM_BRKCR_OUTBN_Msk | PWM_BRKCR_OFFB_Msk);
212         PWMx->BRKCR |= (out      << PWM_BRKCR_OUTB_Pos)  |
213                        (outN     << PWM_BRKCR_OUTBN_Pos) |
214                        (outHold  << PWM_BRKCR_OFFB_Pos)  |
215                        (stpCount << PWM_BRKCR_STPCNT_Pos);
216     }
217 }
218 
219 /******************************************************************************************************************************************
220 * 函数名称: PWM_OvfTrigger()
221 * 功能说明: 计数器溢出时发出触发信号配置
222 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
223 *           uint32_t en_up          向上计数时,计数器溢出是否发出触发信号
224 *           uint32_t en_down        向下计数时,计数器溢出是否发出触发信号
225 *           uint32_t trig_chn       触发信号有8个通道,选择此触发信号输出到哪个通道,取值PWM_TRG_0、PWM_TRG_1、...、PWM_TRG_7
226 * 输    出: 无
227 * 注意事项: 无
228 ******************************************************************************************************************************************/
PWM_OvfTrigger(PWM_TypeDef * PWMx,uint32_t en_up,uint32_t en_down,uint32_t trig_chn)229 void PWM_OvfTrigger(PWM_TypeDef * PWMx, uint32_t en_up, uint32_t en_down, uint32_t trig_chn)
230 {
231     PWMx->OVFTRG = (en_up    << PWM_OVFTRG_UPEN_Pos) |
232                    (en_down  << PWM_OVFTRG_DNEN_Pos) |
233                    (trig_chn << PWM_OVFTRG_MUX_Pos);
234 }
235 
236 /******************************************************************************************************************************************
237 * 函数名称: PWM_CmpTrigger()
238 * 功能说明: 计数器等于指定数值时发出触发信号配置
239 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
240 *           uint16_t match          计数值等于match时发出触发信号
241 *           uint32_t dir            PWM_DIR_UP 向上计数时计数器与match值比较   PWM_DIR_DOWN 向下计数时计数器与match值比较
242 *           uint32_t width          发出的触发信号的宽度,0 无输出   1 4个时钟周期   2 8个时钟周期    ...   63 252个时钟周期
243 *           uint32_t trig_chn       触发信号有8个通道,选择此触发信号输出到哪个通道,,取值PWM_TRG_0、PWM_TRG_1、...、PWM_TRG_7
244 *           uint32_t adc_trig_pos   在发出指定宽度触发信号的同时,还会在该触发信号宽度的 adc_trig_pos/8 位置处发出adc触发信号,取值0--7
245 * 输    出: 无
246 * 注意事项: 无
247 ******************************************************************************************************************************************/
PWM_CmpTrigger(PWM_TypeDef * PWMx,uint16_t match,uint32_t dir,uint32_t width,uint32_t trig_chn,uint32_t adc_trig_pos)248 void PWM_CmpTrigger(PWM_TypeDef * PWMx, uint16_t match, uint32_t dir, uint32_t width, uint32_t trig_chn, uint32_t adc_trig_pos)
249 {
250     PWMx->CMPTRG = (1        << PWM_CMPTRG_EN_Pos)    |
251                    (match    << PWM_CMPTRG_CMP_Pos)   |
252                    (dir      << PWM_CMPTRG_DIR_Pos)   |
253                    (width    << PWM_CMPTRG_WIDTH_Pos) |
254                    (trig_chn << PWM_CMPTRG_MUX_Pos);
255 
256     PWM0->CMPTRG &= ~PWM_CMPTRG_ATP_Msk;
257     PWM0->CMPTRG |= (adc_trig_pos << PWM_CMPTRG_ATP_Pos);
258 }
259 
260 /******************************************************************************************************************************************
261 * 函数名称: PWM_OutMask()
262 * 功能说明: 输出屏蔽,当指定输入信号为高时,PWM输出固定电平
263 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
264 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
265 *           uint32_t evt            PWMxY 由哪路 event 输入信号屏蔽,取值PWM_EVT_DIS、PWM_EVT_0、PWM_EVT_1、...、PWM_EVT_6
266 *           uint32_t out            PWMxY 输出被屏蔽时输出什么电平
267 *           uint32_t evt_n          PWMxYN由哪路 event 输入信号屏蔽,取值PWM_EVT_DIS、PWM_EVT_0、PWM_EVT_1、...、PWM_EVT_6
268 *           uint32_t out_n          PWMxYN输出被屏蔽时输出什么电平
269 * 输    出: 无
270 * 注意事项: 无
271 ******************************************************************************************************************************************/
PWM_OutMask(PWM_TypeDef * PWMx,uint32_t chn,uint32_t evt,uint32_t out,uint32_t evt_n,uint32_t out_n)272 void PWM_OutMask(PWM_TypeDef * PWMx, uint32_t chn, uint32_t evt, uint32_t out, uint32_t evt_n, uint32_t out_n)
273 {
274     if(chn == PWM_CH_A)
275     {
276         PWMx->EVMUX &= ~(PWM_EVMUX_MASKA_Msk | PWM_EVMUX_MASKAN_Msk);
277         PWMx->EVMUX |= (evt   << PWM_EVMUX_MASKA_Pos) |
278                        (evt_n << PWM_EVMUX_MASKAN_Pos);
279 
280         PWMx->EVMSK &= ~(PWM_EVMSK_OUTA_Msk | PWM_EVMSK_OUTAN_Msk);
281         PWMx->EVMSK |= (out   << PWM_EVMSK_OUTA_Pos)  |
282                        (out_n << PWM_EVMSK_OUTAN_Pos) |
283                        (1     << PWM_EVMSK_IMME_Pos);
284     }
285     else
286     {
287         PWMx->EVMUX &= ~(PWM_EVMUX_MASKB_Msk | PWM_EVMUX_MASKBN_Msk);
288         PWMx->EVMUX |= (evt   << PWM_EVMUX_MASKB_Pos) |
289                        (evt_n << PWM_EVMUX_MASKBN_Pos);
290 
291         PWMx->EVMSK &= ~(PWM_EVMSK_OUTB_Msk | PWM_EVMSK_OUTBN_Msk);
292         PWMx->EVMSK |= (out   << PWM_EVMSK_OUTB_Pos)  |
293                        (out_n << PWM_EVMSK_OUTBN_Pos) |
294                        (1     << PWM_EVMSK_IMME_Pos);
295     }
296 }
297 
298 /******************************************************************************************************************************************
299 * 函数名称: PWM_SetPeriod()
300 * 功能说明: 设置周期
301 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
302 *           uint16_t period         要设定的周期值
303 * 输    出: 无
304 * 注意事项: 无
305 ******************************************************************************************************************************************/
PWM_SetPeriod(PWM_TypeDef * PWMx,uint16_t period)306 void PWM_SetPeriod(PWM_TypeDef * PWMx, uint16_t period)
307 {
308     PWMx->PERIOD = period - 1;
309 }
310 
311 /******************************************************************************************************************************************
312 * 函数名称: PWM_GetPeriod()
313 * 功能说明: 获取周期
314 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
315 * 输    出: uint16_t              获取到的周期值
316 * 注意事项: 无
317 ******************************************************************************************************************************************/
PWM_GetPeriod(PWM_TypeDef * PWMx)318 uint16_t PWM_GetPeriod(PWM_TypeDef * PWMx)
319 {
320     return PWMx->PERIOD + 1;
321 }
322 
323 /******************************************************************************************************************************************
324 * 函数名称: PWM_SetHDuty()
325 * 功能说明: 设置高电平时长
326 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
327 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
328 *           uint16_t hduty          要设定的高电平时长
329 * 输    出: 无
330 * 注意事项: 无
331 ******************************************************************************************************************************************/
PWM_SetHDuty(PWM_TypeDef * PWMx,uint32_t chn,uint16_t hduty)332 void PWM_SetHDuty(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty)
333 {
334     if(chn == PWM_CH_A)
335         PWMx->CMPA = hduty;
336     else
337         PWMx->CMPB = hduty;
338 }
339 
340 /******************************************************************************************************************************************
341 * 函数名称: PWM_GetHDuty()
342 * 功能说明: 获取高电平时长
343 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
344 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
345 * 输    出: uint16_t              获取到的高电平时长
346 * 注意事项: 无
347 ******************************************************************************************************************************************/
PWM_GetHDuty(PWM_TypeDef * PWMx,uint32_t chn)348 uint16_t PWM_GetHDuty(PWM_TypeDef * PWMx, uint32_t chn)
349 {
350     if(chn == PWM_CH_A)
351         return PWMx->CMPA;
352     else
353         return PWMx->CMPB;
354 }
355 
356 /******************************************************************************************************************************************
357 * 函数名称: PWM_SetHDuty2()
358 * 功能说明: 设置高电平时长,用于非对称中心对齐模式
359 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
360 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
361 *           uint16_t hduty          要设定的前半周期高电平时长
362 *           uint16_t hduty2         要设定的后半周期高电平时长
363 * 输    出: 无
364 * 注意事项: 无
365 ******************************************************************************************************************************************/
PWM_SetHDuty2(PWM_TypeDef * PWMx,uint32_t chn,uint16_t hduty,uint16_t hduty2)366 void PWM_SetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t hduty, uint16_t hduty2)
367 {
368     if(chn == PWM_CH_A)
369     {
370         PWMx->CMPA  = hduty;
371         PWMx->CMPA2 = hduty2;
372     }
373     else
374     {
375         PWMx->CMPB  = hduty;
376         PWMx->CMPB2 = hduty2;
377     }
378 }
379 
380 /******************************************************************************************************************************************
381 * 函数名称: PWM_GetHDuty2()
382 * 功能说明: 获取高电平时长,用于非对称中心对齐模式
383 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
384 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
385 * 输    出: uint16_t *hduty           获取到的前半周期高电平时长
386 *           uint16_t *hduty2        获取到的后半周期高电平时长
387 * 注意事项: 无
388 ******************************************************************************************************************************************/
PWM_GetHDuty2(PWM_TypeDef * PWMx,uint32_t chn,uint16_t * hduty,uint16_t * hduty2)389 void PWM_GetHDuty2(PWM_TypeDef * PWMx, uint32_t chn, uint16_t *hduty, uint16_t *hduty2)
390 {
391     if(chn == PWM_CH_A)
392     {
393         *hduty  = PWMx->CMPA;
394         *hduty2 = PWMx->CMPA2;
395     }
396     else
397     {
398         *hduty  = PWMx->CMPB;
399         *hduty2 = PWMx->CMPB2;
400     }
401 }
402 
403 /******************************************************************************************************************************************
404 * 函数名称: PWM_SetDeadzone()
405 * 功能说明: 设置死区时长
406 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
407 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
408 *           uint16_t deadzone       要设定的死区时长,取值范围0--1023
409 * 输    出: 无
410 * 注意事项: 无
411 ******************************************************************************************************************************************/
PWM_SetDeadzone(PWM_TypeDef * PWMx,uint32_t chn,uint16_t deadzone)412 void PWM_SetDeadzone(PWM_TypeDef * PWMx, uint32_t chn, uint16_t deadzone)
413 {
414     if(chn == PWM_CH_A)
415         PWMx->DZA = deadzone;
416     else
417         PWMx->DZB = deadzone;
418 }
419 
420 /******************************************************************************************************************************************
421 * 函数名称: PWM_GetDeadzone()
422 * 功能说明: 获取死区时长
423 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
424 *           uint32_t chn            指定要被设置的PWM通道,有效值包括PWM_CH_A、PWM_CH_B
425 * 输    出: uint16_t              获取到的死区时长
426 * 注意事项: 无
427 ******************************************************************************************************************************************/
PWM_GetDeadzone(PWM_TypeDef * PWMx,uint32_t chn)428 uint16_t PWM_GetDeadzone(PWM_TypeDef * PWMx, uint32_t chn)
429 {
430     if(chn == PWM_CH_A)
431         return PWMx->DZA;
432     else
433         return PWMx->DZB;
434 }
435 
436 
437 /******************************************************************************************************************************************
438 * 函数名称: PWM_IntEn()
439 * 功能说明: 中断使能
440 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
441 *           uint32_t it             interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
442 *                                   PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
443 * 输    出: 无
444 * 注意事项: 无
445 ******************************************************************************************************************************************/
PWM_IntEn(PWM_TypeDef * PWMx,uint32_t it)446 void PWM_IntEn(PWM_TypeDef * PWMx, uint32_t it)
447 {
448     PWMx->IE |= it;
449 }
450 
451 /******************************************************************************************************************************************
452 * 函数名称: PWM_IntDis()
453 * 功能说明: 中断禁能
454 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
455 *           uint32_t it             interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
456 *                                   PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
457 * 输    出: 无
458 * 注意事项: 无
459 ******************************************************************************************************************************************/
PWM_IntDis(PWM_TypeDef * PWMx,uint32_t it)460 void PWM_IntDis(PWM_TypeDef * PWMx, uint32_t it)
461 {
462     PWMx->IE &= ~it;
463 }
464 
465 /******************************************************************************************************************************************
466 * 函数名称: PWM_IntClr()
467 * 功能说明:中断标志清除
468 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
469 *           uint32_t it             interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
470 *                                   PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
471 * 输    出: 无
472 * 注意事项: 无
473 ******************************************************************************************************************************************/
PWM_IntClr(PWM_TypeDef * PWMx,uint32_t it)474 void PWM_IntClr(PWM_TypeDef * PWMx, uint32_t it)
475 {
476     PWMx->IF = it;
477 }
478 
479 /******************************************************************************************************************************************
480 * 函数名称: PWM_IntStat()
481 * 功能说明: 中断标志查询
482 * 输    入: PWM_TypeDef * PWMx        指定要被设置的PWM,有效值包括PWM0、PWM1、PWM2、PWM3、PWM4
483 *           uint32_t it             interrupt type,有效值包括PWM_IT_OVF_UP、PWM_IT_OVF_DOWN、PWM_IT_CMPA_UP、PWM_IT_CMPB_UP、
484 *                                   PWM_IT_CMPA_DOWN、PWM_IT_CMPB_DOWN 及其“或”
485 * 输    出: uint32_t              0 中断标志未置起   非0 中断标志已置起
486 * 注意事项: 无
487 ******************************************************************************************************************************************/
PWM_IntStat(PWM_TypeDef * PWMx,uint32_t it)488 uint32_t PWM_IntStat(PWM_TypeDef * PWMx, uint32_t it)
489 {
490     return (PWMx->IF & it);
491 }
492 
493 /******************************************************************************************************************************************
494 * 函数名称: PWM_BrkIntEn()
495 * 功能说明: 刹车中断使能
496 * 输    入: uint32_t brkit            brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
497 * 输    出: 无
498 * 注意事项: 无
499 ******************************************************************************************************************************************/
PWM_BrkIntEn(uint32_t brkit)500 void PWM_BrkIntEn(uint32_t brkit)
501 {
502     PWMG->BRKIE |= brkit;
503 }
504 
505 /******************************************************************************************************************************************
506 * 函数名称: PWM_BrkIntDis()
507 * 功能说明: 刹车中断禁能
508 * 输    入: uint32_t brkit            brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
509 * 输    出: 无
510 * 注意事项: 无
511 ******************************************************************************************************************************************/
PWM_BrkIntDis(uint32_t brkit)512 void PWM_BrkIntDis(uint32_t brkit)
513 {
514     PWMG->BRKIE &= ~brkit;
515 }
516 
517 /******************************************************************************************************************************************
518 * 函数名称: PWM_BrkIntClr()
519 * 功能说明:中断标志清除
520 * 输    入: uint32_t brkit            brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
521 * 输    出: 无
522 * 注意事项: 无
523 ******************************************************************************************************************************************/
PWM_BrkIntClr(uint32_t brkit)524 void PWM_BrkIntClr(uint32_t brkit)
525 {
526     PWMG->BRKIF = brkit;
527 }
528 
529 /******************************************************************************************************************************************
530 * 函数名称: PWM_BrkIntStat()
531 * 功能说明: 刹车中断标志查询
532 * 输    入: uint32_t brkit            brake interrupt type,有效值包括 PWM_BRKIT_BRK0、PWM_BRKIT_BRK0、PWM_BRKIT_BRK0 及其“或”
533 * 输    出: uint32_t              0 中断标志未置起   非0 中断标志已置起
534 * 注意事项: 无
535 ******************************************************************************************************************************************/
PWM_BrkIntStat(uint32_t brkit)536 uint32_t PWM_BrkIntStat(uint32_t brkit)
537 {
538     return (PWMG->BRKIF & brkit);
539 }
540