要用
tm4c123gxl板子上的ADC来采集音频信号,并作FFT。所以在程序里用定时器来触发ADC采集。虽然可以找到ADC_TRIGGER_TIMER,不知道具体怎么配置。
所以在定时中断中使用ADC_TRIGGER_PROCESSOR来触发,并且配置ADC中断如下:
//*******************************
// ADC初始化,使用序列SS3、FIFO深度1
//*******************************
SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
ADCHardwareOversampleConfigure(ADC0_BASE, 16);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC(GPIO_PORTE_BASE, GPIO_PIN_1);
// SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //直接设置采样率,不需要定时器中断?
ADCSequenceDisable(ADC0_BASE,3); //配置前先禁止采样序列
ADCSequenceConfigure(ADC0_BASE, 3, ADC_TRIGGER_PROCESSOR, 0);
ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH2 | ADC_CTL_IE | //PE1电压采集
ADC_CTL_END);
ADCIntEnable(ADC0_BASE,3); //使能ADC中断
IntEnable(INT_ADC0SS3); //使能ADC采样序列中断
ADCSequenceEnable(ADC0_BASE, 3); //配置后启用采样序列
ADCIntClear(ADC0_BASE,3);
//*******************************
// ADC采集中断处理子程序
//*******************************
void ADC0IntHandler(void) //
{
// Clear the adc interrupt flag
ADCIntClear(ADC0_BASE, 3);
ADCSequenceDataGet(ADC0_BASE, 3, &pui32ADC0Value);
}
但是进入ADC的中断后不能读出ADC的值,就是在观察变量pui32ADC0Value时没有任何变化。
后来不用中断,直接在定时中断中读取可行
//*******************************
// 定时中断处理子程序
//*******************************
void Timer0IntHandler(void) //
{
// Clear the timer interrupt
TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
ADCProcessorTrigger(ADC0_BASE, 3);
while(!ADCIntStatus(ADC0_BASE, 3, false))
{
}
ADCIntClear(ADC0_BASE, 3);
ADCSequenceDataGet(ADC0_BASE, 3, &pui32ADC0Value);
}
问题1:
while(!ADCIntStatus(ADC0_BASE, 3, false))
书上说这个语句是等待ADC转换完成,不是转换完成才进的ADC中断吗?
问题2:
片上ADC采集速率最大是1MSPS,但是如果不用语句:
SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); //直接设置采样率,不需要定时器中断?
进行配置的话,是有个默认采样速率吗?
此帖出自
小平头技术问答
我在定时器中断中触发ADC采样的。关键是进入ADC中断的时候是采样结束,可以读取值了吗?
采样结束就进入中断然后读取值然后再使能下一次!
一周热门 更多>