This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C1294XL:用于循环缓冲器的 ADC DMA

Guru**** 1761415 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/674402/ccs-ek-tm4c1294xl-adc-dma-for-circular-buffer

器件型号: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);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我意外地将 DMACONTROL1声明放入子例程上下文中、这会导致一些问题。 但这并不能解决 DMA 不连续传输的初始问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Max:

    您需要使用 Ping Pong 模式来连续传输 DMA、而不是基本模式。

    请参阅这些 E2E 帖子有关这方面的更多详细信息和代码示例、我认为 Amit 在此提供的建议与解决您的问题直接相关: e2e.ti.com/.../1589161
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的帮助! 这听起来很合理。