Skip to content

Commit 190c6dd

Browse files
FelixWang47831jhedberg
authored andcommitted
drivers: pwm: Fix qtmr set cycles bug.
The mcux_qtmr_pwm_set_cycles can not set 100% and 0% duty cycle PWM wave. Set output compare setting based on pulse_cycles and period_cycles: 1. If pulse_cycles is 0, generate 0% duty cycle wave. 2. If pulse_cycles equals period_cycles but not 0, generate 100% duty cycle wave. 3. Otherwise toggle output when compare value matched. Signed-off-by: Felix Wang <[email protected]>
1 parent 8af0f03 commit 190c6dd

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

drivers/pwm/pwm_mcux_qtmr.c

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ static int mcux_qtmr_pwm_set_cycles(const struct device *dev, uint32_t channel,
5858
{
5959
const struct pwm_mcux_qtmr_config *config = dev->config;
6060
struct pwm_mcux_qtmr_data *data = dev->data;
61-
uint32_t periodCount, highCount, lowCount;
61+
uint32_t highCount, lowCount;
6262
uint16_t reg;
6363

6464
if (channel >= CHANNEL_COUNT) {
@@ -67,7 +67,6 @@ static int mcux_qtmr_pwm_set_cycles(const struct device *dev, uint32_t channel,
6767
}
6868

6969
/* Counter values to generate a PWM signal */
70-
periodCount = period_cycles;
7170
highCount = pulse_cycles;
7271
lowCount = period_cycles - pulse_cycles;
7372

@@ -110,12 +109,12 @@ static int mcux_qtmr_pwm_set_cycles(const struct device *dev, uint32_t channel,
110109

111110
reg = config->base->CHANNEL[channel].CTRL;
112111
reg &= ~(uint16_t)TMR_CTRL_OUTMODE_MASK;
113-
if (highCount == periodCount) {
114-
/* Set OFLAG output on compare */
115-
reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_SetOnCompare));
116-
} else if (periodCount == 0U) {
117-
/* Clear OFLAG output on compare */
112+
if (pulse_cycles == 0U) {
113+
/* 0% duty cycle, clear OFLAG output on compare */
118114
reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_ClearOnCompare));
115+
} else if (pulse_cycles == period_cycles) {
116+
/* 100% duty cycle, set OFLAG output on compare */
117+
reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_SetOnCompare));
119118
} else {
120119
/* Toggle OFLAG output using alternating compare register */
121120
reg |= (TMR_CTRL_LENGTH_MASK | TMR_CTRL_OUTMODE(kQTMR_ToggleOnAltCompareReg));

0 commit comments

Comments
 (0)