FastPWM clone
Diff: Device/FastPWM_STM_TIM.cpp
- Revision:
- 13:cdefd9d75b64
- Child:
- 17:8378bc456f0d
diff -r 4600daab8a83 -r cdefd9d75b64 Device/FastPWM_STM_TIM.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Device/FastPWM_STM_TIM.cpp Sun Jul 20 19:49:43 2014 +0000 @@ -0,0 +1,42 @@ +//This should (hopefully) work on all STM targets which use TIM timers for PWM + +#ifdef TARGET_STM + +#include "FastPWM.h" + +#define PWM_CHANNEL (**(__IO uint32_t**)fast_obj) +#define PWM_TIMER ((TIM_TypeDef*)_pwm.pwm) + +extern __IO uint32_t* getChannel(TIM_TypeDef* pwm, PinName pin); + +void FastPWM::initFastPWM( void ) { + fast_obj = new (__IO uint32_t*); + *(__IO uint32_t**)fast_obj = getChannel(PWM_TIMER, _pwm.pin); + bits = 16; +} + +void FastPWM::pulsewidth_ticks( uint32_t ticks ) { + PWM_CHANNEL = ticks; +} + +void FastPWM::period_ticks( uint32_t ticks ) { + PWM_TIMER->ARR = ticks - 1; +} + +uint32_t FastPWM::getPeriod( void ) { + return PWM_TIMER->ARR + 1; +} + +uint32_t FastPWM::setPrescaler(uint32_t reqScale) { + if (reqScale == 0) + //Return prescaler + return PWM_TIMER->PSC + 1; + if (reqScale > (uint32_t)(1<<16)) + reqScale = 1<<16; + //Else set prescaler, we have to substract one from reqScale since a 0 in PCVAL is prescaler of 1 + PWM_TIMER->PSC = reqScale - 1; + + return reqScale; +} + +#endif \ No newline at end of file