Skip to content

Commit 045f443

Browse files
committed
Support M251/M261/M453/NANO130/NUC472 PWM duty cycle range as 0 ~ 10000
1 parent abdcc7b commit 045f443

File tree

10 files changed

+24
-24
lines changed

10 files changed

+24
-24
lines changed

targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u
138138
* - PWM1 : PWM Group 1
139139
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
140140
* @param[in] u32Frequency Target generator frequency
141-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
141+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
142142
* @return Nearest frequency clock in nano second
143143
* @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect
144144
* existing frequency of other channel.
@@ -155,7 +155,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u3
155155
* - PWM1 : PWM Group 1
156156
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
157157
* @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2
158-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
158+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
159159
* @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2
160160
* @return Nearest frequency clock in nano second
161161
* @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect
@@ -221,10 +221,10 @@ uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u
221221

222222
if (u32DutyCycle)
223223
{
224-
if (u32DutyCycle >= 100UL)
224+
if (u32DutyCycle >= 10000UL)
225225
PWM_SET_CMR(pwm, u32ChannelNum, u16CNR);
226226
else
227-
PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1UL) / 100UL);
227+
PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1UL) / 10000UL);
228228

229229
(pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1UL));
230230
(pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << ((u32ChannelNum << 1UL) + PWM_WGCTL0_PRDPCTL0_Pos));

targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,10 @@ static void pwmout_config(pwmout_t *obj, int start)
195195

196196
// NOTE: Support period < 1s
197197
// NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by:
198-
// 1. Inverse duty cycle (100 - duty)
198+
// 1. Inverse duty cycle (10000 - duty)
199199
// 2. Inverse PWM output polarity
200200
// This trick is here to pass ARM mbed CI test. First PWM pulse error still remains.
201-
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - obj->pulsewidth_us * 100 / obj->period_us, obj->period_us);
201+
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us);
202202
pwm_base->POLCTL |= 1 << (PWM_POLCTL_PINV0_Pos + chn);
203203

204204
if (start) {

targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_
117117
* - EPWM1 : EPWM Group 1
118118
* @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
119119
* @param[in] u32Frequency Target generator frequency
120-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
120+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
121121
* @return Nearest frequency clock in nano second
122122
* @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect
123123
* existing frequency of other channel.
@@ -136,7 +136,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t
136136
* - EPWM1 : EPWM Group 1
137137
* @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5
138138
* @param[in] u32Frequency Target generator frequency
139-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
139+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
140140
* @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2
141141
* @return Nearest frequency clock in nano second
142142
* @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect
@@ -183,7 +183,7 @@ uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_
183183

184184
u32CNR = u32CNR - 1U;
185185
EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR);
186-
EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1UL) / 100UL);
186+
EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1UL) / 10000UL);
187187

188188
(epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~((EPWM_WGCTL0_PRDPCTL0_Msk | EPWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1))) | \
189189
(EPWM_OUTPUT_HIGH << (u32ChannelNum << 1UL << EPWM_WGCTL0_ZPCTL0_Pos));

targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,10 +195,10 @@ static void pwmout_config(pwmout_t *obj, int start)
195195

196196
// NOTE: Support period < 1s
197197
// NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by:
198-
// 1. Inverse duty cycle (100 - duty)
198+
// 1. Inverse duty cycle (10000 - duty)
199199
// 2. Inverse PWM output polarity
200200
// This trick is here to pass ARM mbed CI test. First PWM pulse error still remains.
201-
EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - obj->pulsewidth_us * 100 / obj->period_us, obj->period_us);
201+
EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us);
202202
pwm_base->POLCTL |= 1 << (EPWM_POLCTL_PINV0_Pos + chn);
203203

