From ac648170a42db3e61521953265f3d4c90f96703e Mon Sep 17 00:00:00 2001 From: talorion Date: Tue, 25 Aug 2020 23:40:07 +0200 Subject: [PATCH] pwmout - KL27Z - add read methods for period and pulsewidth --- .../TARGET_KL27Z/pwmout_api.c | 41 ++++++++++++++----- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/pwmout_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/pwmout_api.c index 110d40a5d1..a5c4193b9f 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/pwmout_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL27Z/pwmout_api.c @@ -27,7 +27,7 @@ static float pwm_clock_mhz; /* Array of TPM peripheral base address. */ static TPM_Type *const tpm_addrs[] = TPM_BASE_PTRS; -void pwmout_init(pwmout_t* obj, PinName pin) +void pwmout_init(pwmout_t *obj, PinName pin) { PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM); MBED_ASSERT(pwm != (PWMName)NC); @@ -72,12 +72,12 @@ void pwmout_init(pwmout_t* obj, PinName pin) pinmap_pinout(pin, PinMap_PWM); } -void pwmout_free(pwmout_t* obj) +void pwmout_free(pwmout_t *obj) { TPM_Deinit(tpm_addrs[obj->pwm_name >> TPM_SHIFT]); } -void pwmout_write(pwmout_t* obj, float value) +void pwmout_write(pwmout_t *obj, float value) { if (value < 0.0f) { value = 0.0f; @@ -93,30 +93,31 @@ void pwmout_write(pwmout_t* obj, float value) base->CNT = 0; } -float pwmout_read(pwmout_t* obj) +float pwmout_read(pwmout_t *obj) { TPM_Type *base = tpm_addrs[obj->pwm_name >> TPM_SHIFT]; uint16_t count = (base->CONTROLS[obj->pwm_name & 0xF].CnV) & TPM_CnV_VAL_MASK; uint16_t mod = base->MOD & TPM_MOD_MOD_MASK; - if (mod == 0) + if (mod == 0) { return 0.0; + } float v = (float)(count) / (float)(mod); return (v > 1.0f) ? (1.0f) : (v); } -void pwmout_period(pwmout_t* obj, float seconds) +void pwmout_period(pwmout_t *obj, float seconds) { pwmout_period_us(obj, seconds * 1000000.0f); } -void pwmout_period_ms(pwmout_t* obj, int ms) +void pwmout_period_ms(pwmout_t *obj, int ms) { pwmout_period_us(obj, ms * 1000); } // Set the PWM period, keeping the duty cycle the same. -void pwmout_period_us(pwmout_t* obj, int us) +void pwmout_period_us(pwmout_t *obj, int us) { TPM_Type *base = tpm_addrs[obj->pwm_name >> TPM_SHIFT]; float dc = pwmout_read(obj); @@ -126,17 +127,26 @@ void pwmout_period_us(pwmout_t* obj, int us) pwmout_write(obj, dc); } -void pwmout_pulsewidth(pwmout_t* obj, float seconds) +int pwmout_read_period_us(pwmout_t *obj) +{ + uint32_t tmp = 0; + if (pwm_clock_mhz > 0) { + tmp = ((base->MOD) + 1) / pwm_clock_mhz; + } + return tmp; +} + +void pwmout_pulsewidth(pwmout_t *obj, float seconds) { pwmout_pulsewidth_us(obj, seconds * 1000000.0f); } -void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) +void pwmout_pulsewidth_ms(pwmout_t *obj, int ms) { pwmout_pulsewidth_us(obj, ms * 1000); } -void pwmout_pulsewidth_us(pwmout_t* obj, int us) +void pwmout_pulsewidth_us(pwmout_t *obj, int us) { TPM_Type *base = tpm_addrs[obj->pwm_name >> TPM_SHIFT]; uint32_t value = (uint32_t)(pwm_clock_mhz * (float)us); @@ -145,6 +155,15 @@ void pwmout_pulsewidth_us(pwmout_t* obj, int us) base->CONTROLS[obj->pwm_name & 0xF].CnV = value; } +int pwmout_read_pulsewidth_us(pwmout_t *obj) +{ + uint32_t tmp = 0; + if (pwm_clock_mhz > 0) { + tmp = (base->CONTROLS[obj->pwm_name & 0xF].CnV) / pwm_clock_mhz; + } + return tmp; +} + const PinMap *pwmout_pinmap() { return PinMap_PWM;