Hi,
This is my suggestion, firstly, you use software triggering mode to start ADC sampling with interrupt mode. After software triggering is okay, then you use SCT_OUT7 to trigger ADC.
I have tried to use LPC54114 and use SCT to trigger ADC, pls refer to the code:
Because the ADC triggering source is different between 54114 and 54606, pls note it.
Hope it can help you
BR
XiangJun Rong
//PIO0_7 SCT0_OUT0(Func_2)
//PIO0_8 SCT0_OUT1(Func_2)
//PIO0_9 SCT0_OUT2(Func_2)
//PIO0_10 SCT0_OUT3(Func_2)
//use SCT0_OUT7 signal to trigger ADC
void ADC_Init_HardWareTrigger_DMA(void)
{
//power-on ADC
//SYSCON->PDRUNCFGCLR[0]=1<<10;
//enable ADC clock
SYSCON->AHBCLKCTRLSET[0]=1<<27|1<<13; //enable both IOCON and ADC0
//ADC prereset
//select ADC clock, main clock is selected as ADC clock
SYSCON->ADCCLKSEL=0x00;;
SYSCON->ADCCLKDIV=0x01;
//SYSCON->PRESETCTRLSET[0]|=0x1<<27; //set ADC0_RST
asm("nop");
asm("nop");
asm("nop");
//SYSCON->PRESETCTRLCLR[0]=0x01<<27; //set ADC0_RST
Delay_mSec(2);
ADC0->STARTUP|=0x01;
Delay_mSec(2);
ADC0->STARTUP|=0x01<<1;
//ADC pin is selected, PIO1_0/ADC0_3
IOCON->PIO[1][0]=0x00;
//set up ADC register
ADC0->CTRL=0x3F00; //12 bit resolution, synchronous mode, bypass calibration
ADC0->INSEL=0x00; //select ADC input channel
//hardware triggering mode, trigger source SCT0_OUT7, positive edge, bypass mode
ADC0->SEQ_CTRL[0]|=1<<3|2<<12|0x0C<<16|1<<30; //|1<<30;
ADC0->SEQ_CTRL[0]|=1<<31; //enable sequence A
//software trigger ADC
// ADC0->SEQ_CTRL[0]|=1<<26;
//poll ADC status reg and read ADC sample
for(;;)
{
//ADC_conversion_hardware();
//if interrupt mode is enabled, just use nop
__asm("nop");
}
}
void PWMInit(void)
{
//enable PWM module clock
SYSCON->AHBCLKCTRLSET[0]=1<<20|1<<13; //enable both IOCON and DMA
SYSCON->AHBCLKCTRLSET[1]=1<<2; //enable both IOCON and ADC0
//initialize the PWM module pins
IOCON->PIO[0][7]=0x82;
IOCON->PIO[0][8]=0x82;
IOCON->PIO[0][9]=0x82;
IOCON->PIO[0][10]=0x82;
//select PWM clock source
SCT0->CONFIG |= 1; // unified timer
SCT0->SCTMATCHREL[0] = (SystemCoreClock/10)-1; // match 0 @ 10 Hz = 100 msec
SCT0->SCTMATCHREL[1] = ((SystemCoreClock/10)/4)-1; // match 0 @ 10 Hz = 100 msec
SCT0->SCTMATCHREL[2] = ((SystemCoreClock/10)/2)-1; // match 0 @ 10 Hz = 100 msec
SCT0->EVENT[0].STATE = 0xFFFFFFFF; // event0 happen in all state
SCT0->EVENT[0].CTRL = (0 << 0) | (1 << 12);
SCT0->EVENT[1].STATE = 0xFFFFFFFF; // event1 happen in all state
SCT0->EVENT[1].CTRL = (1 << 0) | (1 << 12);
SCT0->EVENT[2].STATE = 0xFFFFFFFF; // event2 happen in all state
SCT0->EVENT[2].CTRL = (2 << 0) | (1 << 12);
SCT0->OUT[0].SET = (1 << 1); // event 1 will set SCT_OUT0
SCT0->OUT[0].CLR = (1 << 2); // event 2 will clear SCT_OUT0
SCT0->OUT[7].SET = (1 << 1); // event 1 will set SCT_OUT0
SCT0->OUT[7].CLR = (1 << 2); // event 2 will clear SCT_OUT0
SCT0->LIMIT = 0x0001; // events 0 and 1 are used as counter limit
SCT0->CTRL &= ~(1 << 2); // unhalt by clearing bit 2 of CTRL register
}