204204
if (start) {

targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u
9797
* - PWM1 : PWM Group 1
9898
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
9999
* @param[in] u32Frequency Target generator frequency
100-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
100+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
101101
* @return Nearest frequency clock in nano second
102102
* @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect
103103
* existing frequency of other channel.
@@ -115,7 +115,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm,
115115
* @param[in] pwm The base address of PWM module
116116
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
117117
* @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2
118-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
118+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
119119
* @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2
120120
* @return Nearest frequency clock in nano second
121121
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
@@ -178,7 +178,7 @@ uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm,
178178
PWM_SET_CNR(pwm, u32ChannelNum, --u16CNR);
179179
if(u32DutyCycle)
180180
{
181-
PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 100 - 1);
181+
PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 10000 - 1);
182182
(pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2));
183183
(pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_PRDPCTL0_Pos));
184184
(pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2));

targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ static void pwmout_config(pwmout_t *obj)
195195
uint32_t chn = NU_MODSUBINDEX(obj->pwm);
196196
// NOTE: Support period < 1s
197197
//PWM_ConfigOutputChannel(pwm_base, chn, 1000 * 1000 / obj->period_us, obj->pulsewidth_us * 100 / obj->period_us);
198-
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 100 / obj->period_us, obj->period_us);
198+
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us);
199199
}
200200

201201
const PinMap *pwmout_pinmap()

targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* @param[in] pwm The base address of PWM module
2929
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
3030
* @param[in] u32Frequency Target generator frequency
31-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
31+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
3232
* @return Nearest frequency clock in nano second
3333
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
3434
* existing frequency of other channel.
@@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm,
4646
* @param[in] pwm The base address of PWM module
4747
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
4848
* @param[in] u32Frequency Target generator frequency
49-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
49+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
5050
* @return Nearest frequency clock in nano second
5151
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
5252
* existing frequency of other channel.
@@ -136,7 +136,7 @@ uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm,
136136
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk;
137137
else {
138138
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk;
139-
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 100 - 1) << PWM_DUTY_CM_Pos);
139+
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 10000 - 1) << PWM_DUTY_CM_Pos);
140140
}
141141
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CN_Msk;
142142
*(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= u16CNR;

targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,10 +198,10 @@ static void pwmout_config(pwmout_t *obj)
198198
uint32_t chn = NU_MODSUBINDEX(obj->pwm);
199199
// NOTE: Support period < 1s
200200
// NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by:
201-
// 1. Inverse duty cycle (100 - duty)
201+
// 1. Inverse duty cycle (10000 - duty)
202202
// 2. Inverse PWM output polarity
203203
// This trick is here to pass ARM mbed CI test. First PWM pulse error still remains.
204-
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - (obj->pulsewidth_us * 100 / obj->period_us), obj->period_us);
204+
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - (obj->pulsewidth_us * 10000 / obj->period_us), obj->period_us);
205205
}
206206

207207
const PinMap *pwmout_pinmap()

targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
* @param[in] pwm The base address of PWM module
2929
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
3030
* @param[in] u32Frequency Target generator frequency
31-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
31+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
3232
* @return Nearest frequency clock in nano second
3333
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
3434
* existing frequency of other channel.
@@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm,
4646
* @param[in] pwm The base address of PWM module
4747
* @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5
4848
* @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2
49-
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%...
49+
* @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%...
5050
* @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2
5151
* @return Nearest frequency clock in nano second
5252
* @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect
@@ -185,7 +185,7 @@ uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm,
185185
if(u32DutyCycle == 0)
186186
pwm->CMPDAT[u32ChannelNum] = 0;
187187
else
188-
pwm->CMPDAT[u32ChannelNum] = u32DutyCycle * (u16CNR + 1) / 100 - 1;
188+
pwm->CMPDAT[u32ChannelNum] = u32DutyCycle * (u16CNR + 1) / 10000 - 1;
189189
pwm->PERIOD[u32ChannelNum] = u16CNR;
190190

191191
return(i);

targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static void pwmout_config(pwmout_t *obj)
219219
uint32_t chn = NU_MODSUBINDEX(obj->pwm);
220220
// NOTE: Support period < 1s
221221
//PWM_ConfigOutputChannel(pwm_base, chn, 1000 * 1000 / obj->period_us, obj->pulsewidth_us * 100 / obj->period_us);
222-
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 100 / obj->period_us, obj->period_us);
222+
PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us);
223223
}
224224

225225
const PinMap *pwmout_pinmap()

0 commit comments

Comments
 (0)