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