请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C1294XL 工具/软件:Code Composer Studio
您好!
我尝试为我的 ADC 数据构建一个循环缓冲器。 我读取8个 ADC 通道、结果应 通过 DMA 写入数组 uint32_t pui32ADC0Value[8]。 这应该持续发生。
我的问题是、使用 DMA 配置、我只能实现一个 (TransferSize 是 uDMAChannelTransferSet()调用中 的最后一个参数,包含 ADC 值。 之后 传输 DMA 停止、不再传输任何数据。 我检查了 ADC FIFO、可以观察到新值到达。 但出于某种原因、DMA 似乎不再被触发。
如何使 DMA 传输连续?
此致、
最大
以下是我的代码:
// *版权所有(c) 2015,Texas Instruments Incorporated *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明*、此条件列表和以下免责声明。 * ***二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * ***未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 // /* === empty_min.c ==== // //* XDCtools 头文件*/ #include #include #include #include #include /* BIOS 头文件*/ #include #include #include #include #include /* TI-RTOS 头文件*// #include #include //#include //#include //#include //#include //#include //#include //#include /*板头文件*/ #include "Board.h" #include #include #include #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_adc.h" #include #include #include #include #include #define TASKSTACKSIZE 512 Task_Structt 任务0Struct; 字符任务0Stack[TASKSTACKSIZE]; uint32_t start、stop、result; uint32_t pui32ADC0Value[8]; void ledToggle (UArg0){ START = Timestamp_get32(); GPIO_TOGGLE (Board_LED1); //对于(i = 0;i < 999999;i++){} //Log_Info1 ("切换 LED %d "、i); STOP = Timestamp_get32(); 结果=停止-启动; return; }/*void timerInterrupt (UArg0){ TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT); Swi_post (sw0); 返回; }*/ /* === 心跳 Fxn ==== *切换 Board_LED0。 Task_sleep 由 arg0确定、而 arg0 *是为心跳任务实例配置的。 // 空 BEBEARBEARFxn (UARg arg0、UARg arg1) { while (1){ Task_sleep (unsigned int) arg0); GPIO_TOGGLE (Board_LED0); } } /* === CONFIG_ADC ==== // void configure_adc (){ //启用外设 SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PIOSC | ADC_CLOCK_RATE_FULL、1); //设置引脚功能 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//AIN0 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);//AIN1 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_1);//AIN2 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0);//AIN3 GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_7);//AIN4 GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_6);//AIN5 GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_5);//AIN6 GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_4);//AIN7 /*GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_5);//AIN8 GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4);//AIN9 GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_4);//AIN10 GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_5);//AIN11*/ //启用采样序列3. ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、1); ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0); ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1); ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2); ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3); ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH4); ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH5); ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH6); ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH7 | ADC_CTL_END); ADCSequenceEnable (ADC0_BASE、0); ADCIntClear (ADC0_BASE、0); return; } void configure_dma(){ //ADC DMA SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); #pragma DATA_ALIGN (DMACONTROL1、1024) uint8_t DMAcontroltable[1024]; SysCtlDelay (10); uDMAEnable(); uDMAControlBaseSet (DMAcontroltable); uDMAChannelAssign (UDMA_CHANGE_ADC0); //SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); //uDMAEnable(); uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_ARC_32 | UDMA_INC_4); uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、pui32ADC0Value、8); //uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST); uDMAChannelEnable (UDMA_CHANGE_ADC0); 返回; } /* === main ==== */ int main (void) { Task_Params taskParams; /*呼叫板初始化函数*/ Board_initGeneral(); // Board_initEMAC(); Board_initGPIO(); // Board_initI2C(); // Board_initSDSPI(); // Board_initSPI (); // Board_initUART (); // Board_initUSB (Board_USBDEVICE); // Board_initUSBMSCHFatFs(); // Board_initWatchdog(); // Board_initWiFi (); /*构造心跳任务线程*/ Task_Params_init (&taskParams); taskParams.arg0 = 1000; taskParams.STACKSIZE = TASKSTACKSIZE; taskParams.stack =_task0Stack; Task_construct(&task0Struct,(Task_FuncPtr)心跳 BeatFxn、&taskParams、NULL); CONFIG_ADC(); ADCSequenceDMAEnable (ADC0_BASE、0); CONFIG_DMA(); /*SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2); // //将 Timer0B 中断配置为计时器超时。 // TimerConfigure (TIMER2_base、TIMER_CFG_A_PERIODICRACASE); TimerLoadSet (TIMER2_base、timer_A、12000000); TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT); //IntEnable (INT_TIMER2A); TimerEnable (TIMER2_base、TIMER_A); * /*打开用户 LED */ GPIO_WRITE (Board_LED0、Board_LED_ON); GPIO_WRITE (Board_LED1、Board_LED_ON); //ADCIntEnable (ADC0_BASE,0); //ADCSequenceDMAEnable (ADC0_BASE、1); //ADCProcessorTrigger (ADC0_BASE、0); //ADCProcessorTrigger (ADC0_BASE、1); /*启动 BIOS */ //BIOS_start(); while (1); 返回(0); }