From abdcc7b8319bc6e46ec4834ea7b7c97b8131ac54 Mon Sep 17 00:00:00 2001 From: cyliangtw Date: Thu, 4 Mar 2021 17:10:04 +0800 Subject: [PATCH 1/3] Support M480 PWM duty cycle range as 0 ~ 10000 --- .../TARGET_M480/device/StdDriver/src/m480_epwm.c | 6 +++--- targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c index 6024d098568..49cb6d14c5f 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c @@ -126,7 +126,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 20000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect * existing frequency of other channel. @@ -145,7 +145,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect @@ -211,7 +211,7 @@ uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ u32CNR -= 1U; EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR); - EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1U) / 100U); + EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1U) / 10000U); (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~(((1UL << EPWM_WGCTL0_PRDPCTL0_Pos) | (1UL << EPWM_WGCTL0_ZPCTL0_Pos)) << (u32ChannelNum << 1U))) | \ ((uint32_t)EPWM_OUTPUT_HIGH << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL0_ZPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c index b71731aeb74..d9dad3e1b45 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c @@ -198,10 +198,10 @@ static void pwmout_config(pwmout_t *obj, int start) // NOTE: Support period < 1s // NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by: - // 1. Inverse duty cycle (100 - duty) + // 1. Inverse duty cycle (10000 - duty) // 2. Inverse PWM output polarity // This trick is here to pass ARM mbed CI test. First PWM pulse error still remains. - EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - obj->pulsewidth_us * 100 / obj->period_us, obj->period_us); + EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us); pwm_base->POLCTL |= 1 << (EPWM_POLCTL_PINV0_Pos + chn); if (start) { From 045f443bb224105ca5c5ee25d9ce52627b297b27 Mon Sep 17 00:00:00 2001 From: cyliangtw Date: Thu, 4 Mar 2021 19:58:03 +0800 Subject: [PATCH 2/3] Support M251/M261/M453/NANO130/NUC472 PWM duty cycle range as 0 ~ 10000 --- .../TARGET_M251/device/StdDriver/src/m251_pwm.c | 8 ++++---- targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c | 4 ++-- .../TARGET_M261/device/StdDriver/m261_epwm.c | 6 +++--- targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c | 4 ++-- .../TARGET_M451/device/StdDriver/m451_pwm.c | 6 +++--- targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c | 2 +- .../TARGET_NANO100/device/StdDriver/nano100_pwm.c | 6 +++--- targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c | 4 ++-- .../TARGET_NUC472/device/StdDriver/nuc472_pwm.c | 6 +++--- targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c | 2 +- 10 files changed, 24 insertions(+), 24 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c index abb16e62266..ab1e2e84de0 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c @@ -138,7 +138,7 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -155,7 +155,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u3 * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @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 if (u32DutyCycle) { - if (u32DutyCycle >= 100UL) + if (u32DutyCycle >= 10000UL) PWM_SET_CMR(pwm, u32ChannelNum, u16CNR); else - PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1UL) / 100UL); + PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1UL) / 10000UL); (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1UL)); (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << ((u32ChannelNum << 1UL) + PWM_WGCTL0_PRDPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c index 4ce8c93d86c..8bf50a261b4 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M251/pwmout_api.c @@ -195,10 +195,10 @@ static void pwmout_config(pwmout_t *obj, int start) // NOTE: Support period < 1s // NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by: - // 1. Inverse duty cycle (100 - duty) + // 1. Inverse duty cycle (10000 - duty) // 2. Inverse PWM output polarity // This trick is here to pass ARM mbed CI test. First PWM pulse error still remains. - PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - obj->pulsewidth_us * 100 / obj->period_us, obj->period_us); + PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us); pwm_base->POLCTL |= 1 << (PWM_POLCTL_PINV0_Pos + chn); if (start) { diff --git a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c index 05a0fba84c5..03d46758f77 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c @@ -117,7 +117,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect * existing frequency of other channel. @@ -136,7 +136,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @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_ u32CNR = u32CNR - 1U; EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR); - EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1UL) / 100UL); + EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1UL) / 10000UL); (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~((EPWM_WGCTL0_PRDPCTL0_Msk | EPWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1))) | \ (EPWM_OUTPUT_HIGH << (u32ChannelNum << 1UL << EPWM_WGCTL0_ZPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c index 0030b39ff01..ef07b168e53 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M261/pwmout_api.c @@ -195,10 +195,10 @@ static void pwmout_config(pwmout_t *obj, int start) // NOTE: Support period < 1s // NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by: - // 1. Inverse duty cycle (100 - duty) + // 1. Inverse duty cycle (10000 - duty) // 2. Inverse PWM output polarity // This trick is here to pass ARM mbed CI test. First PWM pulse error still remains. - EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - obj->pulsewidth_us * 100 / obj->period_us, obj->period_us); + EPWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us); pwm_base->POLCTL |= 1 << (EPWM_POLCTL_PINV0_Pos + chn); if (start) { diff --git a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c index 56ca2318591..a85e8527fb6 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c @@ -97,7 +97,7 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -115,7 +115,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @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, PWM_SET_CNR(pwm, u32ChannelNum, --u16CNR); if(u32DutyCycle) { - PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 100 - 1); + PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 10000 - 1); (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2)); (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_PRDPCTL0_Pos)); (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2)); diff --git a/targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c index e3089d98749..74323159d4c 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c @@ -195,7 +195,7 @@ static void pwmout_config(pwmout_t *obj) uint32_t chn = NU_MODSUBINDEX(obj->pwm); // NOTE: Support period < 1s //PWM_ConfigOutputChannel(pwm_base, chn, 1000 * 1000 / obj->period_us, obj->pulsewidth_us * 100 / obj->period_us); - PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 100 / obj->period_us, obj->period_us); + PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us); } const PinMap *pwmout_pinmap() diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c index 7fd269b1cbd..156117afd42 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c @@ -28,7 +28,7 @@ * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -136,7 +136,7 @@ uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm, *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk; else { *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk; - *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 100 - 1) << PWM_DUTY_CM_Pos); + *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 10000 - 1) << PWM_DUTY_CM_Pos); } *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CN_Msk; *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= u16CNR; diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c index c6ad54e1f9f..8ba1f40dd43 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/pwmout_api.c @@ -198,10 +198,10 @@ static void pwmout_config(pwmout_t *obj) uint32_t chn = NU_MODSUBINDEX(obj->pwm); // NOTE: Support period < 1s // NOTE: ARM mbed CI test fails due to first PWM pulse error. Workaround by: - // 1. Inverse duty cycle (100 - duty) + // 1. Inverse duty cycle (10000 - duty) // 2. Inverse PWM output polarity // This trick is here to pass ARM mbed CI test. First PWM pulse error still remains. - PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 100 - (obj->pulsewidth_us * 100 / obj->period_us), obj->period_us); + PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, 10000 - (obj->pulsewidth_us * 10000 / obj->period_us), obj->period_us); } const PinMap *pwmout_pinmap() diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c index 33757730a4f..4f21b578155 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c @@ -28,7 +28,7 @@ * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @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, if(u32DutyCycle == 0) pwm->CMPDAT[u32ChannelNum] = 0; else - pwm->CMPDAT[u32ChannelNum] = u32DutyCycle * (u16CNR + 1) / 100 - 1; + pwm->CMPDAT[u32ChannelNum] = u32DutyCycle * (u16CNR + 1) / 10000 - 1; pwm->PERIOD[u32ChannelNum] = u16CNR; return(i); diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c b/targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c index c1891bfc1f2..aa81799abea 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/pwmout_api.c @@ -219,7 +219,7 @@ static void pwmout_config(pwmout_t *obj) uint32_t chn = NU_MODSUBINDEX(obj->pwm); // NOTE: Support period < 1s //PWM_ConfigOutputChannel(pwm_base, chn, 1000 * 1000 / obj->period_us, obj->pulsewidth_us * 100 / obj->period_us); - PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 100 / obj->period_us, obj->period_us); + PWM_ConfigOutputChannel2(pwm_base, chn, 1000 * 1000, obj->pulsewidth_us * 10000 / obj->period_us, obj->period_us); } const PinMap *pwmout_pinmap() From 5b693ff3b35b3f59ca76079f69ce2376fc32c5a1 Mon Sep 17 00:00:00 2001 From: cyliangtw Date: Wed, 10 Mar 2021 11:53:55 +0800 Subject: [PATCH 3/3] To keep proprietary BSP DutyCycle definition and rename HighDutyCycle in extend API --- .../TARGET_M251/device/StdDriver/inc/m251_pwm.h | 2 +- .../TARGET_M251/device/StdDriver/src/m251_pwm.c | 14 +++++++------- .../TARGET_M261/device/StdDriver/m261_epwm.c | 10 +++++----- .../TARGET_M261/device/StdDriver/m261_epwm.h | 2 +- .../TARGET_M451/device/StdDriver/m451_pwm.c | 12 ++++++------ .../TARGET_M451/device/StdDriver/m451_pwm.h | 2 +- .../TARGET_M480/device/StdDriver/inc/m480_epwm.h | 2 +- .../TARGET_M480/device/StdDriver/src/m480_epwm.c | 10 +++++----- .../TARGET_NANO100/device/StdDriver/nano100_pwm.c | 12 ++++++------ .../TARGET_NANO100/device/StdDriver/nano100_pwm.h | 2 +- .../TARGET_NUC472/device/StdDriver/nuc472_pwm.c | 12 ++++++------ .../TARGET_NUC472/device/StdDriver/nuc472_pwm.h | 2 +- 12 files changed, 41 insertions(+), 41 deletions(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/inc/m251_pwm.h b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/inc/m251_pwm.h index e5246ebdd3b..b0fcccc1d90 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/inc/m251_pwm.h +++ b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/inc/m251_pwm.h @@ -475,7 +475,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u3 uint32_t PWM_ConfigOutputChannel2(PWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask); void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask); diff --git a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c index ab1e2e84de0..e5a33e98818 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M251/device/StdDriver/src/m251_pwm.c @@ -138,14 +138,14 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. */ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -155,13 +155,13 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u3 * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. */ -uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle, uint32_t u32Frequency2) +uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t u32Src; uint32_t u32PWMClockSrc; @@ -219,12 +219,12 @@ uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u u16CNR -= 1UL; PWM_SET_CNR(pwm, u32ChannelNum, u16CNR); - if (u32DutyCycle) + if (u32HighDutyCycle) { - if (u32DutyCycle >= 10000UL) + if (u32HighDutyCycle >= 10000UL) PWM_SET_CMR(pwm, u32ChannelNum, u16CNR); else - PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1UL) / 10000UL); + PWM_SET_CMR(pwm, u32ChannelNum, u32HighDutyCycle * (u16CNR + 1UL) / 10000UL); (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1UL)); (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << ((u32ChannelNum << 1UL) + PWM_WGCTL0_PRDPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c index 03d46758f77..0816a0a5b7e 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.c @@ -117,7 +117,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect * existing frequency of other channel. @@ -126,7 +126,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ */ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return EPWM_ConfigOutputChannel2(epwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return EPWM_ConfigOutputChannel2(epwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -136,7 +136,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect @@ -144,7 +144,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * @note This function is used for initial stage. * To change duty cycle later, it should get the configured period value and calculate the new comparator value. */ -uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle, uint32_t u32Frequency2) +uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t u32PWMClockSrc; uint32_t i; @@ -183,7 +183,7 @@ uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ u32CNR = u32CNR - 1U; EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR); - EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1UL) / 10000UL); + EPWM_SET_CMR(epwm, u32ChannelNum, u32HighDutyCycle * (u32CNR + 1UL) / 10000UL); (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~((EPWM_WGCTL0_PRDPCTL0_Msk | EPWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum << 1))) | \ (EPWM_OUTPUT_HIGH << (u32ChannelNum << 1UL << EPWM_WGCTL0_ZPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.h b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.h index 6ebcf27e780..eba8e5530c2 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.h +++ b/targets/TARGET_NUVOTON/TARGET_M261/device/StdDriver/m261_epwm.h @@ -566,7 +566,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); void EPWM_Start(EPWM_T *epwm, uint32_t u32ChannelMask); void EPWM_Stop(EPWM_T *epwm, uint32_t u32ChannelMask); diff --git a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c index a85e8527fb6..c250fa7cc56 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.c @@ -97,7 +97,7 @@ uint32_t PWM_ConfigCaptureChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u * - PWM1 : PWM Group 1 * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -107,7 +107,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -115,7 +115,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect @@ -124,7 +124,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t u32Src; @@ -176,9 +176,9 @@ uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, (pwm)->CTL1 &= ~(PWM_CTL1_CNTMODE0_Msk << u32ChannelNum); PWM_SET_CNR(pwm, u32ChannelNum, --u16CNR); - if(u32DutyCycle) + if(u32HighDutyCycle) { - PWM_SET_CMR(pwm, u32ChannelNum, u32DutyCycle * (u16CNR + 1) / 10000 - 1); + PWM_SET_CMR(pwm, u32ChannelNum, u32HighDutyCycle * (u16CNR + 1) / 10000 - 1); (pwm)->WGCTL0 &= ~((PWM_WGCTL0_PRDPCTL0_Msk | PWM_WGCTL0_ZPCTL0_Msk) << (u32ChannelNum * 2)); (pwm)->WGCTL0 |= (PWM_OUTPUT_LOW << (u32ChannelNum * 2 + PWM_WGCTL0_PRDPCTL0_Pos)); (pwm)->WGCTL1 &= ~((PWM_WGCTL1_CMPDCTL0_Msk | PWM_WGCTL1_CMPUCTL0_Msk) << (u32ChannelNum * 2)); diff --git a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.h b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.h index 916131622c0..3c3629a8e79 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.h +++ b/targets/TARGET_NUVOTON/TARGET_M451/device/StdDriver/m451_pwm.h @@ -476,7 +476,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u3 uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); void PWM_Start(PWM_T *pwm, uint32_t u32ChannelMask); void PWM_Stop(PWM_T *pwm, uint32_t u32ChannelMask); diff --git a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/inc/m480_epwm.h b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/inc/m480_epwm.h index 930e4e19c4a..e46b2e5f822 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/inc/m480_epwm.h +++ b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/inc/m480_epwm.h @@ -541,7 +541,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); void EPWM_Start(EPWM_T *epwm, uint32_t u32ChannelMask); void EPWM_Stop(EPWM_T *epwm, uint32_t u32ChannelMask); diff --git a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c index 49cb6d14c5f..d55979fd93a 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/device/StdDriver/src/m480_epwm.c @@ -126,7 +126,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 20000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect * existing frequency of other channel. @@ -135,7 +135,7 @@ uint32_t EPWM_ConfigCaptureChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ */ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return EPWM_ConfigOutputChannel2(epwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return EPWM_ConfigOutputChannel2(epwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -145,7 +145,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * - EPWM1 : EPWM Group 1 * @param[in] u32ChannelNum EPWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), shares a prescaler. Call this API to configure EPWM frequency may affect @@ -153,7 +153,7 @@ uint32_t EPWM_ConfigOutputChannel(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t * @note This function is used for initial stage. * To change duty cycle later, it should get the configured period value and calculate the new comparator value. */ -uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32DutyCycle, uint32_t u32Frequency2) +uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_t u32Frequency, uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t u32Src; uint32_t u32EPWMClockSrc; @@ -211,7 +211,7 @@ uint32_t EPWM_ConfigOutputChannel2(EPWM_T *epwm, uint32_t u32ChannelNum, uint32_ u32CNR -= 1U; EPWM_SET_CNR(epwm, u32ChannelNum, u32CNR); - EPWM_SET_CMR(epwm, u32ChannelNum, u32DutyCycle * (u32CNR + 1U) / 10000U); + EPWM_SET_CMR(epwm, u32ChannelNum, u32HighDutyCycle * (u32CNR + 1U) / 10000U); (epwm)->WGCTL0 = ((epwm)->WGCTL0 & ~(((1UL << EPWM_WGCTL0_PRDPCTL0_Pos) | (1UL << EPWM_WGCTL0_ZPCTL0_Pos)) << (u32ChannelNum << 1U))) | \ ((uint32_t)EPWM_OUTPUT_HIGH << ((u32ChannelNum << 1U) + (uint32_t)EPWM_WGCTL0_ZPCTL0_Pos)); diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c index 156117afd42..87597d898dd 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.c @@ -28,7 +28,7 @@ * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -38,7 +38,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -54,7 +54,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t i; @@ -132,11 +132,11 @@ uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm, pwm->CLKSEL = (pwm->CLKSEL & ~(PWM_CLKSEL_CLKSEL0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); pwm->CTL |= (PWM_CTL_CH0MOD_Msk << (u32ChannelNum * 8)); while((pwm->INTSTS & (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum)) == (PWM_INTSTS_DUTY0SYNC_Msk << u32ChannelNum)); - if(u32DutyCycle == 0) + if(u32HighDutyCycle == 0) *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk; else { *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CM_Msk; - *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32DutyCycle * (u16CNR + 1) / 10000 - 1) << PWM_DUTY_CM_Pos); + *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= ((u32HighDutyCycle * (u16CNR + 1) / 10000 - 1) << PWM_DUTY_CM_Pos); } *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) &= ~PWM_DUTY_CN_Msk; *(__IO uint32_t *) (&pwm->DUTY0 + 3 * u32ChannelNum) |= u16CNR; diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.h b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.h index fd460835177..f61a5e89fc0 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.h +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/device/StdDriver/nano100_pwm.h @@ -168,7 +168,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); uint32_t PWM_ConfigCaptureChannel (PWM_T *pwm, uint32_t u32ChannelNum, diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c index 4f21b578155..a4b49d777d4 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.c @@ -28,7 +28,7 @@ * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 100. 10 means 10%, 20 means 20%... * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect * existing frequency of other channel. @@ -38,7 +38,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t u32Frequency, uint32_t u32DutyCycle) { - return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle, 1); + return PWM_ConfigOutputChannel2(pwm, u32ChannelNum, u32Frequency, u32DutyCycle*100, 1); } /** @@ -46,7 +46,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, * @param[in] pwm The base address of PWM module * @param[in] u32ChannelNum PWM channel number. Valid values are between 0~5 * @param[in] u32Frequency Target generator frequency = u32Frequency / u32Frequency2 - * @param[in] u32DutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... + * @param[in] u32HighDutyCycle Target generator duty cycle percentage. Valid range are between 0 ~ 10000. 1000 means 10%, 2000 means 20%... * @param[in] u32Frequency2 Target generator frequency = u32Frequency / u32Frequency2 * @return Nearest frequency clock in nano second * @note Since every two channels, (0 & 1), (2 & 3), (4 & 5), shares a prescaler. Call this API to configure PWM frequency may affect @@ -55,7 +55,7 @@ uint32_t PWM_ConfigOutputChannel (PWM_T *pwm, uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2) { uint32_t i; @@ -182,10 +182,10 @@ uint32_t PWM_ConfigOutputChannel2 (PWM_T *pwm, pwm->CLKPSC = (pwm->CLKPSC & ~(PWM_CLKPSC_CLKPSC01_Msk << ((u32ChannelNum >> 1) * 8))) | (u8Prescale << ((u32ChannelNum >> 1) * 8)); pwm->CLKDIV = (pwm->CLKDIV & ~(PWM_CLKDIV_CLKDIV0_Msk << (4 * u32ChannelNum))) | (u8Divider << (4 * u32ChannelNum)); pwm->CTL |= 1 << (PWM_CTL_CNTMODE_Pos + u32ChannelNum); - if(u32DutyCycle == 0) + if(u32HighDutyCycle == 0) pwm->CMPDAT[u32ChannelNum] = 0; else - pwm->CMPDAT[u32ChannelNum] = u32DutyCycle * (u16CNR + 1) / 10000 - 1; + pwm->CMPDAT[u32ChannelNum] = u32HighDutyCycle * (u16CNR + 1) / 10000 - 1; pwm->PERIOD[u32ChannelNum] = u16CNR; return(i); diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.h b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.h index d9386a10093..2585a5db9c6 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.h +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/device/StdDriver/nuc472_pwm.h @@ -243,7 +243,7 @@ uint32_t PWM_ConfigOutputChannel(PWM_T *pwm, uint32_t PWM_ConfigOutputChannel2(PWM_T *pwm, uint32_t u32ChannelNum, uint32_t u32Frequency, - uint32_t u32DutyCycle, + uint32_t u32HighDutyCycle, uint32_t u32Frequency2); uint32_t PWM_ConfigCaptureChannel (PWM_T *pwm, uint32_t u32ChannelNum,