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);
}