Modify flags in PwmOut to center align pwm signals.

Dependents:   BLDC_RPM_meter

Committer:
acracan
Date:
Tue Jul 08 17:37:24 2014 +0000
Revision:
0:7200daf08b56
Update.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acracan 0:7200daf08b56 1 #ifdef TARGET_KLXX
acracan 0:7200daf08b56 2
acracan 0:7200daf08b56 3 #include "CenteredPwmOut.h"
acracan 0:7200daf08b56 4 #include "PeripheralPins.h"
acracan 0:7200daf08b56 5
acracan 0:7200daf08b56 6 CenteredPwmOut::CenteredPwmOut(PinName pin):
acracan 0:7200daf08b56 7 PwmOut(pin)
acracan 0:7200daf08b56 8 {
acracan 0:7200daf08b56 9 PWMName pwm = (PWMName)pinmap_peripheral(pin, PinMap_PWM);
acracan 0:7200daf08b56 10 if (pwm == (PWMName)NC)
acracan 0:7200daf08b56 11 return;
acracan 0:7200daf08b56 12 unsigned int tpm_n = (pwm >> TPM_SHIFT);
acracan 0:7200daf08b56 13
acracan 0:7200daf08b56 14 TPM_Type *tpm = (TPM_Type *)(TPM0_BASE + 0x1000 * tpm_n);
acracan 0:7200daf08b56 15
acracan 0:7200daf08b56 16 // Enable PWM interrupts
acracan 0:7200daf08b56 17 tpm->SC |= TPM_SC_TOIE_MASK;
acracan 0:7200daf08b56 18
acracan 0:7200daf08b56 19 unsigned int clkdiv = (tpm->SC & TPM_SC_PS_MASK) >> TPM_SC_PS_SHIFT;
acracan 0:7200daf08b56 20 bool centered = tpm->SC & TPM_SC_CPWMS_MASK;
acracan 0:7200daf08b56 21
acracan 0:7200daf08b56 22 if (centered)
acracan 0:7200daf08b56 23 return;
acracan 0:7200daf08b56 24 // Change PWM to center-aligned mode
acracan 0:7200daf08b56 25
acracan 0:7200daf08b56 26 // First, disable counter
acracan 0:7200daf08b56 27 tpm->SC &= ~TPM_SC_CMOD_MASK;
acracan 0:7200daf08b56 28 // Change the prescaler factor
acracan 0:7200daf08b56 29 //tpm->SC &= ~TPM_SC_PS_MASK;
acracan 0:7200daf08b56 30 //tpm->SC |= TPM_SC_PS(clkdiv - 1);
acracan 0:7200daf08b56 31 // Then change mode
acracan 0:7200daf08b56 32 tpm->SC |= TPM_SC_CPWMS_MASK;
acracan 0:7200daf08b56 33 // Finally, enable counter
acracan 0:7200daf08b56 34 tpm->SC |= TPM_SC_CMOD(1);
acracan 0:7200daf08b56 35 }
acracan 0:7200daf08b56 36
acracan 0:7200daf08b56 37 #endif