在SCT中断服务程序中, 判断是否是由SCT_GP5产生的event所触发的中断, 如果是,读取capture register, toggleLED pin.
int main(void)
{
/* Init output LED GPIO. */
//GPIO_PortInit(GPIO, BOARD_LED_PORT);
/* Board pin init */
//BOARD_InitPins();
LEDInit();
PwmInit();
while (1)
{
}
}
void LEDInit()
{
//set IOCON bit
SYSCON->AHBCLKCTRLX[0]|=1<<13;
IOCON->PIO[1][4]=0x100;
//set GPIO1 clock
SYSCON->AHBCLKCTRLX[0]|=1<<15;
GPIO->DIR[1]|=1<<4;
GPIO->NOT[1]=1<<4;
GPIO->NOT[1]=1<<4;
GPIO->NOT[1]=1<<4;
GPIO->NOT[1]=1<<4;
}
void PwmInit(void)
{
//set PIO0_5 as SCT trigger signal
//set PIO0_5 as P0_5/FC4_RXD_SDA_MOSI/CT3MAT0/SCT_GPI5(Func4)
//enable IOCON bit
SYSCON->AHBCLKCTRLX[0]|=1<<13;
IOCON->PIO[0][5]=0x104;
//enable gated clock for MUX
//P0_5(SCT_GPI5) is routed to SCT0_INPUT3 signal
SYSCON->AHBCLKCTRLX[0]|=1<<11;
INPUTMUX->SCT0_INMUX[3]=5;
//enable SCT0 gated clock
SYSCON->AHBCLKCTRLX[1]|=1<<2;
SCT0->CTRL |= (SystemCoreClock/1000000-1) << 5; // set prescaler,SCTimer/PWM clock = 1 MHz
SCT0->CONFIG|=1<<0|1<<17;
SCT0->REGMODE = (1 <<2); // register pair 1 and 2 are capture
SCT0->MATCH[0]= 12000; // match 0 @ 12000/1MHz = 12 msec(timeout)
SCT0->MATCHREL[0] = 12000;
SCT0->EV[0].STATE = 0xFFFF; // event 0 only happens in state 0
SCT0->EV[0].CTRL = (0 <<0) | //MATCHSEL[3:0] = related to match 0
(1 << 12) | // COMBMODE[13:12] = uses matchcondition only
(1 << 14) | // STATELD [14] = STATEV is loadedinto state
(0 << 15); // STATEV [15] = new state is 0
SCT0->EV[1].STATE = 0xFFFF; // event 1 only happens in state 0
SCT0->EV[1].CTRL = (0 <<5) |
(3 << 6) | // IOSEL [9:6] = SCT_IN3
(2 << 10) | // IOCOND [11:10] = falling edge
(2 << 12) | // COMBMODE[13:12] = uses IOcondition only
(1 << 14) | // STATELD [14] = STATEV is loadedinto state
(0 << 15); // STATEV[ 15] = new state is 0
#if 0
SCT0->EV[2].STATE= 0xFFFF; // event 2 only happens in state 0
SCT0->EV[2].CTRL= (0 << 5) |
(6<< 6) | // IOSEL [9:6] = SCT_IN6
(1<< 10) | // IOCOND [11:10] = rising edge
(2<< 12) | // COMBMODE[13:12] = uses IO condition only
(1<< 14) | // STATELD [14] = STATEV is loaded into state
(0<< 15); // STATEV [15] = new state is 0
#endif
SCT0->CAPCTRL[2] = (1 << 1); // event 1 causes capture 0 to beloaded
//SCT0->CAPCTRL[2] = (1 << 2); // event 2 causescapture 2 to be loaded
SCT0->LIMIT=0x00;
//SCT0->LIMIT = 0x0007; // events 0, 1 and 2 are usedas counter limit
SCT0->EVEN = 0x02; // events 0 and 2 generate interrupts
//NVIC_EnableIRQ(SCT_IRQn); // enable SCTimer/PWMinterrupt
//Chip_SCTPWM_Start(SCT_PWM);
//SCT0 interrupt vector is 12
NVIC->ISER[0]|=1<<12;
NVIC->ICPR[0]|=1<<12;
NVIC->IPR[12]=0x00;
//start SCT0
SCT0->CTRL&=~(1<<2);
}
uint32_t capture_Value;
void SCT0_DriverIRQHandler(void)
{
if(SCT0->EVFLAG&0x02)
{
SCT0->EVFLAG|=0x02;
//toggle LED0
capture_Value=SCT0->CAP[2];
//GPIO_PortToggle(GPIO, BOARD_LED_PORT, 1u<< BOARD_LED_PIN);
GPIO->NOT[1]=1<<4;
__asm("nop");
}
}