Norimasa Okamoto
/
lpc800-max-RGB
LPC800-MAX RGB demo using SCT and MRT
Embed:
(wiki syntax)
Show/hide line numbers
SCT_PWM.cpp
00001 #include "SCT_PWM.h" 00002 00003 #define BIT_ON(A) (1<<A) 00004 00005 // http://www.lpcware.com/content/nxpfile/lpc80-sct-cookbook-and-tutorial-code-examples 00006 00007 SCT_PWM::SCT_PWM(int pin, int channel) : ch(channel) 00008 { 00009 static bool insted = false; 00010 00011 if (!insted) { 00012 inst(); 00013 insted = true; 00014 } 00015 swm(pin); 00016 00017 LPC_SCT->EVENT[ch + 1].STATE = LPC_SCT->EVENT[0].STATE; 00018 LPC_SCT->EVENT[ch + 1].CTRL = LPC_SCT->EVENT[0].CTRL | (ch+1)<<0; // match 1...5 00019 00020 LPC_SCT->OUT[ch].SET = BIT_ON(0); // event 0 00021 LPC_SCT->OUT[ch].CLR = BIT_ON(ch+1); // event 1...5 00022 } 00023 00024 void SCT_PWM::inst() 00025 { 00026 LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); // enable SCT 00027 LPC_SYSCON->PRESETCTRL |= (1<<8); // reset SCT 00028 00029 LPC_SCT->EVENT[0].STATE = BIT_ON(0); // state 0 00030 LPC_SCT->EVENT[0].CTRL = (1<<12) | (1<<14); 00031 00032 LPC_SCT->LIMIT_L |= BIT_ON(0); // event 0 00033 00034 LPC_SCT->CONFIG |= (1<<0) | (1<<17); // unify, auto limit 00035 LPC_SCT->CTRL_L |= (SystemCoreClock/1000000-1)<<5; // set prescaler, SCT clock = 1 MHz 00036 00037 LPC_SCT->CTRL_L &= ~(1<<2); // unhalt it by clearing bit 2 of CTRL reg 00038 } 00039 00040 void SCT_PWM::swm(int pin) 00041 { 00042 switch(ch) { 00043 case 0: // CTOUT_0 00044 LPC_SWM->PINASSIGN6 = (LPC_SWM->PINASSIGN6 & 0x00ffffff) | pin<<24; 00045 break; 00046 case 1: // CTOUT_1 00047 LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xffffff00) | pin<<0; 00048 break; 00049 case 2: // CTOUT_2 00050 LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xffff00ff) | pin<<8; 00051 break; 00052 case 3: // CTOUT_3 00053 LPC_SWM->PINASSIGN7 = (LPC_SWM->PINASSIGN7 & 0xff00ffff) | pin<<16; 00054 break; 00055 } 00056 } 00057 00058 void SCT_PWM::period(float seconds) 00059 { 00060 period_us(seconds * 1000000); 00061 } 00062 00063 void SCT_PWM::period_ms(int ms) 00064 { 00065 period_us(ms * 1000); 00066 } 00067 00068 void SCT_PWM::period_us(int us) 00069 { 00070 LPC_SCT->MATCHREL[0].U = us - 1; 00071 } 00072 00073 void SCT_PWM::pulsewidth(float seconds) 00074 { 00075 pulsewidth_us(seconds * 1000000); 00076 } 00077 00078 void SCT_PWM::pulsewidth_ms(int ms) 00079 { 00080 pulsewidth_us(ms * 1000); 00081 } 00082 00083 void SCT_PWM::pulsewidth_us(int us) 00084 { 00085 LPC_SCT->MATCHREL[ch + 1].U = us; 00086 } 00087 00088 void SCT_PWM::write(float value) 00089 { 00090 LPC_SCT->MATCHREL[ch + 1].U = value * LPC_SCT->MATCHREL[0].U; 00091 } 00092 00093 float SCT_PWM::read() 00094 { 00095 if (LPC_SCT->MATCHREL[0].U == 0) { 00096 return 0.0; 00097 } 00098 return (float)LPC_SCT->MATCHREL[ch + 1].U / LPC_SCT->MATCHREL[0].U; 00099 }
Generated on Fri Jul 15 2022 08:12:42 by 1.7.2