Skip to content

Commit ad35eaf

Browse files
authored
Merge pull request #3253 from micromint/master
Fix default polarity on LPC43XX PWM driver
2 parents 84f401b + aede0fc commit ad35eaf

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

targets/TARGET_NXP/TARGET_LPC43XX/pwmout_api.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929

3030
// configuration options
3131
#define PWM_FREQ_BASE 1000000 // Base frequency 1 MHz = 1000000
32-
#define PWM_MODE 1 // 0 = 32-bit, 1 = 16-bit low, 2 = 16-bit high
32+
#ifndef PWM_MODE
33+
#define PWM_MODE 1 // 0 = 32-bit, 1 = 16-bit low, 2 = 16-bit high
34+
#endif
3335

3436
// macros
3537
#define PWM_SETCOUNT(x) (x - 1) // set count value
@@ -163,8 +165,8 @@ static void _pwmout_dev_init() {
163165

164166
// initialize SCT outputs
165167
for (i = 0; i < CONFIG_SCT_nOU; i++) {
166-
LPC_SCT->OUT[i].SET = (1 << 0); // event 0 will set SCTOUT_xx
167-
LPC_SCT->OUT[i].CLR = 0; // set clear event when duty cycle
168+
LPC_SCT->OUT[i].SET = 0; // defer set event until pulsewidth defined
169+
LPC_SCT->OUT[i].CLR = (1 << 0); // event 0 clears PWM pin
168170
}
169171
LPC_SCT->OUTPUT = 0; // default outputs to clear
170172

@@ -252,15 +254,18 @@ void pwmout_pulsewidth_ms(pwmout_t* obj, int ms) {
252254
void pwmout_pulsewidth_us(pwmout_t* obj, int us) {
253255
// calculate number of ticks
254256
uint32_t v = pwm_clock_mhz * us;
257+
uint32_t i = obj->pwm;
255258
//MBED_ASSERT(PWM_GETCOUNT(*PWM_MR0) >= v);
256259

257260
if (v > 0) {
258261
// set new match register value and enable SCT output
259262
*PWM_MR(obj->mr) = PWM_SETCOUNT(v);
260-
LPC_SCT->OUT[obj->pwm].CLR = (1 << obj->mr); // on event will clear PWM_XX
263+
LPC_SCT->OUT[i].SET = (1 << 0); // event 0 sets PWM pin
264+
LPC_SCT->OUT[i].CLR = (1 << obj->mr); // match event clears PWM pin
261265
} else {
262-
// set match to zero and disable SCT output
266+
// set match to zero and clear SCT output
263267
*PWM_MR(obj->mr) = 0;
264-
LPC_SCT->OUT[obj->pwm].CLR = 0;
268+
LPC_SCT->OUT[i].SET = 0; // no set event if no pulsewidth defined
269+
LPC_SCT->OUT[i].CLR = (1 << 0); // event 0 clears PWM pin
265270
}
266271
}

0 commit comments

Comments
 (0)