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.

[参考译文] EK-TM4C1294XL:具有以太网任务停止问题的 ADC DMA

Guru**** 2532700 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/984404/ek-tm4c1294xl-adc-dma-with-ethernet-task-stop-issue

器件型号:EK-TM4C1294XL
Thread 中讨论的其他器件:SYSBIOS

您好!

我在乒乓模式下使用具有 DMA 的 ADC、速率为1MSPS。 在进行 ADC 读取时,我希望通过以太网发送数据,但当 ADC 处理程序启动时,它会停止主任务,因此它不会通过以太网发送数据。我需要每100us 发送一次数据。

虽然、当 ADC 未在 DMA 模式下配置并在主循环中用作处理器触发器时、它可以 与以太网正常配合使用、但它无助于实现应用所需的速度

我正在使用  

TI -RTOS 2.16.01.14

GNU 编译器 7.2.1 (Linaro)

请参阅以下代码。

//*版权所有(c) 2014,Texas Instruments Incorporated *保留所有权利。 *
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件*、则允许进行修改:
*
*
*源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
*
*二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随分发提供的文档和/或其他材料。
*
*
*德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者"按原样"提供
*以及任何明示或暗示的保证、包括但不限于:
*特定适销性和适用性的隐含保证
*不承认目的。 在任何情况下、版权所有者不得或
*派遣国应对任何直接、间接、偶然、特殊、
*典型或必然的损害(包括但不限于
*采购替代货物或服务;丧失使用、数据或利润;
*或业务中断)、无论原因是什么以及任何责任理论、
*无论是合同、严格责任还是侵权行为(包括疏忽或)
*否则)以任何方式因使用本软件而产生
,*即使被告知可能发生此类损坏。 *
/*
*==== tcpEcho.c ==== *
/* XDCtools 头文件*/
#include
#include
#include
#include
#include
/* BIOS 头文件*/
#include
#include
#include
/* NDK 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include
/*示例/板头文件*/
#include "Board.h"
include #include #include #include #include
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"
#include "driverlib/timer.h"
#include "driverlib/pin_map.h"
//#include "driverlib/rom.h"
//#include "driverlib/rom_map.h"
#include "driverlib/udma.h"
#include "inc/hw_udma.h"
#include "inc/hw_adc.h"
#include "driverlib/adc.h"
#define TCPPACKETSIZE 1024
#define TcpPort 8080
#define NUMTCPWORKERS 3.
套接字 lSocket;
struct saddr_in sLocalAddr;
// uint32_t ui32Config、ui32ClockDiv;//用于 ADC 时钟测试
#define ADC_SAMPLE_BUF_SIZE (128)
uint32_t udmaCtrlTable[1024]__attribute__(aligned (1024)));
uint32_t ADC_OUT_1[6]、ADC_OUT_2[6];
bool PSFLT、ARC、IDSLW、TEMP、MAIN_IN;
uint16_t RF_Forward、RF_Reverse、温度、VDS、ID、VGS;
字符 MyData[41];
uint8_t 计数器=0;
//
//系统时钟速率,单位为 Hz。
//
uint32_t g_ui32SysClock;
空 ADCSeq0Handler (空)
{//清除中断标志。
ADCIntClear (ADC0_BASE、0);//
uint32_t ui32Mode = uDMAChannelModeGet (UDMA_CHANGE_ADC0);
if (uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT)==0)

// GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_3、0x08);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)
、ADC_OUT_1、6);
uDMAChannelEnable (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT);
COUNTER++;
// GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_3、0x00);

if (uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT)==0)

// GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_3、0x08);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0、
ADC_OUT_2、6);
uDMAChannelEnable (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT);
// GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_3、0x00);

PSFLT=GPIOPinRead (GPIO_PORTK_base、GPIO_PIN_4);
ARC=GPIOPinRead (GPIO_PORTK_base、GPIO_PIN_5);
IDSLW=GPIOPinRead (GPIO_PORTK_base、GPIO_PIN_6);
TEMP=GPIOPinRead (GPIO_PORTK_base、GPIO_PIN_7);
IF (RF_Forward > 4102 || RF_Reverse > 4102 ||温度> 3026 || VDS > 3791|| ID > 3351|| VGS > 3103 ||
VDS < 3146|| ID < 3138|| VGS < 2482)

GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、0x02);

其他

GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、0x00);



空 InitUDMA (空)

uDMAEnable();
//启用 UDMA
uDMAControlBaseSet (udmaCtrlTable);
//IntEnable (INT_UDMA);
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);
//配置通道控制表的基地址。 表驻留在系统内存中并保持控制
//每个 uDMA 通道的信息。 表必须在1024字节边界上对齐。 基地址必须为
//配置后才能使用任何通道功能
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST);
uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_CHCTL_ARBSIZE_1);
uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT、UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 | UDMA_NEW_USEBURST | UDMA_CHCTL_ARBSIZE_1);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、6);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_2、6);
uDMAChannelEnable (UDMA_CHANGE_ADC0);
//uDMAChannelRequest (UDMA_CHANGE_ADC0);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);//由于 ADC 采样序列0上的 DMA 而启用 ADC 中断源
// IntEnable (INT_ADC0SS0);
ADCIntRegister (ADC0_BASE、0、ADCSeq0Handler);
//! IntPrioritySet (INT_USB0、0);
IntMasterEnable();

