Ben Katz / FastPWM

Dependents:   Quadrature_Test PID Flow measurement

Fork of FastPWM by Erik -

Device/FastPWM_KLXX.cpp

Committer:
Sissors
Date:
2014-02-28
Revision:
5:2812f0a115f7
Parent:
Device/FastPWM_KL25Z.cpp@ 4:a7b9f778c4b4
Child:
6:0f57969697b6

File content as of revision 5:2812f0a115f7:

#ifdef TARGET_KLXX

#include "FastPWM.h"

volatile uint32_t *TPM_SC;

void FastPWM::initFastPWM( void ) {
    bits = 16;
    
    //Yes this is ugly, yes I should feel bad about it
    TPM_SC = _pwm.MOD - 2;
}

void FastPWM::pulsewidth_ticks( uint32_t ticks ) {
    *(_pwm.CnV) = ticks;
    *_pwm.CNT = 0;  //Not yet sure why this is needed!
}

void FastPWM::period_ticks( uint32_t ticks ) {
    *(_pwm.MOD) = ticks;
    *_pwm.CNT = 0;
}

uint32_t FastPWM::getPeriod( void ) {
    return *(_pwm.MOD);
}

uint32_t FastPWM::setPrescaler(uint32_t reqScale) {
    const char prescalers[] = {1, 2, 4, 8, 16, 32, 64, 128};
    
    //If prescaler is 0, return current one
    if (reqScale == 0)
        return (prescalers[(*TPM_SC) & 0x07]);
    
    uint32_t retval = 0;
    char bin;
    
    for (bin = 0; bin<8; bin++) {
        retval = prescalers[bin];
        if (retval >= reqScale)
            break;
    }
    
    //Clear lower 5 bits, write new value:
    char clockbits = *TPM_SC & (3<<3);
    
    //For some reason clearing them takes some effort
    while ((*TPM_SC & 0x1F) != 0)
        *TPM_SC &= ~0x1F;
        
    
    *TPM_SC |= bin + clockbits;
    
    return retval;   
}
#endif