M4521_BSP V3.02.000
The Board Support Package for M4521
pwm.c
Go to the documentation of this file.
1/**************************************************************************/
12#include "M4521.h"
13
38uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge)
39{
40 uint32_t u32Src;
41 uint32_t u32PWMClockSrc;
42 uint32_t u32NearestUnitTimeNsec;
43 uint16_t u16Prescale = 1, u16CNR = 0xFFFF;
44
45 if(pwm == PWM0)
46 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM0SEL_Msk;
47 else//(pwm == PWM1)
48 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM1SEL_Msk;
49
50 if(u32Src == 0)
51 {
52 //clock source is from PLL clock
53 u32PWMClockSrc = CLK_GetPLLClockFreq();
54 }
55 else
56 {
57 //clock source is from PCLK
59 u32PWMClockSrc = SystemCoreClock;
60 }
61
62 u32PWMClockSrc /= 1000;
63 for(u16Prescale = 1; u16Prescale <= 0x1000; u16Prescale++)
64 {
65 u32NearestUnitTimeNsec = (1000000 * u16Prescale) / u32PWMClockSrc;
66 if(u32NearestUnitTimeNsec < u32UnitTimeNsec)
67 {
68 if(u16Prescale == 0x1000) //limit to the maximum unit time(nano second)
69 break;
70 if(!((1000000 * (u16Prescale + 1) > (u32NearestUnitTimeNsec * u32PWMClockSrc))))
71 break;
72 continue;
73 }
74 break;
75 }
76
77 // convert to real register value
78 // every two channels share a prescaler
79 PWM_SET_PRESCALER(pwm, u32ChannelNum, --u16Prescale);
80
81 // set PWM to down count type(edge aligned)
82 (pwm)->CTL1 = ((pwm)->CTL1 & ~(PWM_CTL1_CNTTYPE0_Msk << (2 * u32ChannelNum))) | (1UL << (2 * u32ChannelNum));
83 // set PWM to auto-reload mode
84 (pwm)->CTL1 &= ~(PWM_CTL1_CNTMODE0_Msk << u32ChannelNum);
85 PWM_SET_CNR(pwm, u32ChannelNum, u16CNR);
86
87 return (u32NearestUnitTimeNsec);
88}
89
102uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle)
103{
104 uint32_t u32Src;
105 uint32_t u32PWMClockSrc;
106 uint32_t i;
107 uint16_t u16Prescale = 1, u16CNR = 0xFFFF;
108
109 if(pwm == PWM0)
110 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM0SEL_Msk;
111 else//(pwm == PWM1)
112 u32Src = CLK->CLKSEL2 & CLK_CLKSEL2_PWM1SEL_Msk;
113
114 if(u32Src == 0)
115 {
116 //clock source is from PLL clock
117 u32PWMClockSrc = CLK_GetPLLClockFreq();
118 }
119 else
120 {
121 //clock source is from PCLK
123 u32PWMClockSrc = SystemCoreClock;
124 }
125
126 for(u16Prescale = 1; u16Prescale < 0xFFF; u16Prescale++) //prescale could be 0~0xFFF
127 {
128 i = (u32PWMClockSrc / u32Frequency) / u16Prescale;
129 // If target value is larger than CNR, need to use a larger prescaler
130 if(i > (0x10000))
131 continue;
132
133 u16CNR = i;
134 break;
135 }
136 // Store return value here 'cos we're gonna change u16Prescale & u16CNR to the real value to fill into register
137 i = u32PWMClockSrc / (u16Prescale * u16CNR);
138
139 // convert to real register value
140 // every two channels share a prescaler
141 PWM_SET_PRESCALER(pwm, u32ChannelNum, --u16Prescale);
142 // set PWM to down count type(edge aligned)
143 (pwm)->CTL1 = ((pwm)->CTL1 & ~(PWM_CTL1_CNTTYPE0_Msk << (2 * u32ChannelNum))) | (1UL << (2 * u32ChannelNum));
144 // set PWM to auto-reload mode
145 (pwm)->CTL1 &= ~(PWM_CTL1_CNTMODE0_Msk << u32ChannelNum);
146
147 PWM_SET_CNR(pwm, u32ChannelNum, --u16CNR);
148 if(u32DutyCycle)
149 {
150 PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 100 - 1);
151 (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2));
152 (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_PRDPCTL0_Pos));
153 (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2));
154 (pwm)->WGCTL1 |= (PWM_OUTPUT_HIGH << (u32ChannelNum * 2 + PWM_WGCTL1_CMPDCTL0_Pos));
155 }
156 else
157 {
158 PWM_SET_CMR(pwm, u32ChannelNum, 0);
159 (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2));
160 (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_ZPCTL0_Pos));
161 (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2));
162 (pwm)->WGCTL1 |= (PWM_OUTPUT_HIGH << (u32ChannelNum * 2 + PWM_WGCTL1_CMPDCTL0_Pos));
163 }
164
165 return(i);
166}
167
178void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask)
179{
180 (pwm)->CNTEN |= u32ChannelMask;
181}
182
193void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask)
194{
195 uint32_t i;
196 for(i = 0; i < PWM_CHANNEL_NUM; i ++)
197 {
198 if(u32ChannelMask & (1 << i))
199 {
200 (pwm)->PERIOD[i] = 0;
201 }
202 }
203}
204
215void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask)
216{
217 (pwm)->CNTEN &= ~u32ChannelMask;
218}
219
246void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition)
247{
248 if(u32ChannelNum < 4)
249 {
250 (pwm)->EADCTS0 &= ~((PWM_EADCTS0_TRGSEL0_Msk) << (u32ChannelNum * 8));
251 (pwm)->EADCTS0 |= ((PWM_EADCTS0_TRGEN0_Msk | u32Condition) << (u32ChannelNum * 8));
252 }
253 else
254 {
255 (pwm)->EADCTS1 &= ~((PWM_EADCTS1_TRGSEL4_Msk) << ((u32ChannelNum - 4) * 8));
256 (pwm)->EADCTS1 |= ((PWM_EADCTS1_TRGEN4_Msk | u32Condition) << ((u32ChannelNum - 4) * 8));
257 }
258}
259
269void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum)
270{
271 if(u32ChannelNum < 4)
272 {
273 (pwm)->EADCTS0 &= ~(PWM_EADCTS0_TRGEN0_Msk << (u32ChannelNum * 8));
274 }
275 else
276 {
277 (pwm)->EADCTS1 &= ~(PWM_EADCTS1_TRGEN4_Msk << ((u32ChannelNum - 4) * 8));
278 }
279}
280
291void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition)
292{
293 (pwm)->STATUS = (PWM_STATUS_ADCTRGF0_Msk << u32ChannelNum);
294}
295
306uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum)
307{
308 return (((pwm)->STATUS & (PWM_STATUS_ADCTRGF0_Msk << u32ChannelNum)) ? 1 : 0);
309}
310
311
335void PWM_EnableFaultBrake(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32LevelMask, uint32_t u32BrakeSource)
336{
337 uint32_t i;
338 for(i = 0; i < PWM_CHANNEL_NUM; i ++)
339 {
340 if(u32ChannelMask & (1 << i))
341 {
342 if((u32BrakeSource == PWM_FB_EDGE_SYS_CSS) || (u32BrakeSource == PWM_FB_EDGE_SYS_BOD) || \
343 (u32BrakeSource == PWM_FB_EDGE_SYS_COR) || (u32BrakeSource == PWM_FB_LEVEL_SYS_CSS) || \
344 (u32BrakeSource == PWM_FB_LEVEL_SYS_BOD) || (u32BrakeSource == PWM_FB_LEVEL_SYS_COR))
345 {
346 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= (u32BrakeSource & (PWM_BRKCTL0_1_SYSEBEN_Msk | PWM_BRKCTL0_1_SYSLBEN_Msk));
347 (pwm)->FAILBRK |= (u32BrakeSource & 0xF);
348 }
349 else
350 {
351 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= u32BrakeSource;
352 }
353 }
354
355 if(u32LevelMask & (1 << i))
356 {
357 if(i % 2 == 0)
358 {
359 //set brake action as high level for even channel
360 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) &= ~PWM_BRKCTL0_1_BRKAEVEN_Msk;
361 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= ((3UL) << PWM_BRKCTL0_1_BRKAEVEN_Pos);
362 }
363 else
364 {
365 //set brake action as high level for odd channel
366 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) &= ~PWM_BRKCTL0_1_BRKAODD_Msk;
367 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= ((3UL) << PWM_BRKCTL0_1_BRKAODD_Pos);
368 }
369 }
370 else
371 {
372 if(i % 2 == 0)
373 {
374 //set brake action as low level for even channel
375 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) &= ~PWM_BRKCTL0_1_BRKAEVEN_Msk;
376 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= ((2UL) << PWM_BRKCTL0_1_BRKAEVEN_Pos);
377 }
378 else
379 {
380 //set brake action as low level for odd channel
381 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) &= ~PWM_BRKCTL0_1_BRKAODD_Msk;
382 *(__IO uint32_t *)(&((pwm)->BRKCTL0_1) + (i >> 1)) |= ((2UL) << PWM_BRKCTL0_1_BRKAODD_Pos);
383 }
384 }
385 }
386
387}
388
399void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask)
400{
401 (pwm)->CAPINEN |= u32ChannelMask;
402 (pwm)->CAPCTL |= u32ChannelMask;
403}
404
415void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask)
416{
417 (pwm)->CAPINEN &= ~u32ChannelMask;
418 (pwm)->CAPCTL &= ~u32ChannelMask;
419}
420
431void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
432{
433 (pwm)->POEN |= u32ChannelMask;
434}
435
446void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
447{
448 (pwm)->POEN &= ~u32ChannelMask;
449}
450
466void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode)
467{
468 uint32_t u32IsOddCh;
469 u32IsOddCh = u32ChannelNum % 2;
470 (pwm)->PDMACTL = ((pwm)->PDMACTL & ~((PWM_PDMACTL_CHSEL0_1_Msk | PWM_PDMACTL_CAPORD0_1_Msk | PWM_PDMACTL_CAPMOD0_1_Msk) << ((u32ChannelNum >> 1) * 8))) | \
471 (((u32IsOddCh << PWM_PDMACTL_CHSEL0_1_Pos) | (u32RisingFirst << PWM_PDMACTL_CAPORD0_1_Pos) | \
472 u32Mode | PWM_PDMACTL_CHEN0_1_Msk) << ((u32ChannelNum >> 1) * 8));
473}
474
484void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelNum)
485{
486 (pwm)->PDMACTL &= ~(PWM_PDMACTL_CHEN0_1_Msk << ((u32ChannelNum >> 1) * 8));
487}
488
501void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration)
502{
503 // every two channels share the same setting
504 *(__IO uint32_t *)(&((pwm)->DTCTL0_1) + (u32ChannelNum >> 1)) &= ~PWM_DTCTL0_1_DTCNT_Msk;
505 *(__IO uint32_t *)(&((pwm)->DTCTL0_1) + (u32ChannelNum >> 1)) |= PWM_DTCTL0_1_DTEN_Msk | u32Duration;
506}
507
518void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum)
519{
520 // every two channels shares the same setting
521 *(__IO uint32_t *)(&((pwm)->DTCTL0_1) + (u32ChannelNum >> 1)) &= ~PWM_DTCTL0_1_DTEN_Msk;
522}
523
536void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
537{
538 (pwm)->CAPIEN |= (u32Edge << u32ChannelNum);
539}
540
553void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
554{
555 (pwm)->CAPIEN &= ~(u32Edge << u32ChannelNum);
556}
557
570void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
571{
572 (pwm)->CAPIF = (u32Edge << u32ChannelNum);
573}
574
587uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
588{
589 return (((((pwm)->CAPIF & (PWM_CAPIF_CFLIF0_Msk << u32ChannelNum)) ? 1 : 0) << 1) | \
590 (((pwm)->CAPIF & (PWM_CAPIF_CRLIF0_Msk << u32ChannelNum)) ? 1 : 0));
591}
604void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType)
605{
606 (pwm)->INTEN0 |= (u32IntDutyType << u32ChannelNum);
607}
608
618void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum)
619{
620 (pwm)->INTEN0 &= ~((PWM_DUTY_INT_DOWN_COUNT_MATCH_CMP | PWM_DUTY_INT_UP_COUNT_MATCH_CMP) << u32ChannelNum);
621}
622
632void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
633{
634 (pwm)->INTSTS0 = (PWM_INTSTS0_CMPUIF0_Msk | PWM_INTSTS0_CMPDIF0_Msk) << u32ChannelNum;
635}
636
648uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
649{
650 return ((((pwm)->INTSTS0 & ((PWM_INTSTS0_CMPDIF0_Msk | PWM_INTSTS0_CMPUIF0_Msk) << u32ChannelNum))) ? 1 : 0);
651}
652
664void PWM_EnableFaultBrakeInt(PWM_T *pwm, uint32_t u32BrakeSource)
665{
666 (pwm)->INTEN1 |= (0x7 << u32BrakeSource);
667}
668
680void PWM_DisableFaultBrakeInt(PWM_T *pwm, uint32_t u32BrakeSource)
681{
682 (pwm)->INTEN1 &= ~(0x7 << u32BrakeSource);
683}
684
695void PWM_ClearFaultBrakeIntFlag(PWM_T *pwm, uint32_t u32BrakeSource)
696{
697 (pwm)->INTSTS1 = (0x3f << u32BrakeSource);
698}
699
711uint32_t PWM_GetFaultBrakeIntFlag(PWM_T *pwm, uint32_t u32BrakeSource)
712{
713 return (((pwm)->INTSTS1 & (0x3f << u32BrakeSource)) ? 1 : 0);
714}
715
726void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType)
727{
728 (pwm)->INTEN0 |= (PWM_INTEN0_PIEN0_Msk << u32ChannelNum);
729}
730
740void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum)
741{
742 (pwm)->INTEN0 &= ~(PWM_INTEN0_PIEN0_Msk << u32ChannelNum);
743}
744
754void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
755{
756 (pwm)->INTSTS0 = (PWM_INTSTS0_PIF0_Msk << u32ChannelNum);
757}
758
770uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
771{
772 return ((((pwm)->INTSTS0 & (PWM_INTSTS0_PIF0_Msk << u32ChannelNum))) ? 1 : 0);
773}
774
784void PWM_EnableZeroInt(PWM_T *pwm, uint32_t u32ChannelNum)
785{
786 (pwm)->INTEN0 |= (PWM_INTEN0_ZIEN0_Msk << u32ChannelNum);
787}
788
798void PWM_DisableZeroInt(PWM_T *pwm, uint32_t u32ChannelNum)
799{
800 (pwm)->INTEN0 &= ~(PWM_INTEN0_ZIEN0_Msk << u32ChannelNum);
801}
802
812void PWM_ClearZeroIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
813{
814 (pwm)->INTSTS0 = (PWM_INTSTS0_ZIF0_Msk << u32ChannelNum);
815}
816
828uint32_t PWM_GetZeroIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
829{
830 return ((((pwm)->INTSTS0 & (PWM_INTSTS0_ZIF0_Msk << u32ChannelNum))) ? 1 : 0);
831}
832
853void PWM_EnableAcc(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntFlagCnt, uint32_t u32IntAccSrc)
854{
855 (pwm)->IFA = ((pwm)->IFA & ~((PWM_IFA_IFCNT0_1_Msk | PWM_IFA_IFSEL0_1_Msk) << ((u32ChannelNum >> 1) * 8))) | \
856 ((PWM_IFA_IFAEN0_1_Msk | (u32IntAccSrc << PWM_IFA_IFSEL0_1_Pos) | u32IntFlagCnt) << ((u32ChannelNum >> 1) * 8));
857}
858
869void PWM_DisableAcc(PWM_T *pwm, uint32_t u32ChannelNum)
870{
871 (pwm)->IFA = (pwm)->IFA & ~(PWM_IFA_IFAEN0_1_Msk << ((u32ChannelNum >> 1) * 8));
872}
873
884void PWM_EnableAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
885{
886 (pwm)->INTEN0 |= (PWM_INTEN0_IFAIEN0_1_Msk << ((u32ChannelNum >> 1) * 8));
887}
888
899void PWM_DisableAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
900{
901 (pwm)->INTEN0 &= ~(PWM_INTEN0_IFAIEN0_1_Msk << ((u32ChannelNum >> 1) * 8));
902}
903
914void PWM_ClearAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
915{
916 (pwm)->INTSTS0 = (PWM_INTSTS0_IFAIF0_1_Msk << ((u32ChannelNum >> 1) * 8));
917}
918
930uint32_t PWM_GetAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
931{
932 return (((pwm)->INTSTS0 & (PWM_INTSTS0_IFAIF0_1_Msk << ((u32ChannelNum >> 1) * 8))) ? 1 : 0);
933}
934
944void PWM_ClearFTDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
945{
946 (pwm)->FTCI = ((PWM_FTCI_FTCMU0_Msk | PWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1));
947}
948
960uint32_t PWM_GetFTDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
961{
962 return (((pwm)->FTCI & ((PWM_FTCI_FTCMU0_Msk | PWM_FTCI_FTCMD0_Msk) << (u32ChannelNum >> 1))) ? 1 : 0);
963}
964
978void PWM_EnableLoadMode(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
979{
980 (pwm)->CTL0 |= (u32LoadMode << u32ChannelNum);
981}
982
996void PWM_DisableLoadMode(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
997{
998 (pwm)->CTL0 &= ~(u32LoadMode << u32ChannelNum);
999}
1000
1020void PWM_ConfigSyncPhase(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32SyncSrc, uint32_t u32Direction, uint32_t u32StartPhase)
1021{
1022 // every two channels shares the same setting
1023 u32ChannelNum >>= 1;
1024 (pwm)->SYNC = (((pwm)->SYNC & ~((PWM_SYNC_SINSRC0_Msk << (u32ChannelNum << 1)) | (PWM_SYNC_PHSDIR0_Msk << u32ChannelNum))) | \
1025 (u32Direction << PWM_SYNC_PHSDIR0_Pos << u32ChannelNum) | (u32SyncSrc << PWM_SYNC_SINSRC0_Pos) << (u32ChannelNum << 1));
1026 *(__IO uint32_t *)(&((pwm)->PHS0_1) + u32ChannelNum) = u32StartPhase;
1027}
1028
1029
1041void PWM_EnableSyncPhase(PWM_T *pwm, uint32_t u32ChannelMask)
1042{
1043 uint32_t i;
1044 for(i = 0; i < PWM_CHANNEL_NUM; i ++)
1045 {
1046 if(u32ChannelMask & (1 << i))
1047 {
1048 (pwm)->SYNC |= (PWM_SYNC_PHSEN0_Msk << (i >> 1));
1049 }
1050 }
1051}
1052
1064void PWM_DisableSyncPhase(PWM_T *pwm, uint32_t u32ChannelMask)
1065{
1066 uint32_t i;
1067 for(i = 0; i < PWM_CHANNEL_NUM; i ++)
1068 {
1069 if(u32ChannelMask & (1 << i))
1070 {
1071 (pwm)->SYNC &= ~(PWM_SYNC_PHSEN0_Msk << (i >> 1));
1072 }
1073 }
1074}
1075
1095void PWM_EnableSyncNoiseFilter(PWM_T *pwm, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
1096{
1097 (pwm)->SYNC = ((pwm)->SYNC & ~(PWM_SYNC_SFLTCNT_Msk | PWM_SYNC_SFLTCSEL_Msk)) | \
1098 ((u32ClkCnt << PWM_SYNC_SFLTCNT_Pos) | (u32ClkDivSel << PWM_SYNC_SFLTCSEL_Pos) | PWM_SYNC_SNFLTEN_Msk);
1099}
1100
1110{
1111 (pwm)->SYNC &= ~PWM_SYNC_SNFLTEN_Msk;
1112}
1113
1123{
1124 (pwm)->SYNC |= PWM_SYNC_SINPINV_Msk;
1125}
1126
1136{
1137 (pwm)->SYNC &= ~PWM_SYNC_SINPINV_Msk;
1138}
1139
1156void PWM_SetClockSource(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32ClkSrcSel)
1157{
1158 (pwm)->CLKSRC = ((pwm)->CLKSRC & ~(PWM_CLKSRC_ECLKSRC0_Msk << ((u32ChannelNum >> 1)) * PWM_CLKSRC_ECLKSRC2_Pos)) | \
1159 (u32ClkSrcSel << ((u32ChannelNum >> 1) * PWM_CLKSRC_ECLKSRC2_Pos));
1160}
1161
1181void PWM_EnableBrakeNoiseFilter(PWM_T *pwm, uint32_t u32BrakePinNum, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
1182{
1183 (pwm)->BNF = ((pwm)->BNF & ~((PWM_BNF_BRK0FCNT_Msk | PWM_BNF_BRK0NFSEL_Msk) << (u32BrakePinNum * PWM_BNF_BRK1NFEN_Pos))) | \
1184 (((u32ClkCnt << PWM_BNF_BRK0FCNT_Pos) | (u32ClkDivSel << PWM_BNF_BRK0NFSEL_Pos) | PWM_BNF_BRK0NFEN_Msk) << (u32BrakePinNum * PWM_BNF_BRK1NFEN_Pos));
1185}
1186
1196void PWM_DisableBrakeNoiseFilter(PWM_T *pwm, uint32_t u32BrakePinNum)
1197{
1198 (pwm)->BNF &= ~(PWM_BNF_BRK0NFEN_Msk << (u32BrakePinNum * PWM_BNF_BRK1NFEN_Pos));
1199}
1200
1210void PWM_EnableBrakePinInverse(PWM_T *pwm, uint32_t u32BrakePinNum)
1211{
1212 (pwm)->BNF |= (PWM_BNF_BRK0PINV_Msk << (u32BrakePinNum * PWM_BNF_BRK1NFEN_Pos));
1213}
1214
1224void PWM_DisableBrakePinInverse(PWM_T *pwm, uint32_t u32BrakePinNum)
1225{
1226 (pwm)->BNF &= ~(PWM_BNF_BRK0PINV_Msk << (u32BrakePinNum * PWM_BNF_BRK1NFEN_Pos));
1227}
1228
1239void PWM_SetBrakePinSource(PWM_T *pwm, uint32_t u32BrakePinNum, uint32_t u32SelAnotherModule)
1240{
1241 (pwm)->BNF = ((pwm)->BNF & ~(PWM_BNF_BK0SRC_Msk << (u32BrakePinNum * 8))) | (u32SelAnotherModule << (PWM_BNF_BK0SRC_Pos + u32BrakePinNum * 8));
1242}
1243
1255uint32_t PWM_GetWrapAroundFlag(PWM_T *pwm, uint32_t u32ChannelNum)
1256{
1257 return (((pwm)->STATUS & (PWM_STATUS_CNTMAXF0_Msk << u32ChannelNum)) ? 1 : 0);
1258}
1259
1269void PWM_ClearWrapAroundFlag(PWM_T *pwm, uint32_t u32ChannelNum)
1270{
1271 (pwm)->STATUS = (PWM_STATUS_CNTMAXF0_Msk << u32ChannelNum);
1272}
1273
1274 /* end of group PWM_EXPORTED_FUNCTIONS */
1276 /* end of group PWM_Driver */
1278 /* end of group Standard_Driver */
1280
1281/*** (C) COPYRIGHT 2022 Nuvoton Technology Corp. ***/
#define PWM_INTEN0_PIEN0_Msk
Definition: M4521.h:6560
#define PWM_INTEN0_ZIEN0_Msk
Definition: M4521.h:6536
#define PWM_CLKSRC_ECLKSRC0_Msk
Definition: M4521.h:6101
#define PWM_SYNC_PHSEN0_Msk
Definition: M4521.h:6044
#define PWM_BRKCTL0_1_BRKAODD_Pos
Definition: M4521.h:6415
#define PWM_PDMACTL_CAPORD0_1_Pos
Definition: M4521.h:7153
#define PWM_WGCTL1_CMPDCTL0_Msk
Definition: M4521.h:6296
#define PWM_SYNC_SINPINV_Msk
Definition: M4521.h:6074
#define PWM_INTSTS0_CMPDIF0_Msk
Definition: M4521.h:6719
#define PWM_BNF_BRK0NFEN_Msk
Definition: M4521.h:6356
#define PWM_BRKCTL0_1_BRKAEVEN_Pos
Definition: M4521.h:6412
#define PWM_INTSTS0_ZIF0_Msk
Definition: M4521.h:6647
#define PWM_SYNC_SFLTCNT_Msk
Definition: M4521.h:6071
#define PWM_BNF_BRK0NFSEL_Msk
Definition: M4521.h:6359
#define PWM_INTSTS0_CMPUIF0_Msk
Definition: M4521.h:6695
#define PWM_SYNC_SFLTCSEL_Pos
Definition: M4521.h:6067
#define PWM_SYNC_SINSRC0_Pos
Definition: M4521.h:6055
#define PWM_WGCTL0_ZPCTL0_Pos
Definition: M4521.h:6232
#define PWM_IFA_IFSEL0_1_Msk
Definition: M4521.h:6818
#define PWM_INTSTS0_IFAIF0_1_Msk
Definition: M4521.h:6665
#define PWM_BNF_BK0SRC_Pos
Definition: M4521.h:6379
#define PWM_CAPIF_CRLIF0_Msk
Definition: M4521.h:7238
#define PWM_SYNC_PHSDIR0_Pos
Definition: M4521.h:6079
#define PWM_WGCTL1_CMPUCTL0_Msk
Definition: M4521.h:6275
#define PWM_BNF_BRK0FCNT_Pos
Definition: M4521.h:6361
#define PWM_PDMACTL_CHSEL0_1_Pos
Definition: M4521.h:7156
#define PWM_WGCTL0_ZPCTL0_Msk
Definition: M4521.h:6233
#define PWM_SYNC_SFLTCSEL_Msk
Definition: M4521.h:6068
#define PWM_PDMACTL_CAPORD0_1_Msk
Definition: M4521.h:7154
#define PWM_STATUS_ADCTRGF0_Msk
Definition: M4521.h:6947
#define PWM_SYNC_SFLTCNT_Pos
Definition: M4521.h:6070
#define PWM_SYNC_SINSRC0_Msk
Definition: M4521.h:6056
#define PWM_FTCI_FTCMD0_Msk
Definition: M4521.h:7307
#define PWM_SYNC_PHSDIR0_Msk
Definition: M4521.h:6080
#define PWM_PDMACTL_CHSEL0_1_Msk
Definition: M4521.h:7157
#define PWM_CLKSRC_ECLKSRC2_Pos
Definition: M4521.h:6103
#define PWM_FTCI_FTCMU0_Msk
Definition: M4521.h:7295
#define PWM_BNF_BRK1NFEN_Pos
Definition: M4521.h:6367
#define PWM_BRKCTL0_1_SYSEBEN_Msk
Definition: M4521.h:6401
#define PWM_BNF_BRK0NFSEL_Pos
Definition: M4521.h:6358
#define PWM_CAPIF_CFLIF0_Msk
Definition: M4521.h:7259
#define PWM_CTL1_CNTTYPE0_Msk
Definition: M4521.h:5990
#define PWM_EADCTS1_TRGEN4_Msk
Definition: M4521.h:6869
#define PWM_WGCTL1_CMPDCTL0_Pos
Definition: M4521.h:6295
#define PWM_IFA_IFAEN0_1_Msk
Definition: M4521.h:6821
#define PWM_PDMACTL_CHEN0_1_Msk
Definition: M4521.h:7148
#define PWM_EADCTS0_TRGSEL0_Msk
Definition: M4521.h:6842
#define PWM_WGCTL0_PRDPCTL0_Msk
Definition: M4521.h:6254
#define PWM_BRKCTL0_1_BRKAODD_Msk
Definition: M4521.h:6416
#define PWM_CTL1_CNTMODE0_Msk
Definition: M4521.h:6011
#define PWM_INTSTS0_PIF0_Msk
Definition: M4521.h:6671
#define PWM_EADCTS1_TRGSEL4_Msk
Definition: M4521.h:6866
#define PWM_BRKCTL0_1_BRKAEVEN_Msk
Definition: M4521.h:6413
#define PWM_PDMACTL_CAPMOD0_1_Msk
Definition: M4521.h:7151
#define PWM_WGCTL0_PRDPCTL0_Pos
Definition: M4521.h:6253
#define PWM_BRKCTL0_1_SYSLBEN_Msk
Definition: M4521.h:6410
#define PWM_BNF_BRK0FCNT_Msk
Definition: M4521.h:6362
#define PWM_BNF_BK0SRC_Msk
Definition: M4521.h:6380
#define PWM_DTCTL0_1_DTEN_Msk
Definition: M4521.h:6191
#define PWM_BNF_BRK0PINV_Msk
Definition: M4521.h:6365
#define PWM_INTEN0_IFAIEN0_1_Msk
Definition: M4521.h:6554
#define PWM_IFA_IFCNT0_1_Msk
Definition: M4521.h:6815
#define PWM_STATUS_CNTMAXF0_Msk
Definition: M4521.h:6914
#define PWM_IFA_IFSEL0_1_Pos
Definition: M4521.h:6817
#define PWM_SYNC_SNFLTEN_Msk
Definition: M4521.h:6065
#define PWM_EADCTS0_TRGEN0_Msk
Definition: M4521.h:6845
__STATIC_INLINE uint32_t CLK_GetPLLClockFreq(void)
Get PLL clock frequency.
Definition: clk.h:332
#define CLK_CLKSEL2_PWM0SEL_Msk
Definition: M4521.h:1605
#define CLK_CLKSEL2_PWM1SEL_Msk
Definition: M4521.h:1608
#define PWM_DUTY_INT_UP_COUNT_MATCH_CMP
Definition: pwm.h:113
#define PWM_OUTPUT_HIGH
Definition: pwm.h:58
#define PWM_FB_LEVEL_SYS_COR
Definition: pwm.h:94
#define PWM_FB_LEVEL_SYS_CSS
Definition: pwm.h:92
#define PWM_FB_EDGE_SYS_COR
Definition: pwm.h:88
#define PWM_DUTY_INT_DOWN_COUNT_MATCH_CMP
Definition: pwm.h:112
#define PWM_FB_EDGE_SYS_BOD
Definition: pwm.h:87
#define PWM_CHANNEL_NUM
Definition: pwm.h:32
#define PWM_FB_EDGE_SYS_CSS
Definition: pwm.h:86
#define PWM_FB_LEVEL_SYS_BOD
Definition: pwm.h:93
#define PWM_OUTPUT_LOW
Definition: pwm.h:57
void PWM_ClearZeroIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Clear zero interrupt of selected channel.
Definition: pwm.c:812
void PWM_ForceStop(PWM_T *pwm, uint32_t u32ChannelMask)
Stop PWM generation immediately by clear channel enable bit.
Definition: pwm.c:215
void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask)
Stop PWM module.
Definition: pwm.c:193
void PWM_EnableSyncPhase(PWM_T *pwm, uint32_t u32ChannelMask)
Enable SYNC phase of selected channel(s)
Definition: pwm.c:1041
void PWM_EnableCapture(PWM_T *pwm, uint32_t u32ChannelMask)
Enable capture of selected channel(s)
Definition: pwm.c:399
void PWM_EnablePDMA(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32RisingFirst, uint32_t u32Mode)
Enables PDMA transfer of selected channel for PWM capture.
Definition: pwm.c:466
void PWM_EnableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Duration)
Enable Dead zone of selected channel.
Definition: pwm.c:501
void PWM_ClearCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
Clear capture interrupt of selected channel.
Definition: pwm.c:570
void PWM_ClearADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition)
Clear selected channel trigger EADC flag.
Definition: pwm.c:291
void PWM_DisableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum)
Disable selected channel to trigger EADC.
Definition: pwm.c:269
uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32UnitTimeNsec, uint32_t u32CaptureEdge)
Configure PWM capture and get the nearest unit time.
Definition: pwm.c:38
void PWM_EnableBrakeNoiseFilter(PWM_T *pwm, uint32_t u32BrakePinNum, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
Enable PWM brake noise filter function.
Definition: pwm.c:1181
void PWM_DisablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum)
Disable period interrupt of selected channel.
Definition: pwm.c:740
void PWM_EnableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntDutyType)
Enable duty interrupt of selected channel.
Definition: pwm.c:604
uint32_t PWM_GetAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
Get interrupt flag accumulator interrupt of selected channel.
Definition: pwm.c:930
uint32_t PWM_GetFaultBrakeIntFlag(PWM_T *pwm, uint32_t u32BrakeSource)
This function get fault brake interrupt flag of selected source.
Definition: pwm.c:711
uint32_t PWM_GetFTDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get free trigger duty interrupt flag of selected channel.
Definition: pwm.c:960
void PWM_ClearFTDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Clear free trigger duty interrupt flag of selected channel.
Definition: pwm.c:944
void PWM_DisableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
Disable capture interrupt of selected channel.
Definition: pwm.c:553
void PWM_DisableFaultBrakeInt(PWM_T *pwm, uint32_t u32BrakeSource)
This function disable fault brake interrupt.
Definition: pwm.c:680
uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle)
This function Configure PWM generator and get the nearest frequency in edge aligned auto-reload mode.
Definition: pwm.c:102
void PWM_DisableLoadMode(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
Disable load mode of selected channel.
Definition: pwm.c:996
void PWM_ConfigSyncPhase(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32SyncSrc, uint32_t u32Direction, uint32_t u32StartPhase)
Configure synchronization phase of selected channel.
Definition: pwm.c:1020
void PWM_DisableSyncNoiseFilter(PWM_T *pwm)
Disable PWM SYNC_IN noise filter function.
Definition: pwm.c:1109
void PWM_DisableBrakeNoiseFilter(PWM_T *pwm, uint32_t u32BrakePinNum)
Disable PWM brake noise filter function.
Definition: pwm.c:1196
void PWM_SetClockSource(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32ClkSrcSel)
Set PWM clock source.
Definition: pwm.c:1156
uint32_t PWM_GetADCTriggerFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get selected channel trigger EADC flag.
Definition: pwm.c:306
void PWM_DisableCapture(PWM_T *pwm, uint32_t u32ChannelMask)
Disable capture of selected channel(s)
Definition: pwm.c:415
void PWM_ClearWrapAroundFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Clear the time-base counter reached its maximum value flag of selected channel.
Definition: pwm.c:1269
uint32_t PWM_GetZeroIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get zero interrupt of selected channel.
Definition: pwm.c:828
void PWM_EnableAcc(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntFlagCnt, uint32_t u32IntAccSrc)
Enable interrupt flag accumulator of selected channel.
Definition: pwm.c:853
#define PWM_SET_CMR(pwm, u32ChannelNum, u32CMR)
This macro set the comparator of the selected channel.
Definition: pwm.h:309
void PWM_DisableDutyInt(PWM_T *pwm, uint32_t u32ChannelNum)
Disable duty interrupt of selected channel.
Definition: pwm.c:618
void PWM_EnableBrakePinInverse(PWM_T *pwm, uint32_t u32BrakePinNum)
Enable PWM brake pin inverse function.
Definition: pwm.c:1210
void PWM_EnableLoadMode(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32LoadMode)
Enable load mode of selected channel.
Definition: pwm.c:978
void PWM_ClearDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Clear duty interrupt flag of selected channel.
Definition: pwm.c:632
#define PWM_SET_CNR(pwm, u32ChannelNum, u32CNR)
This macro set the period of the selected channel.
Definition: pwm.h:334
void PWM_EnablePeriodInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32IntPeriodType)
Enable period interrupt of selected channel.
Definition: pwm.c:726
void PWM_EnableFaultBrake(PWM_T *pwm, uint32_t u32ChannelMask, uint32_t u32LevelMask, uint32_t u32BrakeSource)
This function enable fault brake of selected channel(s)
Definition: pwm.c:335
uint32_t PWM_GetDutyIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get duty interrupt flag of selected channel.
Definition: pwm.c:648
void PWM_DisableDeadZone(PWM_T *pwm, uint32_t u32ChannelNum)
Disable Dead zone of selected channel.
Definition: pwm.c:518
void PWM_ClearAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
Clear interrupt flag accumulator interrupt of selected channel.
Definition: pwm.c:914
uint32_t PWM_GetWrapAroundFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get the time-base counter reached its maximum value flag of selected channel.
Definition: pwm.c:1255
void PWM_EnableAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
Enable interrupt flag accumulator interrupt of selected channel.
Definition: pwm.c:884
void PWM_DisableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
Disables PWM output generation of selected channel(s)
Definition: pwm.c:446
void PWM_SetBrakePinSource(PWM_T *pwm, uint32_t u32BrakePinNum, uint32_t u32SelAnotherModule)
Set PWM brake pin source.
Definition: pwm.c:1239
void PWM_DisableAcc(PWM_T *pwm, uint32_t u32ChannelNum)
Disable interrupt flag accumulator of selected channel.
Definition: pwm.c:869
void PWM_ClearFaultBrakeIntFlag(PWM_T *pwm, uint32_t u32BrakeSource)
This function clear fault brake interrupt of selected source.
Definition: pwm.c:695
void PWM_EnableZeroInt(PWM_T *pwm, uint32_t u32ChannelNum)
Enable zero interrupt of selected channel.
Definition: pwm.c:784
#define PWM_SET_PRESCALER(pwm, u32ChannelNum, u32Prescaler)
This macro set the prescaler of the selected channel.
Definition: pwm.h:297
void PWM_DisablePDMA(PWM_T *pwm, uint32_t u32ChannelNum)
Disables PDMA transfer of selected channel for PWM capture.
Definition: pwm.c:484
void PWM_DisableSyncPinInverse(PWM_T *pwm)
Disable PWM SYNC input pin inverse function.
Definition: pwm.c:1135
void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask)
Start PWM module.
Definition: pwm.c:178
void PWM_DisableZeroInt(PWM_T *pwm, uint32_t u32ChannelNum)
Disable zero interrupt of selected channel.
Definition: pwm.c:798
void PWM_DisableBrakePinInverse(PWM_T *pwm, uint32_t u32BrakePinNum)
Disable PWM brake pin inverse function.
Definition: pwm.c:1224
void PWM_ClearPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Clear period interrupt of selected channel.
Definition: pwm.c:754
void PWM_EnableOutput(PWM_T *pwm, uint32_t u32ChannelMask)
Enables PWM output generation of selected channel(s)
Definition: pwm.c:431
void PWM_DisableSyncPhase(PWM_T *pwm, uint32_t u32ChannelMask)
Disable SYNC phase of selected channel(s)
Definition: pwm.c:1064
void PWM_EnableFaultBrakeInt(PWM_T *pwm, uint32_t u32BrakeSource)
This function enable fault brake interrupt.
Definition: pwm.c:664
void PWM_EnableSyncPinInverse(PWM_T *pwm)
Enable PWM SYNC input pin inverse function.
Definition: pwm.c:1122
void PWM_DisableAccInt(PWM_T *pwm, uint32_t u32ChannelNum)
Disable interrupt flag accumulator interrupt of selected channel.
Definition: pwm.c:899
uint32_t PWM_GetCaptureIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get capture interrupt of selected channel.
Definition: pwm.c:587
uint32_t PWM_GetPeriodIntFlag(PWM_T *pwm, uint32_t u32ChannelNum)
Get period interrupt of selected channel.
Definition: pwm.c:770
void PWM_EnableSyncNoiseFilter(PWM_T *pwm, uint32_t u32ClkCnt, uint32_t u32ClkDivSel)
Enable PWM SYNC_IN noise filter function.
Definition: pwm.c:1095
void PWM_EnableCaptureInt(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Edge)
Enable capture interrupt of selected channel.
Definition: pwm.c:536
void PWM_EnableADCTrigger(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Condition)
Enable selected channel to trigger EADC.
Definition: pwm.c:246
#define CLK
Definition: M4521.h:13822
#define PWM0
Definition: M4521.h:13846
Definition: M4521.h:4525
uint32_t SystemCoreClock
Definition: system_M4521.c:24
void SystemCoreClockUpdate(void)
Updates the SystemCoreClock with current core Clock retrieved from cpu registers.
Definition: system_M4521.c:32