空 InitConsole (空)
{SysCtlPeripheralReset (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralReset (SYSCTL_Periph_UDMA);
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//RF_Forward
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);//RF_REVERSE
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0);//温度
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_1);//VDS
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_2);//ID
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_3);//VGS
//ADCClockConfigSet (ADC0_BASE、ADC_CLOCK SRC_PLL | ADC_CLOCK RATE_FULL、1);
IntDisable (INT_ADC0SS0);
ADCIntDisable (ADC0_BASE、0);
ADCSequenceDisable (ADC0_BASE、0);
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_ALE一直、0);
ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH17);
ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH19|ADC_CTL_END);
ADCHardwareOversampleConfigure (ADC0_BASE、64);
ADCSequenceDMAEnable (ADC0_BASE、0);
ADCSequenceEnable (ADC0_BASE、0);

void digit_init()

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);//PSFLT
GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_4);
GPIODirModeSet (GPIO_PORTK_base、GPIO_PIN_4、GPIO_DIR_MODE_IN);
GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_5);//ARC
GPIODirModeSet (GPIO_PORTK_base、GPIO_PIN_5、GPIO_DIR_MODE_IN);
GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_6);//IDSLW
GPIODirModeSet (GPIO_PORTK_base、GPIO_PIN_6、GPIO_DIR_MODE_IN);
GPIOPinTypeGPIOInput (GPIO_PORTK_base、GPIO_PIN_7);//TEMP
GPIODirModeSet (GPIO_PORTK_base、GPIO_PIN_7、GPIO_DIR_MODE_IN);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//从 main 中
GPIOPinTypeGPIOInput (GPIO_PORTD_BASE、GPIO_PIN_7);
GPIODirModeSet (GPIO_PORTD_base、GPIO_PIN_7、GPIO_DIR_MODE_IN);
GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_6);
GPIOPadConfigSet (GPIO_PORTD_base、GPIO_PIN_6、GPIO_FORMENT_10mA、GPIO_PIN_TYPE_STD_WPU);
GPIODirModeSet (GPIO_PORTD_base、GPIO_PIN_6、GPIO_DIR_MODE_OUT);
GPIOPinWrite (GPIO_PORTD_BASE、GPIO_PIN_6、0x02);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOM);//互锁引脚
GPIOPinTypeGPIOOutput (GPIO_PORTM_BASE、GPIO_PIN_1);
GPIOPadConfigSet (GPIO_PORTM_BASE、GPIO_PIN_1、GPIO_Strength _10mA、GPIO_PIN_TYPE_STD_WPU);
GPIODirModeSet (GPIO_PORTM_BASE、GPIO_PIN_1、GPIO_DIR_MODE_OUT);
GPIOPinWrite (GPIO_PORTM_BASE、GPIO_PIN_1、0x02);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);//表示 LED
GPIOPinTypeGPIOOutput (GPIO_Porth_BASE、GPIO_PIN_3);
GPIOPinWrite (GPIO_Porth_BASE、GPIO_PIN_3、0x08);

空延迟(空)

SysCtlDelay (1000);

