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:使用 UDMA 的 ADC 序列发生器3

Guru**** 2465890 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/662990/ccs-ek-tm4c1294xl-adc-sequencer-3-using-udma

器件型号:EK-TM4C1294XL
主题中讨论的其他器件: TM4C123

工具/软件:Code Composer Studio

朋友们、您好!

IAM 在 EK-tm4c1294xl 套件上工作,当前 iam 正在尝试将 ADC 与 uDMA iam 连接集成。iam 无法将数据从缓冲区传输到目的地。在此程序中,iam 尝试打印我在 ADC 中捕获的数据。

#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_UART.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/SysTick .h"
#include "driverlib/uart.h"
#include "driverlib/udma.h"
#include "utils/cpu_usage.h"
#include "utils/uartstdio.h"
#include "utils/ustdlib.h"
#include "utils/uartstdio.c"
#include "driverlib/adc.h"
#include "inc/hw_adc.h"
静态 int i;

#define MEM_buffer_size 1024

#define UART_TXBUF_SIZE 256
#define UART_RXBUF_SIZE 256


//static uint32_t g_ui8TxBuf[UART_TXBUF_SIZE];
静态 uint32_t g_ui8RxBufA[UART_RXBUF_SIZE];
静态 uint32_t g_ui8RxBufB[UART_RXBUF_SIZE];


静态 uint32_t g_ui32uDMAErrCount = 0;


静态 uint32_t g_ui32BadISR = 0;

静态 uint32_t g_ui32RxBufACount = 0;
静态 uint32_t g_ui32RxBufBCount = 0;

uint32_t g_ui32SysClock;

#IF 定义(ewarm)
#pragma DATA_alignment=1024
uint8_t pui8ControlTable[1024];
#Elif Defined (CCS)
#pragma DATA_ALIGN (pui8ControlTable、1024)
uint8_t pui8ControlTable[1024];
其他
uint8_t pui8ControlTable[1024]__attribute__(aligned (1024)));
#endif


#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)


#endif

无效
uDMAErrorHandler (空)

uint32_t ui32Status;


ui32Status = uDMAErrorStatusGet ();

if (ui32状态)

uDMAErrorStatusClear ();
G_ui32uDMAErrCount++;


空 ADCseq0Handler()


uint_fast16_t ui16Idx;
uint32_t ui32Status;
uint32_t ui32模式;
对于(ui16Idx = 0;ui16Idx < UART_TXBUF_SIZE;ui16Idx++)

UARTprintf ("在接收器端打印");
UARTprintf ("hello receiver %d"、g_ui8RxBufA[ui16Idx]);

ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0 | ADC_INT_SS0);

if (uDMAChannelModeGet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT)== UDMA_MODE_STOP){
//找到完整的缓冲区

//重新设置到缓冲区的 DMA 传输

uDMAChannelTransferSet (((UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT)、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、g_ui8RxBufA、sizeof (g_ui8RxBufA);

if (uDMAChannelModeGet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT)= UDMA_MODE_STOP){
//找到完整的缓冲区

//重新设置到缓冲区的 DMA 传输
uDMAChannelTransferSet (((UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT)、UDMA_MODE_PINGONG、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、G_ui8RxBufB、sizeof (g_ui8RxBufB);

/* if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC0))

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、g_ui8TxBuf、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
sizeof (g_ui8TxBuf));
uDMAChannelEnable (UDMA_CHANGE_ADC0);
}*/



无效
InitUART1传输(空)



uint32_t div;

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_ADC0);
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL、ADC_CLOCK_RATE_FULL);
ADCSequenceConfigure (ADC0_BASE、0 /*SS0*/、ADC_TRIGGER_AYSLEYSE、3 /*Priority*/);// SS0-SS3优先级必须始终不同
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、0、ADC_CTL_TS);// ADC_CTL_TS =读取温度传感器
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、1、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、2、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、3、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、4、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、5、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、6、ADC_CTL_TS);
ADCSequenceStepConfigure (ADC0_BASE、0 /*SS0*/、7、ADC_CTL_TS | ADC_CTL_END | ADC_CTL_IE);// ADC_CTL_IE 每8个样本触发一次
ADCSequenceEnable (ADC0_BASE、0);
ADCSequenceDMAEnable (ADC0_BASE、0);
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);
uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);

uDMAChannelControlSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);

uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
g_ui8RxBufA、sizeof (g_ui8RxBufA);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(ADC0_BASE + ADC_O_SSFIFO0)、
g_ui8RxBufB、sizeof (g_ui8RxBufB));

uDMAChannelEnable (UDMA_CHANGE_ADC0);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);
IntEnable (INT_ADC0SS0);


无效
配置 UART (空)

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0);


GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);


UARTStdioConfig (0、115200、g_ui32SysClock);


内部
main (空)

静态 uint32_t ui32 PrevUARTCount = 0;
符合 uint32_t ui32X 标准;
uint32_t ui32字节首选;

G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);


SysCtlPeripheralClockGating (真);

SysCtlPeripheralEnable (SYSCTL_Periph_GPION);


GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);


ConfigureUART();

UARTprintf ("Tiva C 系列@%u MHz\n\n"、g_ui32SysClock / 1000000);

UARTprintf ("cpu\tRemaining\tMemory\t\t\tuart\n");
UARTprintf ("Usage\ttime\tTransfers\t\t 传输\n");


SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
SysCtlPeripheralSlepEnable (SYSCTL_Periph_UDMA);


IntEnable (INT_UDMAERR);

uDMAEnable();


uDMAControlBaseSet (pui8ControlTable);


InitUART1传输();


SysCtlSleep ();


UARTprintf ("\nStopped\n");

IntDisable (INT_ADC0SS0);
IntDisable (INT_UDMA);


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

    请注意、您的帖子的主题/标题 "ADC 序列发生器3 using UDMA"  未在代码后面跟随:  

    [引用 USER="Prudhvi P"] ADCSequenceConfigure (ADC0_BASE、0 /*SS0*/、ADC_TRIGGER_AYSTEQUAL、3 /*PRIORE*/);[/引用]

    如果是这样、"注意细节"会被忽略(严重) -这是否意味着"您需要在代码审核中花费更多的时间/精力?"

    此外,"kiss"极力主张你 ,"将这样一个复杂的整体分解成其组成部分" ,然后"有系统地攻击每一个组成部分"。    这里没有这样做-因此误差可能来自多个来源(截至尚未测试的来源)-使问题解决变得更加困难和更长...    这(曾经)是否会很好?

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

    这里是我最初为 TM4C123执行的示例项目、但我为 TM4C1294修改了该项目。 它使用通用定时器在 AIN1 (PE2)上启动模数转换、然后在乒乓模式下使用 UDMA 来捕获数据。 它打印出 UART0中每个缓冲区的平均值。

    /cfs-file/__key/communityserver-discussions-components-files/908/7450.ADCwDMA.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "勺子喂食"可能会降低"实际学习"-这是否应该得到(部分)考虑?

    将多个元件和/或 MCU 外设混合在一起-不提供"必要注意事项"(可能)暂时"解决当今的问题"-但对所有"即将到来"的人员来说都是(高度)值得怀疑的!