工具与软件:
您好!
在 TM4C123G 上、我的目标是使用计时器中断触发 ADC 并采用 UDMA 来存储从6通道 ADC 读取的数据。 但是、在我所做的配置下、我只能看到 uDMA 目标缓冲区中第一个通道的值。
我知道、属于 ADC 0的 FIFO 按照"简单循环缓冲器"的原理工作、并且我可以使用状态寄存器看到检索到的数据的起点和终点。 然而、我是否需要在 uDMA-ADC 设置中执行任何其他配置来同步这些起点和终点? 或者 FIFO 中的数据应该在突发模式中同步传输到 UDMA?
我是根据"adc_udma_pingpong"示例代码构建的、并在下面分享了一些重要部分:
MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_ADC0);
MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_UDMA);
ROM_SysCtlPeripheralEnable (SYSCTL_PERIPH_TIMER0);
MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_Timer1);
MAP_SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOE);
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_0);//AIN7
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_1);//AIN6
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_2);//AIN5
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_4);//AIN10
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4);//AIN9
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//AIN0
// ConfigureUART();
uDMAEnable();
IntEnable (uDMA_channel_ADC0);
uDMAControlBaseSet (pui8ControlTable);
ROM_IntEnable (INT_UDMA);
uDMAChannelAttributeDisable (UDMA_CHANNEL_ADC0、
uDMA_ATTR_ALTSELECT | uDMA_ATTR_HIGH_PRIORITY |
uDMA_ATTR_REQMASK);
uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE_16 |
UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_16 |
UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1);
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、
udma_mode_pingpong、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
&pui16ADCBuffer1、ADC_SAMPLE_BUF_SIZE);
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、
udma_mode_pingpong、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
&pui16ADCBuffer2、ADC_SAMPLE_BUF_SIZE);
uDMAChannelAttributeEnable (UDMA_CHANNEL_ADC0、UDMA_ATTR_USEBURST);
uDMAChannelEnable (UDMA_CHANNEL_ADC0);
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_HALF、1);
SysCtlDelay (10);
IntDisable (INT_ADC0SS0);
ADCIntDisable (ADC0_BASE、0);
ADCHardwareOversampleConfigure (ADC0_BASE、4);
ADCSequenceDisable (ADC0_BASE、0);
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH7);//Sira onemli
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH6);
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH5);//IE ve end sadece Sonda
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH10);
ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH9);
ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH0 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceEnable (ADC0_BASE、0);
ADCIntClear (ADC0_BASE、0);
ADCSequenceDMAEnable (ADC0_BASE、0);
ADCIntEnable (ADC0_BASE、0);
IntEnable (INT_ADC0SS0);
ROM_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICE)
TimerConfigure (Timer1_BASE、TIMER_CFG_SPLIT_PAIR |TIMER_CFG_B_PERIODICENT);
ROM_TimerLoadSet (TIMER0_BASE、TIMER_A、ROM_SysCtlClockGet ()/ 100000);//10us
TimerLoadSet (Timer1_base、Timer_B、ROM_SysCtlClockGet ()/ 10000);
TimerControlTrigger (Timer1_base、timer_B、true);
IntMasterEnable();
ROM_IntEnable (INT_TIMER0A);
ROM_TimerIntEnable (TIMER0_BASE、TIMER_TIMA_TIMEOUT)
ROM_TimerEnable (TIMER0_BASE、TIMER_A)
TimerEnable (Timer1_base、Timer_B);
(包括详细的代码片段、可以将其添加到上面的文本中。)
我执行了如上所述的初始配置。 我按如下方式配置了 ADC 序列0中断:
void ADCSeq0Handler (void)
{
ADCIntClear (ADC0_BASE、0);
如果((uDMAChannelModeGet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT)= UDMA_MODE_STOP)&&
(pui32BufferStatus[0]=>=填充)){
pu32BufferStatus[0]=已满;
pui32BufferStatus[1]=填充;
}
否则为((uDMAChannelModeGet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT)= UDMA_MODE_STOP)&&
(pui32BufferStatus[1]=填充)){
pui32BufferStatus[0]=填充;
pu32BufferStatus[1]=已满;
}
if (pui32BufferStatus[0]=>= Full){
pu32BufferStatus[0]=空;
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、
udma_mode_pingpong、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
&pui16ADCBuffer1、ADC_SAMPLE_BUF_SIZE);
uDMAChannelEnable (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT);
}
否则、if (pui32BufferStatus[1]== full){
pu32BufferStatus[1]=空;
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、
udma_mode_pingpong、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
&pui16ADCBuffer2、ADC_SAMPLE_BUF_SIZE);
uDMAChannelEnable (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT);
}
}
如果此流程中有任何错误或缺失器件、我将非常感谢您提供建议和帮助。
谢谢!
Yusuf EKER
