硬件为TM4C launchpad
主函数程序如下。
int main(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|
SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);
PWM1_init();
ADC0_init();
Timer_init();
。。。
然后
void ADC0_init(void)
{
// Enable GPIO for ADC
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_3);// Enable pin PE3 for ADC AIN0
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_2);// Enable pin PE2 for ADC AIN1
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_1);// Enable pin PE1 for ADC AIN2
GPIOPinTypeADC(GPIO_PORTD_BASE, GPIO_PIN_3);// Enable pin PD3 for ADC AIN4
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
ADCSequenceDisable(ADC0_BASE, 1);
ADCSequenceConfigure(ADC0_BASE, 1, ADC_TRIGGER_TIMER, 0);
ADCSequenceStepConfigure(ADC0_BASE, 1, 0, ADC_CTL_CH0);
ADCSequenceStepConfigure(ADC0_BASE, 1, 1, ADC_CTL_CH1);
ADCSequenceStepConfigure(ADC0_BASE, 1, 2, ADC_CTL_CH2);
ADCSequenceStepConfigure(ADC0_BASE, 1, 3, ADC_CTL_CH4| ADC_CTL_IE |ADC_CTL_END);
//ADC0_CC_R=0x00;
ADCSequenceEnable(ADC0_BASE, 1);
ADCIntClear(ADC0_BASE, 1);
ADCIntRegister(ADC0_BASE,1,&ADC0_ISR);
ADCIntEnable(ADC0_BASE,1);
}
问题是出在如果单步运行调试。程序可以正常工作。但是如果全速运行程序就不正常。(ADC无法采样,我再ADC中断里放了个翻转IO的语句来查看。)
继续查看是发现在 ADC0_init这个函数的ADCSequenceDisable(ADC0_BASE, 1)语句的时候跳入了FaultISR(void)中断里。如果我单步调试或者把系统时钟调慢(SYSCTL_SYSDIV_20)就不会发生这个问题。我印象是ADC的时钟信号可以来自于PLL的25分频或者PIOSC。我试过了ADC0_CC_R=0x00或者等于0x01都没有改变。
请问能帮忙解决下这个问题吗。?