1 /**************************************************************************//**
2 * @file epwm.c
3 * @version V3.00
4 * $Revision: 3 $
5 * $Date: 16/06/23 11:14a $
6 * @brief M480 series EPWM driver source file
7 *
8 * SPDX-License-Identifier: Apache-2.0
9 * @copyright (C) 2016-2020 Nuvoton Technology Corp. All rights reserved.
10 *****************************************************************************/
11 #include "NuMicro.h"
12
13 /** @addtogroup Standard_Driver Standard Driver
14 @{
15 */
16
17 /** @addtogroup EPWM_Driver EPWM Driver
18 @{
19 */
20
21
22 /** @addtogroup EPWM_EXPORTED_FUNCTIONS EPWM Exported Functions
23 @{
24 */
25
26 /**
27 * @brief Configure EPWM capture and get the nearest unit time.
28 * @param[in] epwm The pointer of the specified EPWM module
29 * - EPWM0 : EPWM Group 0
30 * - EPWM1 : EPWM Group 1
31 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
32 * @param[in] u32UnitTimeNsec The unit time of counter
33 * @param[in] u32CaptureEdge The condition to latch the counter. This parameter is not used
34 * @return The nearest unit time in nano second.
35 * @details This function is used to Configure EPWM capture and get the nearest unit time.
36 */
EPWM_ConfigCaptureChannel(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32UnitTimeNsec,uint32_t u32CaptureEdge)37 uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge)
38 {
39 uint32_t u32Src;
40 uint32_t u32EPWMClockSrc;
41 uint32_t u32NearestUnitTimeNsec;
42 uint32_t u16Prescale = 1U, u16CNR = 0xFFFFU;
43
44 if(epwm == EPWM0)
45 {
46 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM0SEL_Msk;
47 }
48 else /* (epwm == EPWM1) */
49 {
50 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM1SEL_Msk;
51 }
52
53 if(u32Src == 0U)
54 {
55 /* clock source is from PLL clock */
56 u32EPWMClockSrc = CLK_GetPLLClockFreq();
57 }
58 else
59 {
60 /* clock source is from PCLK */
61 SystemCoreClockUpdate();
62 if(epwm == EPWM0)
63 {
64 u32EPWMClockSrc = CLK_GetPCLK0Freq();
65 }
66 else /* (epwm == EPWM1) */
67 {
68 u32EPWMClockSrc = CLK_GetPCLK1Freq();
69 }
70 }
71
72 u32EPWMClockSrc /= 1000U;
73 for(u16Prescale = 1U; u16Prescale <= 0x1000U; u16Prescale++)
74 {
75 uint32_t u32Exit = 0U;
76 u32NearestUnitTimeNsec = (1000000U * u16Prescale) / u32EPWMClockSrc;
77 if(u32NearestUnitTimeNsec < u32UnitTimeNsec)
78 {
79 if(u16Prescale == 0x1000U) /* limit to the maximum unit time(nano second) */
80 {
81 u32Exit = 1U;
82 }
83 else
84 {
85 u32Exit = 0U;
86 }
87 if(!((1000000U * (u16Prescale + 1U) > (u32NearestUnitTimeNsec * u32EPWMClockSrc))))
88 {
89 u32Exit = 1U;
90 }
91 else
92 {
93 u32Exit = 0U;
94 }
95 }
96 else
97 {
98 u32Exit = 1U;
99 }
100 if (u32Exit == 1U)
101 {
102 break;
103 }
104 else {}
105 }
106
107 /* convert to real register value */
108 /* every two channels share a prescaler */
109 u16Prescale -= 1U;
110 EPWM_SET_PRESCALER(epwm, u32ChannelNum, u16Prescale);
111
112 /* set EPWM to down count type(edge aligned) */
113 (epwm)->CTL1 = ((epwm)->CTL1 & ~((1UL << EPWM_CTL1_CNTTYPE0_Pos) << (u32ChannelNum << 1U))) | (1UL << (u32ChannelNum << 1U));
114 /* set EPWM to auto-reload mode */
115 (epwm)->CTL1 &= ~((1UL << EPWM_CTL1_CNTMODE0_Pos) << u32ChannelNum);
116 EPWM_SET_CNR(epwm, u32ChannelNum, u16CNR);
117
118 return (u32NearestUnitTimeNsec);
119 }
120
121 /**
122 * @brief This function Configure EPWM generator and get the nearest frequency in edge aligned(up counter type) auto-reload mode
123 * @param[in] epwm The pointer of the specified EPWM module
124 * - EPWM0 : EPWM Group 0
125 * - EPWM1 : EPWM Group 1
126 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
127 * @param[in] u32Frequency Target generator frequency
128 * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
129 * @return Nearest frequency clock in nano second
130 * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect
131 * existing frequency of other channel.
132 * @note This function is used for initial stage.
133 * To change duty cycle later, it should get the configured period value and calculate the new comparator value.
134 */
EPWM_ConfigOutputChannel(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Frequency,uint32_t u32DutyCycle)135 uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle)
136 {
137 uint32_t u32Src;
138 uint32_t u32EPWMClockSrc;
139 uint32_t i;
140 uint32_t u32Prescale = 1U, u32CNR = 0xFFFFU;
141
142 if(epwm == EPWM0)
143 {
144 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM0SEL_Msk;
145 }
146 else /* (epwm == EPWM1) */
147 {
148 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_EPWM1SEL_Msk;
149 }
150
151 if(u32Src == 0U)
152 {
153 /* clock source is from PLL clock */
154 u32EPWMClockSrc = CLK_GetPLLClockFreq();
155 }
156 else
157 {
158 /* clock source is from PCLK */
159 SystemCoreClockUpdate();
160 if(epwm == EPWM0)
161 {
162 u32EPWMClockSrc = CLK_GetPCLK0Freq();
163 }
164 else /* (epwm == EPWM1) */
165 {
166 u32EPWMClockSrc = CLK_GetPCLK1Freq();
167 }
168 }
169
170 for(u32Prescale = 1U; u32Prescale < 0xFFFU; u32Prescale++) /* prescale could be 0~0xFFF */
171 {
172 i = (u32EPWMClockSrc / u32Frequency) / u32Prescale;
173 /* If target value is larger than CNR, need to use a larger prescaler */
174 if(i < (0x10000U))
175 {
176 u32CNR = i;
177 break;
178 }
179 }
180 /* Store return value here 'cos we're gonna change u16Prescale & u16CNR to the real value to fill into register */
181 i = u32EPWMClockSrc / (u32Prescale * u32CNR);
182
183 /* convert to real register value */
184 /* every two channels share a prescaler */
185 u32Prescale -= 1U;
186 EPWM_SET_PRESCALER(epwm, u32ChannelNum, u32Prescale);
187 /* set EPWM to up counter type(edge aligned) and auto-reload mode */
188 (epwm)->CTL1 = ((epwm)->CTL1 & ~(((1UL << EPWM_CTL1_CNTTYPE0_Pos) << (u32ChannelNum << 1U))|((1UL << EPWM_CTL1_CNTMODE0_Pos) << u32ChannelNum)));
189
190 u32CNR -= 1U;
191 EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR);
192 EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1U) / 100U);
193
194 (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~(((1UL << EPWM_WGCTL0_PRDPCTL0_Pos) | (1UL << EPWM_WGCTL0_ZPCTL0_Pos)) << (u32ChannelNum << 1U))) | \
195 ((uint32_t)EPWM_OUTPUT_HIGH << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL0_ZPCTL0_Pos));
196 (epwm)->WGCTL1 = ((epwm)->WGCTL1 & ~(((1UL << EPWM_WGCTL1_CMPDCTL0_Pos) | (1UL << EPWM_WGCTL1_CMPUCTL0_Pos)) << (u32ChannelNum << 1U))) | \
197 ((uint32_t)EPWM_OUTPUT_LOW << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL1_CMPUCTL0_Pos));
198
199 return(i);
200 }
201
202 /**
203 * @brief Start EPWM module
204 * @param[in] epwm The pointer of the specified EPWM module
205 * - EPWM0 : EPWM Group 0
206 * - EPWM1 : EPWM Group 1
207 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
208 * Bit 0 is channel 0, bit 1 is channel 1...
209 * @return None
210 * @details This function is used to start EPWM module.
211 */
EPWM_Start(EPWM_T * epwm,uint32_t u32ChannelMask)212 void EPWM_Start(EPWM_T *epwm, uint32_t u32ChannelMask)
213 {
214 (epwm)->CNTEN |= u32ChannelMask;
215 }
216
217 /**
218 * @brief Stop EPWM module
219 * @param[in] epwm The pointer of the specified EPWM module
220 * - EPWM0 : EPWM Group 0
221 * - EPWM1 : EPWM Group 1
222 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
223 * Bit 0 is channel 0, bit 1 is channel 1...
224 * @return None
225 * @details This function is used to stop EPWM module.
226 */
EPWM_Stop(EPWM_T * epwm,uint32_t u32ChannelMask)227 void EPWM_Stop(EPWM_T *epwm, uint32_t u32ChannelMask)
228 {
229 uint32_t i;
230 for(i = 0U; i < EPWM_CHANNEL_NUM; i ++)
231 {
232 if(u32ChannelMask & (1UL << i))
233 {
234 (epwm)->PERIOD[i] = 0U;
235 }
236 }
237 }
238
239 /**
240 * @brief Stop EPWM generation immediately by clear channel enable bit
241 * @param[in] epwm The pointer of the specified EPWM module
242 * - EPWM0 : EPWM Group 0
243 * - EPWM1 : EPWM Group 1
244 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
245 * Bit 0 is channel 0, bit 1 is channel 1...
246 * @return None
247 * @details This function is used to stop EPWM generation immediately by clear channel enable bit.
248 */
EPWM_ForceStop(EPWM_T * epwm,uint32_t u32ChannelMask)249 void EPWM_ForceStop(EPWM_T *epwm, uint32_t u32ChannelMask)
250 {
251 (epwm)->CNTEN &= ~u32ChannelMask;
252 }
253
254 /**
255 * @brief Enable selected channel to trigger ADC
256 * @param[in] epwm The pointer of the specified EPWM module
257 * - EPWM0 : EPWM Group 0
258 * - EPWM1 : EPWM Group 1
259 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
260 * @param[in] u32Condition The condition to trigger ADC. Combination of following conditions:
261 * - \ref EPWM_TRG_ADC_EVEN_ZERO
262 * - \ref EPWM_TRG_ADC_EVEN_PERIOD
263 * - \ref EPWM_TRG_ADC_EVEN_ZERO_PERIOD
264 * - \ref EPWM_TRG_ADC_EVEN_COMPARE_UP
265 * - \ref EPWM_TRG_ADC_EVEN_COMPARE_DOWN
266 * - \ref EPWM_TRG_ADC_ODD_ZERO
267 * - \ref EPWM_TRG_ADC_ODD_PERIOD
268 * - \ref EPWM_TRG_ADC_ODD_ZERO_PERIOD
269 * - \ref EPWM_TRG_ADC_ODD_COMPARE_UP
270 * - \ref EPWM_TRG_ADC_ODD_COMPARE_DOWN
271 * - \ref EPWM_TRG_ADC_CH_0_FREE_CMP_UP
272 * - \ref EPWM_TRG_ADC_CH_0_FREE_CMP_DOWN
273 * - \ref EPWM_TRG_ADC_CH_2_FREE_CMP_UP
274 * - \ref EPWM_TRG_ADC_CH_2_FREE_CMP_DOWN
275 * - \ref EPWM_TRG_ADC_CH_4_FREE_CMP_UP
276 * - \ref EPWM_TRG_ADC_CH_4_FREE_CMP_DOWN
277 * @return None
278 * @details This function is used to enable selected channel to trigger ADC.
279 */
EPWM_EnableADCTrigger(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Condition)280 void EPWM_EnableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition)
281 {
282 if(u32ChannelNum < 4U)
283 {
284 (epwm)->EADCTS0 &= ~((EPWM_EADCTS0_TRGSEL0_Msk) << (u32ChannelNum << 3U));
285 (epwm)->EADCTS0 |= ((EPWM_EADCTS0_TRGEN0_Msk | u32Condition) << (u32ChannelNum << 3));
286 }
287 else
288 {
289 (epwm)->EADCTS1 &= ~((EPWM_EADCTS1_TRGSEL4_Msk) << ((u32ChannelNum - 4U) << 3U));
290 (epwm)->EADCTS1 |= ((EPWM_EADCTS1_TRGEN4_Msk | u32Condition) << ((u32ChannelNum - 4U) << 3U));
291 }
292 }
293
294 /**
295 * @brief Disable selected channel to trigger ADC
296 * @param[in] epwm The pointer of the specified EPWM module
297 * - EPWM0 : EPWM Group 0
298 * - EPWM1 : EPWM Group 1
299 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
300 * @return None
301 * @details This function is used to disable selected channel to trigger ADC.
302 */
EPWM_DisableADCTrigger(EPWM_T * epwm,uint32_t u32ChannelNum)303 void EPWM_DisableADCTrigger(EPWM_T *epwm, uint32_t u32ChannelNum)
304 {
305 if(u32ChannelNum < 4U)
306 {
307 (epwm)->EADCTS0 &= ~(EPWM_EADCTS0_TRGEN0_Msk << (u32ChannelNum << 3U));
308 }
309 else
310 {
311 (epwm)->EADCTS1 &= ~(EPWM_EADCTS1_TRGEN4_Msk << ((u32ChannelNum - 4U) << 3U));
312 }
313 }
314
315 /**
316 * @brief Clear selected channel trigger ADC flag
317 * @param[in] epwm The pointer of the specified EPWM module
318 * - EPWM0 : EPWM Group 0
319 * - EPWM1 : EPWM Group 1
320 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
321 * @param[in] u32Condition This parameter is not used
322 * @return None
323 * @details This function is used to clear selected channel trigger ADC flag.
324 */
EPWM_ClearADCTriggerFlag(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Condition)325 void EPWM_ClearADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition)
326 {
327 (epwm)->STATUS = (EPWM_STATUS_EADCTRGF0_Msk << u32ChannelNum);
328 }
329
330 /**
331 * @brief Get selected channel trigger ADC flag
332 * @param[in] epwm The pointer of the specified EPWM module
333 * - EPWM0 : EPWM Group 0
334 * - EPWM1 : EPWM Group 1
335 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
336 * @retval 0 The specified channel trigger ADC to start of conversion flag is not set
337 * @retval 1 The specified channel trigger ADC to start of conversion flag is set
338 * @details This function is used to get EPWM trigger ADC to start of conversion flag for specified channel.
339 */
EPWM_GetADCTriggerFlag(EPWM_T * epwm,uint32_t u32ChannelNum)340 uint32_t EPWM_GetADCTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
341 {
342 return (((epwm)->STATUS & (EPWM_STATUS_EADCTRGF0_Msk << u32ChannelNum))?1UL:0UL);
343 }
344
345 /**
346 * @brief Enable selected channel to trigger DAC
347 * @param[in] epwm The pointer of the specified EPWM module
348 * - EPWM0 : EPWM Group 0
349 * - EPWM1 : EPWM Group 1
350 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
351 * @param[in] u32Condition The condition to trigger DAC. Combination of following conditions:
352 * - \ref EPWM_TRIGGER_DAC_ZERO
353 * - \ref EPWM_TRIGGER_DAC_PERIOD
354 * - \ref EPWM_TRIGGER_DAC_COMPARE_UP
355 * - \ref EPWM_TRIGGER_DAC_COMPARE_DOWN
356 * @return None
357 * @details This function is used to enable selected channel to trigger DAC.
358 */
EPWM_EnableDACTrigger(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Condition)359 void EPWM_EnableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition)
360 {
361 (epwm)->DACTRGEN |= (u32Condition << u32ChannelNum);
362 }
363
364 /**
365 * @brief Disable selected channel to trigger DAC
366 * @param[in] epwm The pointer of the specified EPWM module
367 * - EPWM0 : EPWM Group 0
368 * - EPWM1 : EPWM Group 1
369 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
370 * @return None
371 * @details This function is used to disable selected channel to trigger DAC.
372 */
EPWM_DisableDACTrigger(EPWM_T * epwm,uint32_t u32ChannelNum)373 void EPWM_DisableDACTrigger(EPWM_T *epwm, uint32_t u32ChannelNum)
374 {
375 (epwm)->DACTRGEN &= ~((EPWM_TRIGGER_DAC_ZERO | EPWM_TRIGGER_DAC_PERIOD | EPWM_TRIGGER_DAC_COMPARE_UP | \
376 EPWM_TRIGGER_DAC_COMPARE_DOWN) << u32ChannelNum);
377 }
378
379 /**
380 * @brief Clear selected channel trigger DAC flag
381 * @param[in] epwm The pointer of the specified EPWM module
382 * - EPWM0 : EPWM Group 0
383 * - EPWM1 : EPWM Group 1
384 * @param[in] u32ChannelNum EPWM channel number. This parameter is not used
385 * @param[in] u32Condition The condition to trigger DAC. This parameter is not used
386 * @return None
387 * @details This function is used to clear selected channel trigger DAC flag.
388 */
EPWM_ClearDACTriggerFlag(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Condition)389 void EPWM_ClearDACTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Condition)
390 {
391 (epwm)->STATUS = EPWM_STATUS_DACTRGF_Msk;
392 }
393
394 /**
395 * @brief Get selected channel trigger DAC flag
396 * @param[in] epwm The pointer of the specified EPWM module
397 * - EPWM0 : EPWM Group 0
398 * - EPWM1 : EPWM Group 1
399 * @param[in] u32ChannelNum EPWM channel number. This parameter is not used
400 * @retval 0 The specified channel trigger DAC to start of conversion flag is not set
401 * @retval 1 The specified channel trigger DAC to start of conversion flag is set
402 * @details This function is used to get selected channel trigger DAC flag.
403 */
EPWM_GetDACTriggerFlag(EPWM_T * epwm,uint32_t u32ChannelNum)404 uint32_t EPWM_GetDACTriggerFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
405 {
406 return (((epwm)->STATUS & EPWM_STATUS_DACTRGF_Msk)?1UL:0UL);
407 }
408
409 /**
410 * @brief This function enable fault brake of selected channel(s)
411 * @param[in] epwm The pointer of the specified EPWM module
412 * - EPWM0 : EPWM Group 0
413 * - EPWM1 : EPWM Group 1
414 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
415 * @param[in] u32LevelMask Output high or low while fault brake occurs, each bit represent the level of a channel
416 * while fault brake occurs. Bit 0 represents channel 0, bit 1 represents channel 1...
417 * @param[in] u32BrakeSource Fault brake source, could be one of following source
418 * - \ref EPWM_FB_EDGE_ADCRM
419 * - \ref EPWM_FB_EDGE_ACMP0
420 * - \ref EPWM_FB_EDGE_ACMP1
421 * - \ref EPWM_FB_EDGE_BKP0
422 * - \ref EPWM_FB_EDGE_BKP1
423 * - \ref EPWM_FB_EDGE_SYS_CSS
424 * - \ref EPWM_FB_EDGE_SYS_BOD
425 * - \ref EPWM_FB_EDGE_SYS_RAM
426 * - \ref EPWM_FB_EDGE_SYS_COR
427 * - \ref EPWM_FB_LEVEL_ADCRM
428 * - \ref EPWM_FB_LEVEL_ACMP0
429 * - \ref EPWM_FB_LEVEL_ACMP1
430 * - \ref EPWM_FB_LEVEL_BKP0
431 * - \ref EPWM_FB_LEVEL_BKP1
432 * - \ref EPWM_FB_LEVEL_SYS_CSS
433 * - \ref EPWM_FB_LEVEL_SYS_BOD
434 * - \ref EPWM_FB_LEVEL_SYS_RAM
435 * - \ref EPWM_FB_LEVEL_SYS_COR
436 * @return None
437 * @details This function is used to enable fault brake of selected channel(s).
438 * The write-protection function should be disabled before using this function.
439 */
EPWM_EnableFaultBrake(EPWM_T * epwm,uint32_t u32ChannelMask,uint32_t u32LevelMask,uint32_t u32BrakeSource)440 void EPWM_EnableFaultBrake(EPWM_T *epwm, uint32_t u32ChannelMask, uint32_t u32LevelMask, uint32_t u32BrakeSource)
441 {
442 uint32_t i;
443
444 for(i = 0U; i < EPWM_CHANNEL_NUM; i ++)
445 {
446 if(u32ChannelMask & (1UL << i))
447 {
448 if((u32BrakeSource == EPWM_FB_EDGE_SYS_CSS) || (u32BrakeSource == EPWM_FB_EDGE_SYS_BOD) || \
449 (u32BrakeSource == EPWM_FB_EDGE_SYS_RAM) || (u32BrakeSource == EPWM_FB_EDGE_SYS_COR) || \
450 (u32BrakeSource == EPWM_FB_LEVEL_SYS_CSS) || (u32BrakeSource == EPWM_FB_LEVEL_SYS_BOD) || \
451 (u32BrakeSource == EPWM_FB_LEVEL_SYS_RAM) || (u32BrakeSource == EPWM_FB_LEVEL_SYS_COR))
452 {
453 (epwm)->BRKCTL[i >> 1U] |= (u32BrakeSource & (EPWM_BRKCTL0_1_SYSEBEN_Msk | EPWM_BRKCTL0_1_SYSLBEN_Msk));
454 (epwm)->FAILBRK |= (u32BrakeSource & 0xFU);
455 }
456 else
457 {
458 (epwm)->BRKCTL[i >> 1U] |= u32BrakeSource;
459 }
460 }
461
462 if(u32LevelMask & (1UL << i))
463 {
464 if((i & 0x1U) == 0U)
465 {
466 /* set brake action as high level for even channel */
467 (epwm)->BRKCTL[i >> 1] &= ~EPWM_BRKCTL0_1_BRKAEVEN_Msk;
468 (epwm)->BRKCTL[i >> 1] |= ((3U) << EPWM_BRKCTL0_1_BRKAEVEN_Pos);
469 }
470 else
471 {
472 /* set brake action as high level for odd channel */
473 (epwm)->BRKCTL[i >> 1] &= ~EPWM_BRKCTL0_1_BRKAODD_Msk;
474 (epwm)->BRKCTL[i >> 1] |= ((3U) << EPWM_BRKCTL0_1_BRKAODD_Pos);
475 }
476 }
477 else
478 {
479 if((i & 0x1U) == 0U)
480 {
481 /* set brake action as low level for even channel */
482 (epwm)->BRKCTL[i >> 1U] &= ~EPWM_BRKCTL0_1_BRKAEVEN_Msk;
483 (epwm)->BRKCTL[i >> 1U] |= ((2U) << EPWM_BRKCTL0_1_BRKAEVEN_Pos);
484 }
485 else
486 {
487 /* set brake action as low level for odd channel */
488 (epwm)->BRKCTL[i >> 1U] &= ~EPWM_BRKCTL0_1_BRKAODD_Msk;
489 (epwm)->BRKCTL[i >> 1U] |= ((2U) << EPWM_BRKCTL0_1_BRKAODD_Pos);
490 }
491 }
492 }
493 }
494
495 /**
496 * @brief Enable capture of selected channel(s)
497 * @param[in] epwm The pointer of the specified EPWM module
498 * - EPWM0 : EPWM Group 0
499 * - EPWM1 : EPWM Group 1
500 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
501 * Bit 0 is channel 0, bit 1 is channel 1...
502 * @return None
503 * @details This function is used to enable capture of selected channel(s).
504 */
EPWM_EnableCapture(EPWM_T * epwm,uint32_t u32ChannelMask)505 void EPWM_EnableCapture(EPWM_T *epwm, uint32_t u32ChannelMask)
506 {
507 (epwm)->CAPINEN |= u32ChannelMask;
508 (epwm)->CAPCTL |= u32ChannelMask;
509 }
510
511 /**
512 * @brief Disable capture of selected channel(s)
513 * @param[in] epwm The pointer of the specified EPWM module
514 * - EPWM0 : EPWM Group 0
515 * - EPWM1 : EPWM Group 1
516 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
517 * Bit 0 is channel 0, bit 1 is channel 1...
518 * @return None
519 * @details This function is used to disable capture of selected channel(s).
520 */
EPWM_DisableCapture(EPWM_T * epwm,uint32_t u32ChannelMask)521 void EPWM_DisableCapture(EPWM_T *epwm, uint32_t u32ChannelMask)
522 {
523 (epwm)->CAPINEN &= ~u32ChannelMask;
524 (epwm)->CAPCTL &= ~u32ChannelMask;
525 }
526
527 /**
528 * @brief Enables EPWM output generation of selected channel(s)
529 * @param[in] epwm The pointer of the specified EPWM module
530 * - EPWM0 : EPWM Group 0
531 * - EPWM1 : EPWM Group 1
532 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
533 * Set bit 0 to 1 enables channel 0 output, set bit 1 to 1 enables channel 1 output...
534 * @return None
535 * @details This function is used to enable EPWM output generation of selected channel(s).
536 */
EPWM_EnableOutput(EPWM_T * epwm,uint32_t u32ChannelMask)537 void EPWM_EnableOutput(EPWM_T *epwm, uint32_t u32ChannelMask)
538 {
539 (epwm)->POEN |= u32ChannelMask;
540 }
541
542 /**
543 * @brief Disables EPWM output generation of selected channel(s)
544 * @param[in] epwm The pointer of the specified EPWM module
545 * - EPWM0 : EPWM Group 0
546 * - EPWM1 : EPWM Group 1
547 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel
548 * Set bit 0 to 1 disables channel 0 output, set bit 1 to 1 disables channel 1 output...
549 * @return None
550 * @details This function is used to disable EPWM output generation of selected channel(s).
551 */
EPWM_DisableOutput(EPWM_T * epwm,uint32_t u32ChannelMask)552 void EPWM_DisableOutput(EPWM_T *epwm, uint32_t u32ChannelMask)
553 {
554 (epwm)->POEN &= ~u32ChannelMask;
555 }
556
557 /**
558 * @brief Enables PDMA transfer of selected channel for EPWM capture
559 * @param[in] epwm The pointer of the specified EPWM module
560 * - EPWM0 : EPWM Group 0
561 * - EPWM1 : EPWM Group 1
562 * @param[in] u32ChannelNum EPWM channel number.
563 * @param[in] u32RisingFirst The capture order is rising, falling first. Every two channels share the same setting. Valid values are TRUE and FALSE.
564 * @param[in] u32Mode Captured data transferred by PDMA interrupt type. It could be either
565 * - \ref EPWM_CAPTURE_PDMA_RISING_LATCH
566 * - \ref EPWM_CAPTURE_PDMA_FALLING_LATCH
567 * - \ref EPWM_CAPTURE_PDMA_RISING_FALLING_LATCH
568 * @return None
569 * @details This function is used to enable PDMA transfer of selected channel(s) for EPWM capture.
570 * @note This function can only selects even or odd channel of pairs to do PDMA transfer.
571 */
EPWM_EnablePDMA(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32RisingFirst,uint32_t u32Mode)572 void EPWM_EnablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode)
573 {
574 uint32_t u32IsOddCh;
575 u32IsOddCh = u32ChannelNum & 0x1U;
576 (epwm)->PDMACTL = ((epwm)->PDMACTL & ~((EPWM_PDMACTL_CHSEL0_1_Msk | EPWM_PDMACTL_CAPORD0_1_Msk | EPWM_PDMACTL_CAPMOD0_1_Msk) << ((u32ChannelNum >> 1U) << 3U))) | \
577 (((u32IsOddCh << EPWM_PDMACTL_CHSEL0_1_Pos) | (u32RisingFirst << EPWM_PDMACTL_CAPORD0_1_Pos) | \
578 u32Mode | EPWM_PDMACTL_CHEN0_1_Msk) << ((u32ChannelNum >> 1U) << 3U));
579 }
580
581 /**
582 * @brief Disables PDMA transfer of selected channel for EPWM capture
583 * @param[in] epwm The pointer of the specified EPWM module
584 * - EPWM0 : EPWM Group 0
585 * - EPWM1 : EPWM Group 1
586 * @param[in] u32ChannelNum EPWM channel number.
587 * @return None
588 * @details This function is used to enable PDMA transfer of selected channel(s) for EPWM capture.
589 */
EPWM_DisablePDMA(EPWM_T * epwm,uint32_t u32ChannelNum)590 void EPWM_DisablePDMA(EPWM_T *epwm, uint32_t u32ChannelNum)
591 {
592 (epwm)->PDMACTL &= ~(EPWM_PDMACTL_CHEN0_1_Msk << ((u32ChannelNum >> 1U) << 3U));
593 }
594
595 /**
596 * @brief Enable Dead zone of selected channel
597 * @param[in] epwm The pointer of the specified EPWM module
598 * - EPWM0 : EPWM Group 0
599 * - EPWM1 : EPWM Group 1
600 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
601 * @param[in] u32Duration Dead zone length in EPWM clock count, valid values are between 0~0xFFF, but 0 means there is no Dead zone.
602 * @return None
603 * @details This function is used to enable Dead zone of selected channel.
604 * The write-protection function should be disabled before using this function.
605 * @note Every two channels share the same setting.
606 */
EPWM_EnableDeadZone(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Duration)607 void EPWM_EnableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Duration)
608 {
609 /* every two channels share the same setting */
610 (epwm)->DTCTL[(u32ChannelNum) >> 1U] &= ~EPWM_DTCTL0_1_DTCNT_Msk;
611 (epwm)->DTCTL[(u32ChannelNum) >> 1U] |= EPWM_DTCTL0_1_DTEN_Msk | u32Duration;
612 }
613
614 /**
615 * @brief Disable Dead zone of selected channel
616 * @param[in] epwm The pointer of the specified EPWM module
617 * - EPWM0 : EPWM Group 0
618 * - EPWM1 : EPWM Group 1
619 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
620 * @return None
621 * @details This function is used to disable Dead zone of selected channel.
622 * The write-protection function should be disabled before using this function.
623 */
EPWM_DisableDeadZone(EPWM_T * epwm,uint32_t u32ChannelNum)624 void EPWM_DisableDeadZone(EPWM_T *epwm, uint32_t u32ChannelNum)
625 {
626 /* every two channels shares the same setting */
627 (epwm)->DTCTL[(u32ChannelNum) >> 1U] &= ~EPWM_DTCTL0_1_DTEN_Msk;
628 }
629
630 /**
631 * @brief Enable capture interrupt of selected channel.
632 * @param[in] epwm The pointer of the specified EPWM module
633 * - EPWM0 : EPWM Group 0
634 * - EPWM1 : EPWM Group 1
635 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
636 * @param[in] u32Edge Rising or falling edge to latch counter.
637 * - \ref EPWM_CAPTURE_INT_RISING_LATCH
638 * - \ref EPWM_CAPTURE_INT_FALLING_LATCH
639 * @return None
640 * @details This function is used to enable capture interrupt of selected channel.
641 */
EPWM_EnableCaptureInt(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Edge)642 void EPWM_EnableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge)
643 {
644 (epwm)->CAPIEN |= (u32Edge << u32ChannelNum);
645 }
646
647 /**
648 * @brief Disable capture interrupt of selected channel.
649 * @param[in] epwm The pointer of the specified EPWM module
650 * - EPWM0 : EPWM Group 0
651 * - EPWM1 : EPWM Group 1
652 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
653 * @param[in] u32Edge Rising or falling edge to latch counter.
654 * - \ref EPWM_CAPTURE_INT_RISING_LATCH
655 * - \ref EPWM_CAPTURE_INT_FALLING_LATCH
656 * @return None
657 * @details This function is used to disable capture interrupt of selected channel.
658 */
EPWM_DisableCaptureInt(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Edge)659 void EPWM_DisableCaptureInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge)
660 {
661 (epwm)->CAPIEN &= ~(u32Edge << u32ChannelNum);
662 }
663
664 /**
665 * @brief Clear capture interrupt of selected channel.
666 * @param[in] epwm The pointer of the specified EPWM module
667 * - EPWM0 : EPWM Group 0
668 * - EPWM1 : EPWM Group 1
669 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
670 * @param[in] u32Edge Rising or falling edge to latch counter.
671 * - \ref EPWM_CAPTURE_INT_RISING_LATCH
672 * - \ref EPWM_CAPTURE_INT_FALLING_LATCH
673 * @return None
674 * @details This function is used to clear capture interrupt of selected channel.
675 */
EPWM_ClearCaptureIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32Edge)676 void EPWM_ClearCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Edge)
677 {
678 (epwm)->CAPIF = (u32Edge << u32ChannelNum);
679 }
680
681 /**
682 * @brief Get capture interrupt of selected channel.
683 * @param[in] epwm The pointer of the specified EPWM module
684 * - EPWM0 : EPWM Group 0
685 * - EPWM1 : EPWM Group 1
686 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
687 * @retval 0 No capture interrupt
688 * @retval 1 Rising edge latch interrupt
689 * @retval 2 Falling edge latch interrupt
690 * @retval 3 Rising and falling latch interrupt
691 * @details This function is used to get capture interrupt of selected channel.
692 */
EPWM_GetCaptureIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)693 uint32_t EPWM_GetCaptureIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
694 {
695 return (((((epwm)->CAPIF & (EPWM_CAPIF_CFLIF0_Msk << u32ChannelNum)) ? 1UL : 0UL) << 1) | \
696 (((epwm)->CAPIF & (EPWM_CAPIF_CRLIF0_Msk << u32ChannelNum)) ? 1UL : 0UL));
697 }
698 /**
699 * @brief Enable duty interrupt of selected channel
700 * @param[in] epwm The pointer of the specified EPWM module
701 * - EPWM0 : EPWM Group 0
702 * - EPWM1 : EPWM Group 1
703 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
704 * @param[in] u32IntDutyType Duty interrupt type, could be either
705 * - \ref EPWM_DUTY_INT_DOWN_COUNT_MATCH_CMP
706 * - \ref EPWM_DUTY_INT_UP_COUNT_MATCH_CMP
707 * @return None
708 * @details This function is used to enable duty interrupt of selected channel.
709 */
EPWM_EnableDutyInt(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32IntDutyType)710 void EPWM_EnableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType)
711 {
712 (epwm)->INTEN0 |= (u32IntDutyType << u32ChannelNum);
713 }
714
715 /**
716 * @brief Disable duty interrupt of selected channel
717 * @param[in] epwm The pointer of the specified EPWM module
718 * - EPWM0 : EPWM Group 0
719 * - EPWM1 : EPWM Group 1
720 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
721 * @return None
722 * @details This function is used to disable duty interrupt of selected channel.
723 */
EPWM_DisableDutyInt(EPWM_T * epwm,uint32_t u32ChannelNum)724 void EPWM_DisableDutyInt(EPWM_T *epwm, uint32_t u32ChannelNum)
725 {
726 (epwm)->INTEN0 &= ~((uint32_t)(EPWM_DUTY_INT_DOWN_COUNT_MATCH_CMP | EPWM_DUTY_INT_UP_COUNT_MATCH_CMP) << u32ChannelNum);
727 }
728
729 /**
730 * @brief Clear duty interrupt flag of selected channel
731 * @param[in] epwm The pointer of the specified EPWM module
732 * - EPWM0 : EPWM Group 0
733 * - EPWM1 : EPWM Group 1
734 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
735 * @return None
736 * @details This function is used to clear duty interrupt flag of selected channel.
737 */
EPWM_ClearDutyIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)738 void EPWM_ClearDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
739 {
740 (epwm)->INTSTS0 = (EPWM_INTSTS0_CMPUIF0_Msk | EPWM_INTSTS0_CMPDIF0_Msk) << u32ChannelNum;
741 }
742
743 /**
744 * @brief Get duty interrupt flag of selected channel
745 * @param[in] epwm The pointer of the specified EPWM module
746 * - EPWM0 : EPWM Group 0
747 * - EPWM1 : EPWM Group 1
748 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
749 * @return Duty interrupt flag of specified channel
750 * @retval 0 Duty interrupt did not occur
751 * @retval 1 Duty interrupt occurred
752 * @details This function is used to get duty interrupt flag of selected channel.
753 */
EPWM_GetDutyIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)754 uint32_t EPWM_GetDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
755 {
756 return ((((epwm)->INTSTS0 & ((EPWM_INTSTS0_CMPDIF0_Msk | EPWM_INTSTS0_CMPUIF0_Msk) << u32ChannelNum))) ? 1UL : 0UL);
757 }
758
759 /**
760 * @brief This function enable fault brake interrupt
761 * @param[in] epwm The pointer of the specified EPWM module
762 * @param[in] u32BrakeSource Fault brake source.
763 * - \ref EPWM_FB_EDGE
764 * - \ref EPWM_FB_LEVEL
765 * @return None
766 * @details This function is used to enable fault brake interrupt.
767 * The write-protection function should be disabled before using this function.
768 * @note Every two channels share the same setting.
769 */
EPWM_EnableFaultBrakeInt(EPWM_T * epwm,uint32_t u32BrakeSource)770 void EPWM_EnableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource)
771 {
772 (epwm)->INTEN1 |= (0x7UL << u32BrakeSource);
773 }
774
775 /**
776 * @brief This function disable fault brake interrupt
777 * @param[in] epwm The pointer of the specified EPWM module
778 * @param[in] u32BrakeSource Fault brake source.
779 * - \ref EPWM_FB_EDGE
780 * - \ref EPWM_FB_LEVEL
781 * @return None
782 * @details This function is used to disable fault brake interrupt.
783 * The write-protection function should be disabled before using this function.
784 * @note Every two channels share the same setting.
785 */
EPWM_DisableFaultBrakeInt(EPWM_T * epwm,uint32_t u32BrakeSource)786 void EPWM_DisableFaultBrakeInt(EPWM_T *epwm, uint32_t u32BrakeSource)
787 {
788 (epwm)->INTEN1 &= ~(0x7UL << u32BrakeSource);
789 }
790
791 /**
792 * @brief This function clear fault brake interrupt of selected source
793 * @param[in] epwm The pointer of the specified EPWM module
794 * @param[in] u32BrakeSource Fault brake source.
795 * - \ref EPWM_FB_EDGE
796 * - \ref EPWM_FB_LEVEL
797 * @return None
798 * @details This function is used to clear fault brake interrupt of selected source.
799 * The write-protection function should be disabled before using this function.
800 */
EPWM_ClearFaultBrakeIntFlag(EPWM_T * epwm,uint32_t u32BrakeSource)801 void EPWM_ClearFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource)
802 {
803 (epwm)->INTSTS1 = (0x3fUL << u32BrakeSource);
804 }
805
806 /**
807 * @brief This function get fault brake interrupt flag of selected source
808 * @param[in] epwm The pointer of the specified EPWM module
809 * @param[in] u32BrakeSource Fault brake source, could be either
810 * - \ref EPWM_FB_EDGE
811 * - \ref EPWM_FB_LEVEL
812 * @return Fault brake interrupt flag of specified source
813 * @retval 0 Fault brake interrupt did not occurred
814 * @retval 1 Fault brake interrupt occurred
815 * @details This function is used to get fault brake interrupt flag of selected source.
816 */
EPWM_GetFaultBrakeIntFlag(EPWM_T * epwm,uint32_t u32BrakeSource)817 uint32_t EPWM_GetFaultBrakeIntFlag(EPWM_T *epwm, uint32_t u32BrakeSource)
818 {
819 return (((epwm)->INTSTS1 & (0x3fUL << u32BrakeSource)) ? 1UL : 0UL);
820 }
821
822 /**
823 * @brief Enable period interrupt of selected channel
824 * @param[in] epwm The pointer of the specified EPWM module
825 * - EPWM0 : EPWM Group 0
826 * - EPWM1 : EPWM Group 1
827 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
828 * @param[in] u32IntPeriodType Period interrupt type. This parameter is not used.
829 * @return None
830 * @details This function is used to enable period interrupt of selected channel.
831 */
EPWM_EnablePeriodInt(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32IntPeriodType)832 void EPWM_EnablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType)
833 {
834 (epwm)->INTEN0 |= ((1UL << EPWM_INTEN0_PIEN0_Pos) << u32ChannelNum);
835 }
836
837 /**
838 * @brief Disable period interrupt of selected channel
839 * @param[in] epwm The pointer of the specified EPWM module
840 * - EPWM0 : EPWM Group 0
841 * - EPWM1 : EPWM Group 1
842 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
843 * @return None
844 * @details This function is used to disable period interrupt of selected channel.
845 */
EPWM_DisablePeriodInt(EPWM_T * epwm,uint32_t u32ChannelNum)846 void EPWM_DisablePeriodInt(EPWM_T *epwm, uint32_t u32ChannelNum)
847 {
848 (epwm)->INTEN0 &= ~((1UL << EPWM_INTEN0_PIEN0_Pos) << u32ChannelNum);
849 }
850
851 /**
852 * @brief Clear period interrupt of selected channel
853 * @param[in] epwm The pointer of the specified EPWM module
854 * - EPWM0 : EPWM Group 0
855 * - EPWM1 : EPWM Group 1
856 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
857 * @return None
858 * @details This function is used to clear period interrupt of selected channel.
859 */
EPWM_ClearPeriodIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)860 void EPWM_ClearPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
861 {
862 (epwm)->INTSTS0 = ((1UL << EPWM_INTSTS0_PIF0_Pos) << u32ChannelNum);
863 }
864
865 /**
866 * @brief Get period interrupt of selected channel
867 * @param[in] epwm The pointer of the specified EPWM module
868 * - EPWM0 : EPWM Group 0
869 * - EPWM1 : EPWM Group 1
870 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
871 * @return Period interrupt flag of specified channel
872 * @retval 0 Period interrupt did not occur
873 * @retval 1 Period interrupt occurred
874 * @details This function is used to get period interrupt of selected channel.
875 */
EPWM_GetPeriodIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)876 uint32_t EPWM_GetPeriodIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
877 {
878 return ((((epwm)->INTSTS0 & ((1UL << EPWM_INTSTS0_PIF0_Pos) << u32ChannelNum))) ? 1UL : 0UL);
879 }
880
881 /**
882 * @brief Enable zero interrupt of selected channel
883 * @param[in] epwm The pointer of the specified EPWM module
884 * - EPWM0 : EPWM Group 0
885 * - EPWM1 : EPWM Group 1
886 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
887 * @return None
888 * @details This function is used to enable zero interrupt of selected channel.
889 */
EPWM_EnableZeroInt(EPWM_T * epwm,uint32_t u32ChannelNum)890 void EPWM_EnableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum)
891 {
892 (epwm)->INTEN0 |= ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum);
893 }
894
895 /**
896 * @brief Disable zero interrupt of selected channel
897 * @param[in] epwm The pointer of the specified EPWM module
898 * - EPWM0 : EPWM Group 0
899 * - EPWM1 : EPWM Group 1
900 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
901 * @return None
902 * @details This function is used to disable zero interrupt of selected channel.
903 */
EPWM_DisableZeroInt(EPWM_T * epwm,uint32_t u32ChannelNum)904 void EPWM_DisableZeroInt(EPWM_T *epwm, uint32_t u32ChannelNum)
905 {
906 (epwm)->INTEN0 &= ~((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum);
907 }
908
909 /**
910 * @brief Clear zero interrupt of selected channel
911 * @param[in] epwm The pointer of the specified EPWM module
912 * - EPWM0 : EPWM Group 0
913 * - EPWM1 : EPWM Group 1
914 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
915 * @return None
916 * @details This function is used to clear zero interrupt of selected channel.
917 */
EPWM_ClearZeroIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)918 void EPWM_ClearZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
919 {
920 (epwm)->INTSTS0 = ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum);
921 }
922
923 /**
924 * @brief Get zero interrupt of selected channel
925 * @param[in] epwm The pointer of the specified EPWM module
926 * - EPWM0 : EPWM Group 0
927 * - EPWM1 : EPWM Group 1
928 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
929 * @return Zero interrupt flag of specified channel
930 * @retval 0 Zero interrupt did not occur
931 * @retval 1 Zero interrupt occurred
932 * @details This function is used to get zero interrupt of selected channel.
933 */
EPWM_GetZeroIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)934 uint32_t EPWM_GetZeroIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
935 {
936 return ((((epwm)->INTSTS0 & ((1UL << EPWM_INTEN0_ZIEN0_Pos) << u32ChannelNum))) ? 1UL : 0UL);
937 }
938
939 /**
940 * @brief Enable interrupt flag accumulator of selected channel
941 * @param[in] epwm The pointer of the specified EPWM module
942 * - EPWM0 : EPWM Group 0
943 * - EPWM1 : EPWM Group 1
944 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
945 * @param[in] u32IntFlagCnt Interrupt flag counter. Valid values are between 0~65535.
946 * @param[in] u32IntAccSrc Interrupt flag accumulator source selection.
947 * - \ref EPWM_IFA_ZERO_POINT
948 * - \ref EPWM_IFA_PERIOD_POINT
949 * - \ref EPWM_IFA_COMPARE_UP_COUNT_POINT
950 * - \ref EPWM_IFA_COMPARE_DOWN_COUNT_POINT
951 * @return None
952 * @details This function is used to enable interrupt flag accumulator of selected channel.
953 */
EPWM_EnableAcc(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32IntFlagCnt,uint32_t u32IntAccSrc)954 void EPWM_EnableAcc(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32IntFlagCnt, uint32_t u32IntAccSrc)
955 {
956 (epwm)->IFA[u32ChannelNum] = (((epwm)->IFA[u32ChannelNum] & ~((EPWM_IFA0_IFACNT_Msk | EPWM_IFA0_IFASEL_Msk))) | \
957 (EPWM_IFA0_IFAEN_Msk | (u32IntAccSrc << EPWM_IFA0_IFASEL_Pos) | u32IntFlagCnt) );
958 }
959
960 /**
961 * @brief Disable interrupt flag accumulator of selected channel
962 * @param[in] epwm The pointer of the specified EPWM module
963 * - EPWM0 : EPWM Group 0
964 * - EPWM1 : EPWM Group 1
965 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
966 * @return None
967 * @details This function is used to Disable interrupt flag accumulator of selected channel.
968 */
EPWM_DisableAcc(EPWM_T * epwm,uint32_t u32ChannelNum)969 void EPWM_DisableAcc(EPWM_T *epwm, uint32_t u32ChannelNum)
970 {
971 (epwm)->IFA[u32ChannelNum] = ((epwm)->IFA[u32ChannelNum] & ~(EPWM_IFA0_IFAEN_Msk));
972 }
973
974 /**
975 * @brief Enable interrupt flag accumulator interrupt of selected channel
976 * @param[in] epwm The pointer of the specified EPWM module
977 * - EPWM0 : EPWM Group 0
978 * - EPWM1 : EPWM Group 1
979 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
980 * @return None
981 * @details This function is used to enable interrupt flag accumulator interrupt of selected channel.
982 */
EPWM_EnableAccInt(EPWM_T * epwm,uint32_t u32ChannelNum)983 void EPWM_EnableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum)
984 {
985 (epwm)->AINTEN |= (1UL << (u32ChannelNum));
986 }
987
988 /**
989 * @brief Disable interrupt flag accumulator interrupt of selected channel
990 * @param[in] epwm The pointer of the specified EPWM module
991 * - EPWM0 : EPWM Group 0
992 * - EPWM1 : EPWM Group 1
993 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
994 * @return None
995 * @details This function is used to disable interrupt flag accumulator interrupt of selected channel.
996 */
EPWM_DisableAccInt(EPWM_T * epwm,uint32_t u32ChannelNum)997 void EPWM_DisableAccInt(EPWM_T *epwm, uint32_t u32ChannelNum)
998 {
999 (epwm)->AINTEN &= ~(1UL << (u32ChannelNum));
1000 }
1001
1002 /**
1003 * @brief Clear interrupt flag accumulator interrupt of selected channel
1004 * @param[in] epwm The pointer of the specified EPWM module
1005 * - EPWM0 : EPWM Group 0
1006 * - EPWM1 : EPWM Group 1
1007 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1008 * @return None
1009 * @details This function is used to clear interrupt flag accumulator interrupt of selected channel.
1010 */
EPWM_ClearAccInt(EPWM_T * epwm,uint32_t u32ChannelNum)1011 void EPWM_ClearAccInt(EPWM_T *epwm, uint32_t u32ChannelNum)
1012 {
1013 (epwm)->AINTSTS = (1UL << (u32ChannelNum));
1014 }
1015
1016 /**
1017 * @brief Get interrupt flag accumulator interrupt of selected channel
1018 * @param[in] epwm The pointer of the specified EPWM module
1019 * - EPWM0 : EPWM Group 0
1020 * - EPWM1 : EPWM Group 1
1021 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1022 * @retval 0 Accumulator interrupt did not occur
1023 * @retval 1 Accumulator interrupt occurred
1024 * @details This function is used to Get interrupt flag accumulator interrupt of selected channel.
1025 */
EPWM_GetAccInt(EPWM_T * epwm,uint32_t u32ChannelNum)1026 uint32_t EPWM_GetAccInt(EPWM_T *epwm, uint32_t u32ChannelNum)
1027 {
1028 return (((epwm)->AINTSTS & (1UL << (u32ChannelNum))) ? 1UL : 0UL);
1029 }
1030
1031 /**
1032 * @brief Enable accumulator PDMA of selected channel
1033 * @param[in] epwm The pointer of the specified EPWM module
1034 * - EPWM0 : EPWM Group 0
1035 * - EPWM1 : EPWM Group 1
1036 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1037 * @return None
1038 * @details This function is used to enable accumulator interrupt trigger PDMA of selected channel.
1039 */
EPWM_EnableAccPDMA(EPWM_T * epwm,uint32_t u32ChannelNum)1040 void EPWM_EnableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum)
1041 {
1042 (epwm)->APDMACTL |= (1UL << (u32ChannelNum));
1043 }
1044
1045 /**
1046 * @brief Disable accumulator PDMA of selected channel
1047 * @param[in] epwm The pointer of the specified EPWM module
1048 * - EPWM0 : EPWM Group 0
1049 * - EPWM1 : EPWM Group 1
1050 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1051 * @return None
1052 * @details This function is used to disable accumulator interrupt trigger PDMA of selected channel.
1053 */
EPWM_DisableAccPDMA(EPWM_T * epwm,uint32_t u32ChannelNum)1054 void EPWM_DisableAccPDMA(EPWM_T *epwm, uint32_t u32ChannelNum)
1055 {
1056 (epwm)->APDMACTL &= ~(1UL << (u32ChannelNum));
1057 }
1058
1059 /**
1060 * @brief Enable interrupt flag accumulator stop mode of selected channel
1061 * @param[in] epwm The pointer of the specified EPWM module
1062 * - EPWM0 : EPWM Group 0
1063 * - EPWM1 : EPWM Group 1
1064 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1065 * @return None
1066 * @details This function is used to enable interrupt flag accumulator stop mode of selected channel.
1067 */
EPWM_EnableAccStopMode(EPWM_T * epwm,uint32_t u32ChannelNum)1068 void EPWM_EnableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum)
1069 {
1070 (epwm)->IFA[u32ChannelNum] |= EPWM_IFA0_STPMOD_Msk;
1071 }
1072
1073 /**
1074 * @brief Disable interrupt flag accumulator stop mode of selected channel
1075 * @param[in] epwm The pointer of the specified EPWM module
1076 * - EPWM0 : EPWM Group 0
1077 * - EPWM1 : EPWM Group 1
1078 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1079 * @return None
1080 * @details This function is used to disable interrupt flag accumulator stop mode of selected channel.
1081 */
EPWM_DisableAccStopMode(EPWM_T * epwm,uint32_t u32ChannelNum)1082 void EPWM_DisableAccStopMode(EPWM_T *epwm, uint32_t u32ChannelNum)
1083 {
1084 (epwm)->IFA[u32ChannelNum] &= ~EPWM_IFA0_STPMOD_Msk;
1085 }
1086
1087 /**
1088 * @brief Clear free trigger duty interrupt flag of selected channel
1089 * @param[in] epwm The pointer of the specified EPWM module
1090 * - EPWM0 : EPWM Group 0
1091 * - EPWM1 : EPWM Group 1
1092 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1093 * @return None
1094 * @details This function is used to clear free trigger duty interrupt flag of selected channel.
1095 */
EPWM_ClearFTDutyIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)1096 void EPWM_ClearFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
1097 {
1098 (epwm)->FTCI = ((EPWM_FTCI_FTCMU0_Msk | EPWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1U));
1099 }
1100
1101 /**
1102 * @brief Get free trigger duty interrupt flag of selected channel
1103 * @param[in] epwm The pointer of the specified EPWM module
1104 * - EPWM0 : EPWM Group 0
1105 * - EPWM1 : EPWM Group 1
1106 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1107 * @return Duty interrupt flag of specified channel
1108 * @retval 0 Free trigger duty interrupt did not occur
1109 * @retval 1 Free trigger duty interrupt occurred
1110 * @details This function is used to get free trigger duty interrupt flag of selected channel.
1111 */
EPWM_GetFTDutyIntFlag(EPWM_T * epwm,uint32_t u32ChannelNum)1112 uint32_t EPWM_GetFTDutyIntFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
1113 {
1114 return (((epwm)->FTCI & ((EPWM_FTCI_FTCMU0_Msk | EPWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1U))) ? 1UL : 0UL);
1115 }
1116
1117 /**
1118 * @brief Enable load mode of selected channel
1119 * @param[in] epwm The pointer of the specified EPWM module
1120 * - EPWM0 : EPWM Group 0
1121 * - EPWM1 : EPWM Group 1
1122 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1123 * @param[in] u32LoadMode EPWM counter loading mode.
1124 * - \ref EPWM_LOAD_MODE_IMMEDIATE
1125 * - \ref EPWM_LOAD_MODE_WINDOW
1126 * - \ref EPWM_LOAD_MODE_CENTER
1127 * @return None
1128 * @details This function is used to enable load mode of selected channel.
1129 */
EPWM_EnableLoadMode(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32LoadMode)1130 void EPWM_EnableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
1131 {
1132 (epwm)->CTL0 |= (u32LoadMode << u32ChannelNum);
1133 }
1134
1135 /**
1136 * @brief Disable load mode of selected channel
1137 * @param[in] epwm The pointer of the specified EPWM module
1138 * - EPWM0 : EPWM Group 0
1139 * - EPWM1 : EPWM Group 1
1140 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1141 * @param[in] u32LoadMode EPWM counter loading mode.
1142 * - \ref EPWM_LOAD_MODE_IMMEDIATE
1143 * - \ref EPWM_LOAD_MODE_WINDOW
1144 * - \ref EPWM_LOAD_MODE_CENTER
1145 * @return None
1146 * @details This function is used to disable load mode of selected channel.
1147 */
EPWM_DisableLoadMode(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32LoadMode)1148 void EPWM_DisableLoadMode(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
1149 {
1150 (epwm)->CTL0 &= ~(u32LoadMode << u32ChannelNum);
1151 }
1152
1153 /**
1154 * @brief Configure synchronization phase of selected channel
1155 * @param[in] epwm The pointer of the specified EPWM module
1156 * - EPWM0 : EPWM Group 0
1157 * - EPWM1 : EPWM Group 1
1158 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1159 * @param[in] u32SyncSrc EPWM synchronize source selection.
1160 * - \ref EPWM_SYNC_OUT_FROM_SYNCIN_SWSYNC
1161 * - \ref EPWM_SYNC_OUT_FROM_COUNT_TO_ZERO
1162 * - \ref EPWM_SYNC_OUT_FROM_COUNT_TO_COMPARATOR
1163 * - \ref EPWM_SYNC_OUT_DISABLE
1164 * @param[in] u32Direction Phase direction. Control EPWM counter count decrement or increment after synchronizing.
1165 * - \ref EPWM_PHS_DIR_DECREMENT
1166 * - \ref EPWM_PHS_DIR_INCREMENT
1167 * @param[in] u32StartPhase Synchronous start phase value. Valid values are between 0~65535.
1168 * @return None
1169 * @details This function is used to configure synchronization phase of selected channel.
1170 * @note Every two channels share the same setting.
1171 */
EPWM_ConfigSyncPhase(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32SyncSrc,uint32_t u32Direction,uint32_t u32StartPhase)1172 void EPWM_ConfigSyncPhase(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32SyncSrc, uint32_t u32Direction, uint32_t u32StartPhase)
1173 {
1174 /* every two channels shares the same setting */
1175 u32ChannelNum >>= 1U;
1176 (epwm)->SYNC = (((epwm)->SYNC & ~(((3UL << EPWM_SYNC_SINSRC0_Pos) << (u32ChannelNum << 1U)) | ((1UL << EPWM_SYNC_PHSDIR0_Pos) << u32ChannelNum))) | \
1177 (u32Direction << EPWM_SYNC_PHSDIR0_Pos << u32ChannelNum) | ((u32SyncSrc << EPWM_SYNC_SINSRC0_Pos) << (u32ChannelNum << 1U)));
1178 (epwm)->PHS[(u32ChannelNum)] = u32StartPhase;
1179 }
1180
1181
1182 /**
1183 * @brief Enable SYNC phase of selected channel(s)
1184 * @param[in] epwm The pointer of the specified EPWM module
1185 * - EPWM0 : EPWM Group 0
1186 * - EPWM1 : EPWM Group 1
1187 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
1188 * Bit 0 is channel 0, bit 1 is channel 1...
1189 * @return None
1190 * @details This function is used to enable SYNC phase of selected channel(s).
1191 * @note Every two channels share the same setting.
1192 */
EPWM_EnableSyncPhase(EPWM_T * epwm,uint32_t u32ChannelMask)1193 void EPWM_EnableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask)
1194 {
1195 uint32_t i;
1196 for(i = 0U; i < EPWM_CHANNEL_NUM; i ++)
1197 {
1198 if(u32ChannelMask & (1UL << i))
1199 {
1200 (epwm)->SYNC |= ((1UL << EPWM_SYNC_PHSEN0_Pos) << (i >> 1U));
1201 }
1202 }
1203 }
1204
1205 /**
1206 * @brief Disable SYNC phase of selected channel(s)
1207 * @param[in] epwm The pointer of the specified EPWM module
1208 * - EPWM0 : EPWM Group 0
1209 * - EPWM1 : EPWM Group 1
1210 * @param[in] u32ChannelMask Combination of enabled channels. Each bit corresponds to a channel.
1211 * Bit 0 is channel 0, bit 1 is channel 1...
1212 * @return None
1213 * @details This function is used to disable SYNC phase of selected channel(s).
1214 * @note Every two channels share the same setting.
1215 */
EPWM_DisableSyncPhase(EPWM_T * epwm,uint32_t u32ChannelMask)1216 void EPWM_DisableSyncPhase(EPWM_T *epwm, uint32_t u32ChannelMask)
1217 {
1218 uint32_t i;
1219 for(i = 0U; i < EPWM_CHANNEL_NUM; i ++)
1220 {
1221 if(u32ChannelMask & (1UL << i))
1222 {
1223 (epwm)->SYNC &= ~((1UL << EPWM_SYNC_PHSEN0_Pos) << (i >> 1U));
1224 }
1225 }
1226 }
1227
1228 /**
1229 * @brief Enable EPWM SYNC_IN noise filter function
1230 * @param[in] epwm The pointer of the specified EPWM module
1231 * - EPWM0 : EPWM Group 0
1232 * - EPWM1 : EPWM Group 1
1233 * @param[in] u32ClkCnt SYNC Edge Detector Filter Count. This controls the counter number of edge detector.
1234 * The valid value is 0~7.
1235 * @param[in] u32ClkDivSel SYNC Edge Detector Filter Clock Selection.
1236 * - \ref EPWM_NF_CLK_DIV_1
1237 * - \ref EPWM_NF_CLK_DIV_2
1238 * - \ref EPWM_NF_CLK_DIV_4
1239 * - \ref EPWM_NF_CLK_DIV_8
1240 * - \ref EPWM_NF_CLK_DIV_16
1241 * - \ref EPWM_NF_CLK_DIV_32
1242 * - \ref EPWM_NF_CLK_DIV_64
1243 * - \ref EPWM_NF_CLK_DIV_128
1244 * @return None
1245 * @details This function is used to enable EPWM SYNC_IN noise filter function.
1246 */
EPWM_EnableSyncNoiseFilter(EPWM_T * epwm,uint32_t u32ClkCnt,uint32_t u32ClkDivSel)1247 void EPWM_EnableSyncNoiseFilter(EPWM_T *epwm, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
1248 {
1249 (epwm)->SYNC = ((epwm)->SYNC & ~(EPWM_SYNC_SFLTCNT_Msk | EPWM_SYNC_SFLTCSEL_Msk)) | \
1250 ((u32ClkCnt << EPWM_SYNC_SFLTCNT_Pos) | (u32ClkDivSel << EPWM_SYNC_SFLTCSEL_Pos) | EPWM_SYNC_SNFLTEN_Msk);
1251 }
1252
1253 /**
1254 * @brief Disable EPWM SYNC_IN noise filter function
1255 * @param[in] epwm The pointer of the specified EPWM module
1256 * - EPWM0 : EPWM Group 0
1257 * - EPWM1 : EPWM Group 1
1258 * @return None
1259 * @details This function is used to Disable EPWM SYNC_IN noise filter function.
1260 */
EPWM_DisableSyncNoiseFilter(EPWM_T * epwm)1261 void EPWM_DisableSyncNoiseFilter(EPWM_T *epwm)
1262 {
1263 (epwm)->SYNC &= ~EPWM_SYNC_SNFLTEN_Msk;
1264 }
1265
1266 /**
1267 * @brief Enable EPWM SYNC input pin inverse function
1268 * @param[in] epwm The pointer of the specified EPWM module
1269 * - EPWM0 : EPWM Group 0
1270 * - EPWM1 : EPWM Group 1
1271 * @return None
1272 * @details This function is used to enable EPWM SYNC input pin inverse function.
1273 */
EPWM_EnableSyncPinInverse(EPWM_T * epwm)1274 void EPWM_EnableSyncPinInverse(EPWM_T *epwm)
1275 {
1276 (epwm)->SYNC |= EPWM_SYNC_SINPINV_Msk;
1277 }
1278
1279 /**
1280 * @brief Disable EPWM SYNC input pin inverse function
1281 * @param[in] epwm The pointer of the specified EPWM module
1282 * - EPWM0 : EPWM Group 0
1283 * - EPWM1 : EPWM Group 1
1284 * @return None
1285 * @details This function is used to Disable EPWM SYNC input pin inverse function.
1286 */
EPWM_DisableSyncPinInverse(EPWM_T * epwm)1287 void EPWM_DisableSyncPinInverse(EPWM_T *epwm)
1288 {
1289 (epwm)->SYNC &= (~EPWM_SYNC_SINPINV_Msk);
1290 }
1291
1292 /**
1293 * @brief Set EPWM clock source
1294 * @param[in] epwm The pointer of the specified EPWM module
1295 * - EPWM0 : EPWM Group 0
1296 * - EPWM1 : EPWM Group 1
1297 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1298 * @param[in] u32ClkSrcSel EPWM external clock source.
1299 * - \ref EPWM_CLKSRC_EPWM_CLK
1300 * - \ref EPWM_CLKSRC_TIMER0
1301 * - \ref EPWM_CLKSRC_TIMER1
1302 * - \ref EPWM_CLKSRC_TIMER2
1303 * - \ref EPWM_CLKSRC_TIMER3
1304 * @return None
1305 * @details This function is used to set EPWM clock source.
1306 * @note Every two channels share the same setting.
1307 * @note If the clock source of EPWM counter is selected from TIMERn interrupt events, the TRGEPWM(TIMERn_TRGCTL[1], n=0,1..3) bit must be set as 1.
1308 */
EPWM_SetClockSource(EPWM_T * epwm,uint32_t u32ChannelNum,uint32_t u32ClkSrcSel)1309 void EPWM_SetClockSource(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32ClkSrcSel)
1310 {
1311 (epwm)->CLKSRC = ((epwm)->CLKSRC & ~(EPWM_CLKSRC_ECLKSRC0_Msk << ((u32ChannelNum >> 1U) << 3U))) | \
1312 (u32ClkSrcSel << ((u32ChannelNum >> 1U) << 3U));
1313 }
1314
1315 /**
1316 * @brief Enable EPWM brake noise filter function
1317 * @param[in] epwm The pointer of the specified EPWM module
1318 * - EPWM0 : EPWM Group 0
1319 * - EPWM1 : EPWM Group 1
1320 * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1.
1321 * @param[in] u32ClkCnt SYNC Edge Detector Filter Count. This controls the counter number of edge detector
1322 * @param[in] u32ClkDivSel SYNC Edge Detector Filter Clock Selection.
1323 * - \ref EPWM_NF_CLK_DIV_1
1324 * - \ref EPWM_NF_CLK_DIV_2
1325 * - \ref EPWM_NF_CLK_DIV_4
1326 * - \ref EPWM_NF_CLK_DIV_8
1327 * - \ref EPWM_NF_CLK_DIV_16
1328 * - \ref EPWM_NF_CLK_DIV_32
1329 * - \ref EPWM_NF_CLK_DIV_64
1330 * - \ref EPWM_NF_CLK_DIV_128
1331 * @return None
1332 * @details This function is used to enable EPWM brake noise filter function.
1333 */
EPWM_EnableBrakeNoiseFilter(EPWM_T * epwm,uint32_t u32BrakePinNum,uint32_t u32ClkCnt,uint32_t u32ClkDivSel)1334 void EPWM_EnableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
1335 {
1336 (epwm)->BNF = ((epwm)->BNF & ~((EPWM_BNF_BRK0FCNT_Msk | EPWM_BNF_BRK0NFSEL_Msk) << (u32BrakePinNum << 3U))) | \
1337 (((u32ClkCnt << EPWM_BNF_BRK0FCNT_Pos) | (u32ClkDivSel << EPWM_BNF_BRK0NFSEL_Pos) | EPWM_BNF_BRK0NFEN_Msk) << (u32BrakePinNum << 3U));
1338 }
1339
1340 /**
1341 * @brief Disable EPWM brake noise filter function
1342 * @param[in] epwm The pointer of the specified EPWM module
1343 * - EPWM0 : EPWM Group 0
1344 * - EPWM1 : EPWM Group 1
1345 * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1.
1346 * @return None
1347 * @details This function is used to disable EPWM brake noise filter function.
1348 */
EPWM_DisableBrakeNoiseFilter(EPWM_T * epwm,uint32_t u32BrakePinNum)1349 void EPWM_DisableBrakeNoiseFilter(EPWM_T *epwm, uint32_t u32BrakePinNum)
1350 {
1351 (epwm)->BNF &= ~(EPWM_BNF_BRK0NFEN_Msk << (u32BrakePinNum << 3U));
1352 }
1353
1354 /**
1355 * @brief Enable EPWM brake pin inverse function
1356 * @param[in] epwm The pointer of the specified EPWM module
1357 * - EPWM0 : EPWM Group 0
1358 * - EPWM1 : EPWM Group 1
1359 * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1.
1360 * @return None
1361 * @details This function is used to enable EPWM brake pin inverse function.
1362 */
EPWM_EnableBrakePinInverse(EPWM_T * epwm,uint32_t u32BrakePinNum)1363 void EPWM_EnableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum)
1364 {
1365 (epwm)->BNF |= (EPWM_BNF_BRK0PINV_Msk << (u32BrakePinNum << 3U));
1366 }
1367
1368 /**
1369 * @brief Disable EPWM brake pin inverse function
1370 * @param[in] epwm The pointer of the specified EPWM module
1371 * - EPWM0 : EPWM Group 0
1372 * - EPWM1 : EPWM Group 1
1373 * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1.
1374 * @return None
1375 * @details This function is used to disable EPWM brake pin inverse function.
1376 */
EPWM_DisableBrakePinInverse(EPWM_T * epwm,uint32_t u32BrakePinNum)1377 void EPWM_DisableBrakePinInverse(EPWM_T *epwm, uint32_t u32BrakePinNum)
1378 {
1379 (epwm)->BNF &= ~(EPWM_BNF_BRK0PINV_Msk << (u32BrakePinNum * (uint32_t)EPWM_BNF_BRK1NFEN_Pos));
1380 }
1381
1382 /**
1383 * @brief Set EPWM brake pin source
1384 * @param[in] epwm The pointer of the specified EPWM module
1385 * - EPWM0 : EPWM Group 0
1386 * - EPWM1 : EPWM Group 1
1387 * @param[in] u32BrakePinNum Brake pin selection. Valid values are 0 or 1.
1388 * @param[in] u32SelAnotherModule Select to another module. Valid values are TRUE or FALSE.
1389 * @return None
1390 * @details This function is used to set EPWM brake pin source.
1391 */
EPWM_SetBrakePinSource(EPWM_T * epwm,uint32_t u32BrakePinNum,uint32_t u32SelAnotherModule)1392 void EPWM_SetBrakePinSource(EPWM_T *epwm, uint32_t u32BrakePinNum, uint32_t u32SelAnotherModule)
1393 {
1394 (epwm)->BNF = ((epwm)->BNF & ~(EPWM_BNF_BK0SRC_Msk << (u32BrakePinNum << 3U))) | (u32SelAnotherModule << ((uint32_t)EPWM_BNF_BK0SRC_Pos + (u32BrakePinNum << 3U)));
1395 }
1396
1397 /**
1398 * @brief Set EPWM leading edge blanking function
1399 * @param[in] epwm The pointer of the specified EPWM module
1400 * - EPWM0 : EPWM Group 0
1401 * - EPWM1 : EPWM Group 1
1402 * @param[in] u32TrigSrcSel Leading edge blanking source selection.
1403 * - \ref EPWM_LEBCTL_SRCEN0
1404 * - \ref EPWM_LEBCTL_SRCEN2
1405 * - \ref EPWM_LEBCTL_SRCEN4
1406 * - \ref EPWM_LEBCTL_SRCEN0_2
1407 * - \ref EPWM_LEBCTL_SRCEN0_4
1408 * - \ref EPWM_LEBCTL_SRCEN2_4
1409 * - \ref EPWM_LEBCTL_SRCEN0_2_4
1410 * @param[in] u32TrigType Leading edge blanking trigger type.
1411 * - \ref EPWM_LEBCTL_TRGTYPE_RISING
1412 * - \ref EPWM_LEBCTL_TRGTYPE_FALLING
1413 * - \ref EPWM_LEBCTL_TRGTYPE_RISING_OR_FALLING
1414 * @param[in] u32BlankingCnt Leading Edge Blanking Counter. Valid values are between 1~512.
1415 This counter value decides leading edge blanking window size, and this counter clock base is ECLK.
1416 * @param[in] u32BlankingEnable Enable EPWM leading edge blanking function. Valid values are TRUE (ENABLE) or FALSE (DISABLE).
1417 * - \ref FALSE
1418 * - \ref TRUE
1419 * @return None
1420 * @details This function is used to configure EPWM leading edge blanking function that blank the false trigger from ACMP brake source which may cause by EPWM output transition.
1421 * @note EPWM leading edge blanking function is only used for brake source from ACMP.
1422 */
EPWM_SetLeadingEdgeBlanking(EPWM_T * epwm,uint32_t u32TrigSrcSel,uint32_t u32TrigType,uint32_t u32BlankingCnt,uint32_t u32BlankingEnable)1423 void EPWM_SetLeadingEdgeBlanking(EPWM_T *epwm, uint32_t u32TrigSrcSel, uint32_t u32TrigType, uint32_t u32BlankingCnt, uint32_t u32BlankingEnable)
1424 {
1425 (epwm)->LEBCTL = (u32TrigType) | (u32TrigSrcSel) | (u32BlankingEnable);
1426 /* Blanking window size = LEBCNT + 1, so LEBCNT = u32BlankingCnt - 1 */
1427 (epwm)->LEBCNT = (u32BlankingCnt) - 1U;
1428 }
1429
1430 /**
1431 * @brief Get the time-base counter reached its maximum value flag of selected channel
1432 * @param[in] epwm The pointer of the specified EPWM module
1433 * - EPWM0 : EPWM Group 0
1434 * - EPWM1 : EPWM Group 1
1435 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1436 * @return Count to max interrupt flag of specified channel
1437 * @retval 0 Count to max interrupt did not occur
1438 * @retval 1 Count to max interrupt occurred
1439 * @details This function is used to get the time-base counter reached its maximum value flag of selected channel.
1440 */
EPWM_GetWrapAroundFlag(EPWM_T * epwm,uint32_t u32ChannelNum)1441 uint32_t EPWM_GetWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
1442 {
1443 return (((epwm)->STATUS & (EPWM_STATUS_CNTMAXF0_Msk << u32ChannelNum)) ? 1UL : 0UL);
1444 }
1445
1446 /**
1447 * @brief Clear the time-base counter reached its maximum value flag of selected channel
1448 * @param[in] epwm The pointer of the specified EPWM module
1449 * - EPWM0 : EPWM Group 0
1450 * - EPWM1 : EPWM Group 1
1451 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
1452 * @return None
1453 * @details This function is used to clear the time-base counter reached its maximum value flag of selected channel.
1454 */
EPWM_ClearWrapAroundFlag(EPWM_T * epwm,uint32_t u32ChannelNum)1455 void EPWM_ClearWrapAroundFlag(EPWM_T *epwm, uint32_t u32ChannelNum)
1456 {
1457 (epwm)->STATUS = (EPWM_STATUS_CNTMAXF0_Msk << u32ChannelNum);
1458 }
1459
1460 /*@}*/ /* end of group EPWM_EXPORTED_FUNCTIONS */
1461
1462 /*@}*/ /* end of group EPWM_Driver */
1463
1464 /*@}*/ /* end of group Standard_Driver */
1465
1466 /*** (C) COPYRIGHT 2016 Nuvoton Technology Corp. ***/
1467