/*=== tcpHandler ==== *创建新任务以处理新的 TCP 连接。 *
空 tcpHandler (UARg arg0、UARg arg1)

fdOpenSession (TaskSelf());
lSocket = socket (AF_iNet、SOCK_STREAM、IPPROTO_TCP);
IF (lSocket < 0)

// System_printf ("tcpHandler:套接字失败\n");
Task_exit();
返回;

memset ((char *)&sLocalAddr、0、sizeof (sLocalAddr));
sLocalAddr.Sin_Family = AF_iNet;
sLocalAddr.Sin_addr.s_addr = inet_addr ("192.168.0.135");
//htonl (INADDR_ANY);
sLocalAddr.Sin_port = htons (arg0);
while (connect (lSocket、(struct socaddr *)和 sLocalAddr、sizeof (sLocalAddr))< 0)

SysCtlDelay (400000);

// System_flush();
InitConsole();
InitUDMA();
while (真)

// ADCProcessorTrigger (ADC0_BASE、0);
//
// ADCSequenceDataGet (ADC0_BASE、0、ADC_OUT_1);
//
// if (uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT)=0)
//{
// uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、ADC_OUT_1、6);
// uDMAChannelEnable (UDMA_CHANGE_ADC0);// uDMAChannelRequest (UDMA_CHANGE_ADC0);
// counter++;
//}
MAIN_IN=GPIOPinRead (GPIO_PORTD_BASE、GPIO_PIN_7);
RF_Forward = ADC_OUT_1[1];//PE3
RF_REVERSE= ADC_OUT_1[2];//PE2
温度= ADC_OUT_1[3];//PK0
VDS = ADC_OUT_1[4];//PK1
ID =ADC_OUT_1[5];//PK2
VGS =ADC_OUT_1[0];//PK3
//delay();
//======================================== locking===================================
//
if (计数器>100)

计数器=0;
sprintf (MyData、"*D01$%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d#"、rf_Forward、rf_reverse、temperature、VDS、ID、VGS、PSFLT、ARC、IDSLW、TEMP、MAIN_IN);
SEND (lSocket、(char *) MyData、sizeof (MyData)、0);


/*
*==== main ==== *
int main (空)

// Task_handle taskHandle;
// Task_Params taskParams;
// Error_Block EB;
G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480)、120000000);
/*呼叫板初始化函数*/
Board_initGeneral();
digit_init();
Board_initGPIO();
Board_initEMAC();
// ui32Config = ADCClockConfigGet (ADC0_BASE、&ui32ClockDiv);
/*启动 BIOS */
BIOS_start();
返回(0);

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

    将代码粘贴到您的帖子中后、它将删除所有退货和换行符。 很难遵循。 请重新发布、然后使用"Insert"->"Image/Video/File"菜单下拉菜单或"Tools"->"Source Code"下拉菜单。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="96819" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/984404/ek-tm4c1294xl-adc-dma-with-ethernet-task-stop-issue/3636432 #36366432"]将代码粘贴到帖子中时,将删除所有退货和换行符。

    可以使用新的 E2E 论坛软件。 使用 Linux 下的 Opera 浏览器、我将 CCS 编辑器中的一些代码粘贴到 "Tools"->"Source Code"下拉列表中、并且它还删除了所有返回和换行符。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="91588" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/984404/ek-tm4c1294xl-adc-dma-with-ethernet-task-stop-issue/3637057 #3637057"]这可以是新的 E2E 论坛软件。

    使用新 E2E 软件在"源代码"工具中报告、可以通过删除行尾来使代码无法读取、并且不再有任何语法突出显示

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

    切斯特、是的、你是对的。 我还发现  "Tools"->"Source Code"下拉菜单不允许您粘贴源代码。 看起来它只为您提供 html 源文件。 我在 Windows 10上使用 Chrome 时看到问题。 感谢您就此问题生成新帖子。

    研发、

    同时、如果 只使用 "Insert"->"Image/Video/File"菜单下拉方法、可能会更好。

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

    为了便于阅读、我认为我们所有人都知道源代码粘贴或在新的 E2E 软件中上传是一个问题。 对于案例解决方案、我们可以复制整行内容并粘贴到 CCS 中的新文件中、并可以进一步处理。

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

    您能解释一下"停止主任务"是什么意思吗? CPU 是否会陷到异常中? 是否仍在调用 ADCSeq0Handler 中断例程?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 是的,当 DMA 启动 ADCSeq0Handler 中断例程工作时,由于这启动了 TCP 处理程序中的 while 循环任务停止工作,所以为什么这会在中断启动时发生,然后其他任务停止执行。 因此、我的要求是在乒乓模式下使用 DMA 运行 ADC、同时我希望数据通过以太网发送。

    while (true){// ADCProcessorTrigger (ADC0_base、0);// ADCSequenceDataGet (ADC0_BASE、0、ADC_OUT_1); //// if (uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT)=0)//{// uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(UDMA_CHANGE0+)/ UDMA_ADC0+(UDMA_ADC0+)/ UDA_ADC0;UDA_ADC0 +(UDA_ADC0) //}MAIN_IN=GPIOPinRead (GPIO_PORTD_base、GPIO_PIN_7);RF_正向= ADC_OUT_1[1];//PE3 RF_REVER向= ADC_OUT_1[2];//PE2温度= ADC_OUT_1[3];//PK0 =ADC_OUT_1VD[4]; //PK1 ID =ADC_OUT_1[5];//PK2 VGS =ADC_OUT_1[0];//PK3 //delay ();//=================== locking=================================== // if (counter>100){counter=0;sprintf (MyData、"*D01$%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d、%d#"、RF_Forward、RF_reverse、temperature、VDS、ID、VARC、PFFLT、%d、%d、%d、%d、%d、%d、%d、%d#"、%d#"、rf#"、rf_for"、rf_reverse、mydata (spre)、myeSwn)、eSocket (0) }

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

    问题是 、当你注册一个中断服务例程时、你会中断 TI-RTOS  SYS/BIOS 中断处理。 请参阅 SYS/BIOS 用户指南的第8节 、了解如何在 TI-RTOS/中注册中断例程

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

    您好!

    根据指南、我已经尝试这样做、但是、我无法详细了解 SYS/BIOS -可能需要我更多的时间。 我还尝试了一些示例(来自其他开发人员博客,如中断中的计时器),以便在 tcpecho.cfg 文件中注册中断,但这不起作用。

    如果您有任何其他方面的帮助、我会稍后将其放在上面、并以不同的方式关闭我的项目。

    谢谢、此致

    霍迪达斯