yes

Committer:
braichi13
Date:
Sun May 08 14:39:57 2022 +0000
Revision:
0:c60399891edd
Yes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
braichi13 0:c60399891edd 1 #if defined(TARGET_LPC11UXX) || defined(TARGET_LPC11XX_11CXX)
braichi13 0:c60399891edd 2
braichi13 0:c60399891edd 3 #include "FastPWM.h"
braichi13 0:c60399891edd 4
braichi13 0:c60399891edd 5 #define PWM_MR (*(((fastpwm_struct*)fast_obj)->MR))
braichi13 0:c60399891edd 6 #define PWM_TIMER (((fastpwm_struct*)fast_obj)->timer)
braichi13 0:c60399891edd 7
braichi13 0:c60399891edd 8 typedef struct {
braichi13 0:c60399891edd 9 uint8_t timer;
braichi13 0:c60399891edd 10 uint8_t mr;
braichi13 0:c60399891edd 11 } timer_mr;
braichi13 0:c60399891edd 12
braichi13 0:c60399891edd 13 #ifdef TARGET_LPC11UXX
braichi13 0:c60399891edd 14 typedef struct {
braichi13 0:c60399891edd 15 __IO uint32_t *MR;
braichi13 0:c60399891edd 16 LPC_CTxxBx_Type *timer;
braichi13 0:c60399891edd 17 } fastpwm_struct;
braichi13 0:c60399891edd 18
braichi13 0:c60399891edd 19 static timer_mr pwm_timer_map[11] = {
braichi13 0:c60399891edd 20 {0, 0}, {0, 1}, {0, 2},
braichi13 0:c60399891edd 21 {1, 0}, {1, 1},
braichi13 0:c60399891edd 22 {2, 0}, {2, 1}, {2, 2},
braichi13 0:c60399891edd 23 {3, 0}, {3, 1}, {3, 2},
braichi13 0:c60399891edd 24 };
braichi13 0:c60399891edd 25
braichi13 0:c60399891edd 26 static LPC_CTxxBx_Type *Timers[4] = {
braichi13 0:c60399891edd 27 LPC_CT16B0, LPC_CT16B1,
braichi13 0:c60399891edd 28 LPC_CT32B0, LPC_CT32B1
braichi13 0:c60399891edd 29 };
braichi13 0:c60399891edd 30 #else //LPC11XX
braichi13 0:c60399891edd 31 typedef struct {
braichi13 0:c60399891edd 32 __IO uint32_t *MR;
braichi13 0:c60399891edd 33 LPC_TMR_TypeDef *timer;
braichi13 0:c60399891edd 34 } fastpwm_struct;
braichi13 0:c60399891edd 35
braichi13 0:c60399891edd 36 static timer_mr pwm_timer_map[5] = {
braichi13 0:c60399891edd 37 {0, 0}, /* CT16B0, MR0 */
braichi13 0:c60399891edd 38 {0, 1}, /* CT16B0, MR1 */
braichi13 0:c60399891edd 39
braichi13 0:c60399891edd 40 {1, 0}, /* CT16B1, MR0 */
braichi13 0:c60399891edd 41 {1, 1}, /* CT16B1, MR1 */
braichi13 0:c60399891edd 42
braichi13 0:c60399891edd 43 {2, 2}, /* CT32B0, MR2 */
braichi13 0:c60399891edd 44 };
braichi13 0:c60399891edd 45
braichi13 0:c60399891edd 46 static LPC_TMR_TypeDef *Timers[3] = {
braichi13 0:c60399891edd 47 LPC_TMR16B0, LPC_TMR16B1,
braichi13 0:c60399891edd 48 LPC_TMR32B0
braichi13 0:c60399891edd 49 };
braichi13 0:c60399891edd 50 #endif
braichi13 0:c60399891edd 51
braichi13 0:c60399891edd 52
braichi13 0:c60399891edd 53 void FastPWM::initFastPWM( void ) {
braichi13 0:c60399891edd 54 fast_obj = new fastpwm_struct;
braichi13 0:c60399891edd 55 timer_mr tid = pwm_timer_map[_pwm.pwm];
braichi13 0:c60399891edd 56 PWM_TIMER = Timers[tid.timer];
braichi13 0:c60399891edd 57 (((fastpwm_struct*)fast_obj)->MR) = &PWM_TIMER->MR[tid.mr];
braichi13 0:c60399891edd 58
braichi13 0:c60399891edd 59 if (tid.timer < 2)
braichi13 0:c60399891edd 60 //16-bit timer
braichi13 0:c60399891edd 61 bits = 16;
braichi13 0:c60399891edd 62 else
braichi13 0:c60399891edd 63 //32-bit timer
braichi13 0:c60399891edd 64 bits = 32;
braichi13 0:c60399891edd 65 }
braichi13 0:c60399891edd 66
braichi13 0:c60399891edd 67 void FastPWM::pulsewidth_ticks( uint32_t ticks ) {
braichi13 0:c60399891edd 68 if (ticks)
braichi13 0:c60399891edd 69 PWM_MR = PWM_TIMER->MR3 - ticks; //They inverted PWM on the 11u24
braichi13 0:c60399891edd 70 else
braichi13 0:c60399891edd 71 PWM_MR = 0xFFFFFFFF; //If MR3 = ticks 1 clock cycle wide errors appear, this prevents that (unless MR3 = max).
braichi13 0:c60399891edd 72 }
braichi13 0:c60399891edd 73
braichi13 0:c60399891edd 74 void FastPWM::period_ticks( uint32_t ticks ) {
braichi13 0:c60399891edd 75 PWM_TIMER->TCR = 0x02;
braichi13 0:c60399891edd 76 PWM_TIMER->MR3 = ticks;
braichi13 0:c60399891edd 77 PWM_TIMER->TCR = 0x01;
braichi13 0:c60399891edd 78 }
braichi13 0:c60399891edd 79
braichi13 0:c60399891edd 80 uint32_t FastPWM::getPeriod( void ) {
braichi13 0:c60399891edd 81 return PWM_TIMER->MR3;
braichi13 0:c60399891edd 82 }
braichi13 0:c60399891edd 83
braichi13 0:c60399891edd 84 uint32_t FastPWM::setPrescaler(uint32_t reqScale) {
braichi13 0:c60399891edd 85 //If 32-bit, disable auto-scaling, return 1
braichi13 0:c60399891edd 86 if (bits == 32) {
braichi13 0:c60399891edd 87 dynamicPrescaler = false;
braichi13 0:c60399891edd 88 return 1;
braichi13 0:c60399891edd 89 }
braichi13 0:c60399891edd 90
braichi13 0:c60399891edd 91 //Else 16-bit timer:
braichi13 0:c60399891edd 92 if (reqScale == 0)
braichi13 0:c60399891edd 93 //Return prescaler
braichi13 0:c60399891edd 94 return PWM_TIMER->PR + 1;
braichi13 0:c60399891edd 95 if (reqScale > (uint32_t)(1<<16))
braichi13 0:c60399891edd 96 reqScale = 1<<16;
braichi13 0:c60399891edd 97 //Else set prescaler, we have to substract one from reqScale since a 0 in PCVAL is prescaler of 1
braichi13 0:c60399891edd 98 PWM_TIMER->PR = reqScale - 1;
braichi13 0:c60399891edd 99
braichi13 0:c60399891edd 100 return reqScale;
braichi13 0:c60399891edd 101 }
braichi13 0:c60399891edd 102
braichi13 0:c60399891edd 103 #endif