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.

[参考译文] RTOS/EK-TM4C129EXL:20个 ADC 通道与 UDMA 和 TI-RTOS 结合使用;变帧大小问题

Guru**** 2480155 points
Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/696345/rtos-ek-tm4c129exl-20-adc-channels-in-combination-with-udma-and-ti-rtos-problem-with-the-transfersize

器件型号:EK-TM4C129EXL

工具/软件:TI-RTOS

您好!

我在 Windows 7计算机上使用 Code Composer Studio 8.0、并且已经能够使用 EK-TM4C129EXL 与 TI-RTOS Tivac 2_16_00_08结合使用来编写简单的应用。

我正在处理一个应用、其中2个 ADC 应对20个可用模拟输入进行采样、采样率为50kHz、适用于单个模拟输入。 ADC 模块以1MHz 的采样率运行。 每个 ADC 模块在2个序列发生器的帮助下对10个通道进行采样。 从模拟输入到序列发生器位置的映射如下:

ADC0                                        | ADC1

序列发生器0:AIN0                  |序列发生器0:AIN10

            AIN1                 |              AIN11

            AIN2                 |              AIN12

            AIN3                 |              AIN13.

            AIN4                 |              AIN14

            AIN5                 |              AIN15

            AIN6                 |              AIN16

            AIN7                 |              AIN17

序列发生器1:AIN8                 |序列发生器1:AIN18

            AIN9                 |              AIN19

从序列发生器 FIFO 到 SRAM 的数据应由 UDMA 通过乒乓传输来完成。 稍后、应用程序应能够通过 TCP/IP 将 Ping 缓冲区中的数据发送到 PC、而 UDMA 正在填充 Pong 缓冲区、反之亦然。 此功能尚未实现、但是我使用 TI-RTOS 的动机。 如果没有 TI-RTOS、上述 ADC 和 UDMA 的行为对于我选择的每个传输大小都是完全正确的。 以下代码在没有 TI-RTOS 的情况下实现上述行为、情况良好:

#include // C99标准
#include 的变量定义 // C99标准
的布尔定义#include "inc/tm4c129encpdt.h"
#include "inc/hw_memmap.h" //宏定义 Tiva C 的存储器映射
。#include "inc/hw_types.h" //定义常用类型和宏
#include "driverlib/sysctl.h" //包括诸如 SysCtlClockSet 和 SysCtlClockGet
#include "driverlib/interrupt.h"
#include "driverlib/GPIO.h"的 API 函数 //包括诸如 GPIOPinTypeGPIOOutput 和 GPIOPinWrite
#include "driverlib/timer.h"
#include "driverlib/adc.h"
#include "driverlib/fpu.h"
#include "driverlib/udma.h"
//constants/toDO:所有常量定义都写入 CapsLock
#define ADCfrq 中 50000
#define FIFO0 8
#define FIFO1 4
#define ResultLength 2048
#define NumberOfSequsForTimingError 1024
#define SamplePosifestingTest 200
#define NumberOfAinChannels 20
#define UDMATRANSFERSIZEFIFO0 8
#define UDMATRANSFERSIZEFIFO1 4//ADCClockingDefinesVJ

#define PIOSC16MHZ 0x00000000
#define PLL480MHZTO32MHZ 0x00000001
//DMATransferDefinesVJ
#define ADC0SS0VJ 0x00000000
#define ADC0SS1VJ 0x00000001
#define ADC1SS0VJ 0x00000002
#define ADC1SS1VJ 0x00000003
#define DMATRANSFERSIZE_SS0 1024
#define DMATRANSFERSIZE_SS1 (DMATRANSFERSIZE_SS0/8)*2//
因为 DMA 控制表需要与1024地址
#pragma DATA_ALIGN (pui8ControlTable、1024)
//控制结构本身
uint8_t pu8ErrorTable[1024];


//void
OfFunction (void);
void TimingEattracting (void
) uint32
(void SetUCC32);void SetNumeripting (void)
void DMASetup (void);

uint16_t ADC0_FIFO0_UDMA_A[DMATRANSFERSIZE_SS0];
uint16_t ADC0_FIFO1_UDMA_A[DMATRANSFERSIZE_SS1];
uint16_t ADC1_FIFO0_USDA_ADSDRANC1_USDAMA_ADSDRA_A[DMATERSIZE_SS1_USDK_USDAN_ADSDK_USDA_ADSDAN_USDAN_RAZ1_USDAN_ADSDA_ADSDAN1_USDAN_USDRA_RA_A;u_FIFOS1_ADSDK_USDK_RA_

uint16_t ADC0_FIFO0_UDMA_B[DMATRANSFERSIZE_SS0];
uint16_t ADC0_FIFO1_UDMA_B[DMATRANSFERSIZE_SS1];
uint16_t ADC1_FIFO0_UDMATRANC1_UDMA_B[DMATRANSDZE_SSEM_ST_ADC1_USDRASIZE_ST_ADC1_ADSD_USDRA_ADSDK_1];u_ADAP_ADSDRANC1_USDRA_USDRA_USDRA_USDRA_USDRA_USDRA_USDRA_USDK_T_USDK_1_ADSDANZE_ADSDK_T_USDRA_ADSDK_1_ADSDRA_



uint32_t ADCTestIndex=0;
uint32_t i=0;
uint32_t TIMER2=0、ADC0SEQUENCER0=0、ADC0SEQUENCER1=0、 ADC1SEQUENCER0=0、ADC1SEQUENCER1=0、ui32Mode=0、
ADC0Sequencer0SWI=0、ADC0Sequencer1SWI=0、ADC0Sequencer0SWI_A=0、ADC0Sequencer0SWI_B=0、ADC0Sequencer1SWI_A=0、ADC0Sequencer1SWI_B=0、ADC0Sequencer1SWI_B=0、
ADC1Sequencer0SWI=0、ADC1Sequencer1SWI=0、ADC1Sequencer0SWI_A=0、ADC1Sequencer0SWI_B=0、ADC1Sequencer1SWI_A=0、ADC1Sequencer1SWI_B=0、ADC1Sequencer1SWI_B=0、
DebugPrint=0 、DmaErrors=0;
void DMATransferReEnable (uint32_t NumOfTransfer)
{
uint32_t ui32模式;
交换机(NumOfTransfer)
{
ADC0SS0VJ 案例:
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_A、DMATRANSFERSIZE_SS0);
对于(i=0;i<128;i++)
{
ADCTest[ADCTestIndex+I]= ADC0_FIFO0_UDMA_A[8*I];
}
ADCTestIndex=ADCTestIndex+128;
ADC0Sequencer0SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_B、DMATRANSFERSIZE_SS0);
对于(i=0;i<128;i++)
{
ADCTest[ADCTestIndex+I]= ADC0_FIFO0_UDMA_B[8*I];
}
ADCTestIndex=ADCTestIndex+128;
ADC0Sequencer0SWI_B++;
}
if (ADCTestIndex>=DMATRANSFERSIZE_SS0)
{
ADCTestIndex=0;
}
if (uDMAChannelIsEnabled (UDMA_CHANGE_ADC0)=0)
{
uDMAChannelEnable (UDMA_CHANGE_ADC0);
ADC0Sequencer0SWI++;
}
中断;

ADC0SS1VJ 案例:
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC1|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_A、DMATRANSFERSIZE_SS1);
ADC0Sequencer1SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC1|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_B、DMATRANSFERSIZE_SS1);
ADC0Sequencer1SWI_B++;
}
if (uDMAChannelIsEnabled (UDMA_CHANGE_ADC1)=0)
{
uDMAChannelEnable (UDMA_CHANGE_ADC1);
ADC0Sequencer1SWI++;
}
中断;

ADC1SS0VJ 案例:
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_A、DMATRANSFERSIZE_SS0);
ADC1Sequencer0SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_B、DMATRANSFERSIZE_SS0);
ADC1Sequencer0SWI_B++;
}
if (uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC10)=0)
{
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);
ADC1Sequencer0SWi++;
}
中断;
ADC1SS1VJ 案例:
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_A、DMATRANSFERSIZE_SS1);
ADC1Sequencer1SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_B、DMATRANSFERSIZE_SS1);
ADC1Sequencer1SWI_B++;
}
if (uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC11)=0)
{
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
ADC1Sequencer1SWI++;
}
中断;

}


}

空 DMASetup (空)
{
uint8_t *检查表=0xFFFFFFFF;
uint8_t *检查表1=0xFFFFFFFF;
uint8_t *检查表2=0xFFFFFFFF;
CheckTable = uDMAControlBaseGet ();
uDMAEnable();
CheckTable1= uDMAControlBaseGet ();
uDMAControlBaseSet (pui8ControlTable);//设置控制表数组的指针
CheckTable2 = uDMAControlBaseGet ();
uDMAChannelAssign (UDMA_CH14_ADC0_0);//DMAChannel 14由 ADC0 Sequencer0使用
uDMAChannelAssign (UDMA_CH15_ADC0_1);//DMAChannel 15由 ADC0 Sequencer1使用
uDMAChannelAssign (UDMA_CH24_ADC1_0);//DMAChannel 24由 ADC1 Sequencer0使用
uDMAChannelAssign (UDMA_CH25_ADC1_1);//DMAChannel 25由 ADC1序列发生器1使用

//禁用通道14、15、24、25的所有通道属性
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、UDMA_ATTR_ALL);
uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_ALL);
uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_ALL);

/*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
*将通道14和24的优先级设置为高,通道15和25将保持默认优先级
*多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
*Priority-List:0=最重要,3=最不重要
*-0。 通道14
*- 1. 通道15
*- 2. 通道24
*- 3. 通道25
*
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC1、UDMA_ATTR_USEBURST);
uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_USEBURST);



/*设置通道14、15、24、25的主控制结构体
*一个传输项目是16位->UDMA_SIZE_16
*源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
*目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
*如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
*因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
*
uDMAChannelControlSet (UDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_4);
uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_2);
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
uDMAChannelControlSet (uDMA_SEC_CHANNEL_ADC11|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);

/*为通道14、15、24、25设置替代控制结构
*与主设置相同
*
uDMAChannelControlSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_4);
uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_2);
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC11|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);

/*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_A、DMATRANSFERSIZE_SS0);
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_A、DMATRANSFERSIZE_SS1);
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_A、DMATRANSFERSIZE_SS0);
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_A、DMATRANSFERSIZE_SS1);



/*首先设置备用传输函数激活->| UDMA_ALT_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> pong buffers 第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_B、DMATRANSFERSIZE_SS0);
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_B、DMATRANSFERSIZE_SS1);
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_B、DMATRANSFERSIZE_SS0);
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_B、DMATRANSFERSIZE_SS1);


/* 激活频道
* 第一个传输使用主控制结构体
*
uDMAChannelEnable (UDMA_CHANGE_ADC0);
uDMAChannelEnable (UDMA_CHANGE_ADC1);
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);



}

int main (void)
{
uint32_t ui32Period;
uint32_t ui32SysClkFreq;

ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

//为统计计算启用浮点 unite,仅用于需要的计时错误调试版本
FPUEnable();
//配置 FPU 以执行 FP 状态的怠惰堆栈
FPULazyStackingEnable();

//为 Led0、LED1启用端口 N
SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
//为 AIN0、1、2、3、8、9启用端口 E
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
//为 AIN4、5、6、7、12、13启用端口 D
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
//为 AIN16、17、18、19启用端口 K
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);
//为 AIN10、11启用端口 B
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
//启用 Timer0,它将以同步方式触发 ADC0和 ADC1
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
//启用 ADC0
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
//启用 ADC1
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
//启用 DMA,这必须在调用设置例程之前完成!!!!
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
//将端口 E 引脚0到5设置为 AIN0到 AIN3以及 AIN8和 AIN9的模拟输入
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4|GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5);
//将端口 D 引脚7、6、5、4、3、2、1、0设置为 AIN4、AIN5、AIN6、AIN7、AIN12、AIN13、AIN14、AIN15的模拟输入
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0);
//将端口 K 引脚0、1、2、3设置为 AIN16、AIN17、AIN18、AIN19的模拟输入
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
//将端口 B 引脚4.5设置为 AIN12、AIN13的模拟输入
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
//将端口 N 引脚0、1设置为输出以启用 LED
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1);


//使用 PIOSC 将 ADC 模块频率设置为16MHz (1兆采样/秒)
使用 VCO (@480MHz)和15分频器将频率//或更改为32MHz (2Megasamples/s)
//TODO:不能在32MHz 下工作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
VJADCClockingSeting (PIOSC16MHZ);

//uDMAChannelTransferSet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT、UDMA_MODE_BASIC、0x40038048、ADC0_FIFO0_UDMA、ResultLength);
//uDMAChannelTransferSet (UDMA_CHANGE_ADC1|UDMA_PRI_SELECT、UDMA_MODE_BASIC、0x40038068、ADC0_FIFO1_UDMA、ResultLength);
//uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_BASIC、0x40039048、ADC1_FIFO0_UDMA、ResultLength);
//uDMAChannelTransferSet (UDMA_SEC_CHANGE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_BASIC、0x40039068、ADC1_FIFO1_UDMA、ResultLength);

DMASetup();


//将 ADC0的0序列发生器配置为由具有最高优先级的定时器触发
//adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);

ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、1);

ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、0);

ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);


//对 ADC0的序列发生器0进行采样以对 AIN0到 AIN7进行采样
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_IE|ADC_CTL_END);
//对 ADC0的序列发生器1进行采样以对 AIN8到 AIN9进行采样
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH8);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH9|ADC_CTL_IE|ADC_CTL_END);

//对 ADC1的序列发生器0进行采样以对 AIN10到 AIN17进行采样
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH10);
ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH11);
ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH12);
ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH13);
ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH14);
ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH15);
ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH17|ADC_CTL_IE|ADC_CTL_END);
//对 ADC1的序列发生器1对 AIN0到 AIN7进行采样
ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH19|ADC_CTL_IE|ADC_CTL_END);


//启用 ADC 以生成 DMA 传输请求
//启用 ADC0Sequencer0以请求 DMA 传输
ADCSequenceDMAEnable (ADC0_BASE、0);
//启用 ADC0Sequencer1以请求 DMA 传输
ADCSequenceDMAEnable (ADC0_BASE、1);
//启用 ADC1Sequencer0以请求 DMA 传输
ADCSequenceDMAEnable (ADC1_BASE、0);
//启用 ADC1Sequencer1以请求 DMA 传输
ADCSequenceDMAEnable (ADC1_BASE、1);

ADCSequenceEnable (ADC0_BASE、0);//启用 ADC0的序列发生器0

ADCSequenceEnable (ADC0_BASE、1);//启用 ADC0的序列发生器1

ADCSequenceEnable (ADC1_base、0);//启用 ADC1的序列发生器0

ADCSequenceEnable (ADC1_base、1);//启用 ADC1的序列发生器0

TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICURE);//将 timer0配置为周期定时器

ui32Period = ui32SysClkFreq/ADCFrq;//计算节拍数、以便定时器以所需频率触发 ADC

TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period-1);//将计算出的节拍数加载到 timer0中

TimerControlTrigger (TIMER0_BASE、TIMER_A、TRUE);//启用 timer0来触发 ADC

TimerIntEnable (TIMER0_BASE、TIMER_TIMA_TIMEOUT);//在 timer0中启用特定中断

ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);//在 ADC0中启用特定序列发生器0中断

ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);//在 ADC0中启用特定序列发生器1中断

ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS0);//在 ADC1中启用特定序列0中断

ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS1);//在 ADC1中启用特定序列发生器1中断
IntEnable (INT_UDMA);
IntEnable (INT_UDMAERR);

IntEnable (INT_TIMER0A);//为 timer0启用中断

IntEnable (INT_ADC0SS0);//启用 ADC0序列发生器0的中断

IntEnable (INT_ADC0SS1);//启用 ADC0序列发生器1的中断

IntEnable (INT_ADC1SS0);//启用 ADC1序列发生器0的中断

IntEnable (INT_ADC1SS1);//启用 ADC0序列发生器0的中断

IntMasterEnable();//启用全局中断

TimerEnable (TIMER0_BASE、TIMER_A);//启动 timer0

GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);

while (1)
{
}
}

void uDMAIntHandler (void)
{
int vj=0;
VJ++;
}

void uDMAErrorHandler (void)
{
uint32_t ui32Status;
ui32Status = uDMAErrorStatusGet ();

if (ui32状态)
{
uDMAErrorStatusClear();
}
}

void VJADCClockingSetting (uint32_t ui32Setting)
{
//TODO:不能在32MHz 下工作!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
开关(ui32Seting)
{
情况 PIOSC16MHZ://标准设置,根本不需要执行任何操作。 ADC 模块将以1兆采样/秒的速率运行
//此处不执行任何操作
中断;

情况 PLL480MHZTO32MHZ://480MHz VCO 时钟被15分频、为 ADC 提供32MHz 的频率、这将导致2兆采样/秒
ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_PLL|ADC_CLOCK_RATE_FULL、8);
中断;

}

}

void Adc0Sequencer0IntHandle (void)
{
ADCIntClear (ADC0_BASE、0);
ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);
ADC0SEQUENCER 序列发生器0++;
DMATransferReEnable (ADC0SS0VJ);
}

void Adc0Sequencer1IntHandle (void)
{
ADCIntClear (ADC0_BASE、1);
ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS1);
ADC0SEQUENCER 序列发生器1++;
DMATransferReEnable (ADC0SS1VJ);

}

void Adc1Sequencer0IntHandle (void)
{
ADCIntClear (ADC1_BASE、0);
ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS0);
ADC1序列发生器0++;
DMATransferReEnable (ADC1SS0VJ);
}

void Adc1Sequencer1IntHandle (void)
{
ADCIntClear (ADC1_BASE、1);
ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS1);
ADC1序列发生器1++;
DMATransferReEnable (ADC1SS1VJ);
}

void Timer0IntHandler (void)
{
//清除计时器中断
TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
TIMER2++;
}

空时间错误评估(void)
{
/*float TimingErrorMyan[NumberOfAinChannels];
uint_fast32_t ui32SummOfErrors=0;
uint_fast32_t i、ii;
fSumOfErrors=0;
对于(i=0 <NumberOfAinChannels;i++)
{
ui32SummOfErrors =0;
fSummOfErrors =0;
对于(ii = 0;ii 

此代码的传输大小设置为1024 (UDMA 传输的最大项目数)。

现在、我想在 TI-RTOS 的帮助下实现这个精确的应用。 ISR 应该布置一个 SWI、在这个 SWI 中、DMA 通道被检查、并且如果它们完成、所需的传输、Ping 或者 Pong 将被再次置位。  HWI 和 SWI 均按预期工作。 在我将 UDMA 传输的传输大小设置为1024之前、一切都可以正常工作、这在没有 TI-RTOS 的情况下是没问题的。 为了让大家了解错误/错误、这里的应用与上述应用相同、但具有 TI-RTOS 支持:

//
*版权所有(c) 2015,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//

/*
=== empty_min.c ====
//
//* XDCtools 头文件*/
#include 
#include 
#include 
#include 

/* BIOS 头文件*/
#include 
#include 
#include 

/* TI-RTOS 头文件*//
#include 
#include 
//#include 
//#include 
//#include 
//#include 
//#include 
//#include 
//#include 

/*板头文件*/
#include "Board.h"


/*/
#include // C99标准
#include 的变量定义 // C99标准
的布尔定义#include "inc/tm4c129encpdt.h"
#include "inc/hw_memmap.h" //宏定义 Tiva C 的存储器映射
。#include "inc/hw_types.h" //定义常用类型和宏
#include "driverlib/sysctl.h" //包括诸如 SysCtlClockSet 和 SysCtlClockGet
#include "driverlib/interrupt.h"的 API 函数 //为中断和寄存器分配定义
#include "driverlib/gpio.h" //包括诸如 GPIOPinTypeGPIOOutput 和 GPIOPinWrite
#include "driverlib/udma.h"
// Timer 头文件*/
#include "driverlib/timer.h"
// ADC 头文件*/
#include "driverlib/adc.h"
//*定义*/
#define VJSYSFRQ 的 API 函数 120000000 //CPU 频率
#define VJADCINGLECHANNELRATE 50000 //单个麦克风通道的采样率
#define VJNUMOFCHANNELS_SS0 8. // AdcXSequencer0服务的麦克风通道数
#define VJNUMOFCHANNELS_SS1 2. // AdcXSequencer1服务的麦克风通道数
#define VJDMATRANSFERSIZE_SS0 1016. //直至与序列发生器0相关的 DMA 通道的项数将导致中断(AdcXSequencer0中断)
//为了序列发生器1采样的2个通道的样本与序列发生器1采样的8同时发送,相应的 DMA 通道只需传输序列发生器0
#define VJDMATRANSFERSIZE_SS1中的1/4个项目 (VJDMATRANSFERSIZE_SS0/VJNUMOFCHANNELS_SS0)* VJNUMOFCHANNELS_SS1//直到与序列发生器0相关的 DMA 通道的项目数将导致中断(AdcXSequencer1中断)
#define VJNUMOFSAMPLEPERTRANSFER VJDMATRANSFERSIZE_SS0/VJNUMOFCHANNELS_SS0 //单个 DMA 传输中一个麦克风通道的样本数

//
*原型
*/
void VJ_initAnalogInputs (void);
void VJ_initADC0OutDMA (void);
void VJ_initADC1OutWithDMA (void);
void VJ_initADC0WithDMA (void);
void VJ_initADC1WithOutWithDMA (void);
void VJ_initTimer2ForADC (uint32_t ui32SysClkFreq);
void ISR_Timer2 (void);
void ISR_Adc1Sequencer1 (void);
void ISR_Adc1Sequencer0 (void);
void ISR_Adc0Sequencer1 (void);
void ISR_Adc0Sequencer0 (void);
void VJ_initDMATransForADC1SS1 (void);
void VJ_initDMATransForADC1SS0 (void);
void VJ_initDMATForADC0SS1 (void);
void VJ_initDMATransForADC0SS0 (void);
void SWI_Adc0Sequencer0 (void);
void SWI_Adc0Sequencer1 (void);
void SWI_Adc1Sequencer0 (void);
void SWI_Adc1Sequencer1 (void);


//调试变量*/
uint32_t TIMER2=0、ADCERC0SequEN0 = 0、ADCERC1RCEN0 = 0、ADC01、ADCERC1EN0 = 0 = 0、ADCEREN0 = 0、ADC1 ui32Mode=0、
ADC0Sequencer0SWI=0、ADC0Sequencer1SWI=0、ADC0Sequencer0SWI_A=0、ADC0Sequencer0SWI_B=0、ADC0Sequencer1SWI_A=0、ADC0Sequencer1SWI_B=0、ADC0Sequencer1SWI_B=0、
ADC1Sequencer0SWI=0、ADC1Sequencer1SWI=0、ADC1Sequencer0SWI_A=0、ADC1Sequencer0SWI_B=0、ADC1Sequencer1SWI_A=0、ADC1Sequencer1SWI_B=0、ADC1Sequencer1SWI_B=0、
DebugPrint=0 ,DmaErrors=0;
/* DMA 内存*/
uint16_t ADC0_FIFO0_UDMA_A[VDMATRANSFERSIZE_SS0];
uint16_t ADC0_FIFO1_UDMA_A[VJDMATRANSFERSIZE_SS1];uint16_t ADC1_UDMOS0_ADDR_ADZ1_ADDR_ADDR_USDK_USDA_ADDRZ1_ADDR_ADZ1_ADDR_ADDR_ADZ1_ADSDK_USDK_USDK_1_ADDRZ1_ADDR_ADDR_0_ADDR_ADDR_ADDR_ADZ1_ADDR_ADSDK_1_ADSDK_USDK_USDK_1_ADDR_ADDR_ADDR_ADDR_ADZ1_ADZ1_ADSDK_1.t




uint16_t ADC0_FIFO1_UDMA_B[VJDMATRANSFERSIZE_SS1];
uint16_t ADC1_FIFO0_UDMA_B[VJDMATRANSFERSIZE_SS0];
uint16_t ADC1_FIFO1_UDMA_B[VINDISAL_20


引脚*需要输入模拟信号/INSIZE_INDIZE_INSIZE_N 引脚
| 0 | 1 | 2. | 3. | 4. | 5. | 6. | 7
*端口 E:Pin0->AIN0,Pin1->AIN1,PIN2->AIN2,Pin3->AIN3,Pin4->AIN8, Pin5->AIN9
*端口 D:Pin0->AIN15,Pin1->AIN14,PIN2->AIN13,Pin3->AIN12,Pin4->AIN7, Pin5->AIN6、Pin6->AIN5、PIN7->AIN4
*端口 K:Pin0->AIN16、Pin1->AIN17、PIN2->AIN18、Pin3->AIN19
*端口 B: PIN4->AIN12、Pin5->AIN13
*/
void VJ_initAnalogInputs(void)
{


while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))
{}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD))
{}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOK))
{}
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))
{}
//将端口 E 引脚0到5设置为 AIN0到 AIN3以及 AIN8和 AIN9的模拟输入
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4|GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5);
//将端口 D 引脚7、6、5、4、3、2、1、0设置为 AIN4、AIN5、AIN6、AIN7、AIN12、AIN13、AIN14、AIN15的模拟输入
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0);
//将端口 K 引脚0、1、2、3设置为 AIN16、AIN17、AIN18、AIN19的模拟输入
GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
//将端口 B 引脚4.5设置为 AIN12、AIN13的模拟输入
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
}

void VJ_initADC0WithOutDMA (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
{}
//将 ADC0的0序列发生器配置为由具有最高优先级的定时器触发
//adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、1);

//对 ADC0的序列发生器0进行采样以对 AIN0到 AIN7进行采样
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_IE|ADC_CTL_END);
//对 ADC0的序列发生器1进行采样以对 AIN8到 AIN9进行采样
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH8);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH9|ADC_CTL_IE|ADC_CTL_END);

ADCSequenceEnable (ADC0_BASE、0);//启用 ADC0的序列发生器0

ADCSequenceEnable (ADC0_BASE、1);//启用 ADC0的序列发生器1

ADCIntEnable (ADC0_BASE、0);
ADCIntEnable (ADC0_BASE、1);

IntEnable (INT_ADC0SS0);//启用 ADC0序列发生器0的中断

IntEnable (INT_ADC0SS1);//启用 ADC0序列发生器1的中断

}

void VJ_initADC1WithOutDMA (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
{}
ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);
//对 ADC1的序列发生器0进行采样以对 AIN10到 AIN17进行采样
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH10);
ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH11);
ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH12);
ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH13);
ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH14);
ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH15);
ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH17|ADC_CTL_IE|ADC_CTL_END);
//对 ADC1的序列发生器1对 AIN0到 AIN7进行采样
ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH19|ADC_CTL_IE|ADC_CTL_END);

ADCSequenceEnable (ADC1_base、0);//启用 ADC1的序列发生器0

ADCSequenceEnable (ADC1_base、1);//启用 ADC1的序列发生器0

ADCIntEnable (ADC1_BASE、0);
ADCIntEnable (ADC1_BASE、1);

IntEnable (INT_ADC1SS0);//启用 ADC1序列发生器0的中断

IntEnable (INT_ADC1SS1);//启用 ADC0序列1的中断
}

void VJ_initADC0WithDMA (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
{}
//将 ADC0的0序列发生器配置为由具有最高优先级的定时器触发
//adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、1);

//对 ADC0的序列发生器0进行采样以对 AIN0到 AIN7进行采样
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_IE|ADC_CTL_END);
//对 ADC0的序列发生器1进行采样以对 AIN8到 AIN9进行采样
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH8);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH9|ADC_CTL_IE|ADC_CTL_END);
//启用 ADC 以生成 DMA 传输请求
//启用 ADC0Sequencer0以请求 DMA 传输
ADCSequenceDMAEnable (ADC0_BASE、0);
//启用 ADC0Sequencer1以请求 DMA 传输
ADCSequenceDMAEnable (ADC0_BASE、1);

ADCSequenceEnable (ADC0_BASE、0);//启用 ADC0的序列发生器0

ADCSequenceEnable (ADC0_BASE、1);//启用 ADC0的序列发生器1

ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);//在 ADC0中启用特定序列发生器0中断

ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);//在 ADC0中启用特定序列1中断
}

void VJ_initADC1WithDMA (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);

while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
{}
//将 ADC1的0序列发生器配置为由具有最高优先级的定时器触发
//adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、0);
ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);
//对 ADC1的序列发生器0进行采样以对 AIN10到 AIN17进行采样
ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH10);
ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH11);
ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH12);
ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH13);
ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH14);
ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH15);
ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH16);
ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH17|ADC_CTL_IE|ADC_CTL_END);
//对 ADC1的序列发生器1对 AIN0到 AIN7进行采样
ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH18);
ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH19|ADC_CTL_IE|ADC_CTL_END);

//启用 ADC1Sequencer0以请求 DMA 传输
ADCSequenceDMAEnable (ADC1_BASE、0);
//启用 ADC1Sequencer1以请求 DMA 传输
ADCSequenceDMAEnable (ADC1_BASE、1);

ADCSequenceEnable (ADC1_base、0);//启用 ADC1的序列发生器0

ADCSequenceEnable (ADC1_base、1);//启用 ADC1的序列发生器0

ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS0);//在 ADC1中启用特定序列0中断

ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS1);//在 ADC1
中启用特定序列1中断}

void VJ_initDMATransForADC1SS1 (void)
{
uint8_t *检查表=0xFFFFFFFF;
while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
{}
CheckTable=uDMAControlBaseGet ();
if (CheckTable=0|CheckTable=0xFFFFFFFF)
{
while (1)
{}
}
uDMAChannelAssign (UDMA_CH25_ADC1_1);//DMAChannel 25由 ADC1序列发生器1使用
//禁用通道14、15、24、25的所有通道属性
uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_ALL);
/*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
*将通道14和24的优先级设置为高,通道15和25将保持默认优先级
*多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
*Priority-List:0=最重要,3=最不重要
*-0。 通道14
*- 1. 通道15
*- 2. 通道24
*- 3. 通道25
*
uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_USEBURST);
/*设置通道14、15、24、25的主控制结构体
*一个传输项目是16位->UDMA_SIZE_16
*源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
*目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
*如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
*因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
*
uDMAChannelControlSet (uDMA_SEC_CHANNEL_ADC11|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);
/*为通道14、15、24、25设置替代控制结构
*与主设置相同
*
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC11|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);
/*将第二个主要传输功能设置为活动状态 ->| UDMA_ALT_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_B、VJDMATRANSFERSIZE);
/*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_A、VJDMATRANSFERSIZE = SS1);
/* 激活频道
* 第一个传输使用主控制结构体
*
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
}

void VJ_initDMATransForADC1SS0 (void)
{
uint8_t *检查表=0xFFFFFFFF;
while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
{}
CheckTable=uDMAControlBaseGet ();
if (CheckTable=0|CheckTable=0xFFFFFFFF)
{
while (1)
{}
}
uDMAChannelAssign (UDMA_CH24_ADC1_0);//DMAChannel 24由 ADC1 Sequencer0使用
//禁用通道14、15、24、25的所有通道属性
uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_ALL);
/*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
*将通道14和24的优先级设置为高,通道15和25将保持默认优先级
*多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
*Priority-List:0=最重要,3=最不重要
*-0。 通道14
*- 1. 通道15
*- 2. 通道24
*- 3. 通道25
*
uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
/*设置通道14、15、24、25的主控制结构体
*一个传输项目是16位->UDMA_SIZE_16
*源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
*目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
*如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
*因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
*
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
/*为通道14、15、24、25设置替代控制结构
*与主设置相同
*
uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
/*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_A、VJDMATRANSFERSIZE = SS0);
/*首先设置备用传输函数激活->| UDMA_ALT_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> pong buffers 第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_B、VJDMATRANSFERSIZE = SS0);
/* 激活频道
* 第一个传输使用主控制结构体
*
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);

}

void VJ_initDMATransForADC0SS1 (void)
{
uint8_t *检查表=0xFFFFFFFF;
while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
{}
CheckTable=uDMAControlBaseGet ();
if (CheckTable=0|CheckTable=0xFFFFFFFF)
{
while (1)
{}
}
uDMAChannelAssign (UDMA_CH15_ADC0_1);//DMAChannel 15由 ADC0 Sequencer1使用
//禁用通道14、15、24、25的所有通道属性
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、UDMA_ATTR_ALL);
/*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
*将通道14和24的优先级设置为高,通道15和25将保持默认优先级
*多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
*Priority-List:0=最重要,3=最不重要
*-0。 通道14
*- 1. 通道15
*- 2. 通道24
*- 3. 通道25
*
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC1、UDMA_ATTR_USEBURST);
/*设置通道14、15、24、25的主控制结构体
*一个传输项目是16位->UDMA_SIZE_16
*源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
*目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
*如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
*因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
*
uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_2);
/*为通道14、15、24、25设置替代控制结构
*与主设置相同
*
uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_2);
/*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_A、VJDMATRANSFERSIZE_SS1);
/*首先设置备用传输函数激活->| UDMA_ALT_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> pong buffers 第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_B、VJDMATRANSFERSIZE);
/* 激活频道
* 第一个传输使用主控制结构体
*
uDMAChannelEnable (UDMA_CHANGE_ADC1);

}

void VJ_initDMATransForADC0SS0 (void)
{
uint8_t *检查表=0xFFFFFFFF;
while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
{}
CheckTable=uDMAControlBaseGet ();
if (CheckTable=0|CheckTable=0xFFFFFFFF)
{
while (1)
{}

}
uDMAChannelAssign (UDMA_CH14_ADC0_0);//DMAChannel 14由 ADC0 Sequencer0使用
//禁用通道14的所有通道属性
uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);//TODO:禁用调试突发通道
/*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
*将通道14和24的优先级设置为高,通道15和25将保持默认优先级
*多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
*Priority-List:0=最重要,3=最不重要
*-0。 通道14
*- 1. 通道15
*- 2. 通道24
*- 3. 通道25
*
uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
/*设置通道14、15、24、25的主控制结构体
*一个传输项目是16位->UDMA_SIZE_16
*源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
*目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
*如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
*因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
*
uDMAChannelControlSet (UDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_4);
/*为通道14、15、24、25设置替代控制结构
*与主设置相同
*
uDMAChannelControlSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_4);
/*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> ping 缓冲器第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_A、VJDMATRANSFERSIZE = SS0);
/*首先设置备用传输函数激活->| UDMA_ALT_SELECT
*乒乓传输 -> UDMA_MODE_PINGONG
*源地址 -> FIFO 地址:删除硬编码地址
*目的地地址 -> pong buffers 第一个元素的地址
*项目数(16位) -> 1024 (这是最大值!)
*
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_B、VJDMATRANSFERSIZE = SS0);
/* 激活频道
* 第一个传输使用主控制结构体
*
uDMAChannelEnable (UDMA_CHANGE_ADC0);

}

void VJ_initTimer2ForADC (uint32_t ui32SysClkFreq)
{
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);
while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER2))
{

}
uint32_t ui32Period = ui32SysClkFreq/VJADCINGLECHANNELRATE;
TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICURE);//将 timer2配置为周期计时器
TimerLoadSet (TIMER2_base、TIMER_A、ui32Period-1);//将计算出的节拍数加载到 timer0中
TimerControlTrigger (TIMER2_base、TIMER_A、true);//启用 timer2来触发 ADC
TimerIntEnable (TIMER2_base、TIMER_TIMA_TIMEOUT);//在 timer0中启用特定中断
TimerEnable (TIMER2_base、timer_A);
}

void ISR_Adc0Sequencer0 (void)
{
ADCIntClear (ADC0_BASE、0);//TODO:欠流和过流检查
ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);
Swi_post (Adc0Sequencer0);
ADC0SEQUENCER0++;
}

void ISR_Adc0Sequencer1 (void)
{
ADCIntClear (ADC0_BASE、1);//TODO:欠流和过流检查
ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS1);
Swi_post (Adc0Sequencer1);
ADC0SEQUENCER1++;
}

void ISR_Adc1Sequencer0 (void)
{
ADCIntClear (ADC1_BASE、0);//TODO:欠流和过流检查
ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS0);
Swi_post (Adc1Sequencer0);
ADC1SEQUENCER0++;
}

void ISR_Adc1Sequencer1 (void)
{
ADCIntClear (ADC1_BASE、1);//TODO:欠流和过流检查
ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS1);
Swi_post (Adc1Sequencer1);
ADC1SEQUENCER1++;
}

void ISR_Timer2 (void)
{
//清除计时器中断
TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);
TIMER2++;
DebugPrint=(TIMER2%(VJNUMOFSAMPLEPERTRANSFER));
开关(DebugPrint)
{
情况0:
LOG_info5 ("HWI !!! Timer2:[%u]| Adc0Sequencer0:[%u]| Adc0Sequencer1:[%u]| Adc1Sequencer0:[%u]| Adc1Sequencer1:[%u]"、TIMER2、ADC0SequEN0、ADC0SEQUENCER 1、ADC1CEREN0;ADC1SEQUENCER
中断;
案例1:
log_info5 ("swi !!! Timer2:[%u]| Adc0Sequencer0_A:[%u]| Adc0Sequencer1_A:[%u]| Adc1Sequencer0_A:[%u]| Adc1Sequencer1_A:[%u]"、TIMER2、ADC0Sequencer0SWI_A、ADC1Sequencer1SWI_A、ADC1Sequencer1_A、ADC1Swi_A、ADC1Sequencer1SW1SW1SW1SW1I、ADC1SequencerA)
中断;
案例2:
log_info5 ("swi !!! Timer2:[%u]| Adc0Sequencer0_B:[%u]| Adc0Sequencer1_B:[%u]| Adc1Sequencer0_B:[%u]| Adc1Sequencer1_B:[%u]"、TIMER2、ADC0Sequencer0SWI_B、ADC1Sequencer1b、ADC1Swi_B、ADC1Sequencer1b)
中断;
案例3:
log_info5 ("DMA 启用!!!! Timer2:[%u]| Adc0Sequencer0:[%u]| Adc0Sequencer1:[%u]| Adc1Sequencer0:[%u]| Adc1Sequencer1:[%u]"、TIMER2、ADC0Sequencer0I、ADC0Sequencer1SWI、ADC1Sequencer1SWI、ADC1Sequencer1)
中断;
}
}

void SWI_Adc0Sequencer0 (void)
{

if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC0))
{
uDMAChannelEnable (UDMA_CHANGE_ADC0);
ADC0Sequencer0SWI++;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_A、VJDMATRANSFERSIZE = SS0);
ADC0Sequencer0SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、ADC0_FIFO0_UDMA_B、VJDMATRANSFERSIZE = SS0);
ADC0Sequencer0SWI_B++;
}
}

void SWI_Adc0Sequencer1 (void)
{
if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC1)
){
uDMAChannelEnable (UDMA_CHANGE_ADC1);
ADC0Sequencer1SWi++;
}
ui32Mode=uDMAChannelModeGet (uDMA_CHANGE_ADC1|UDMA_PRI_SELECT);
if (ui32Mode=uDMA_MODE_STOP)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_A、VJDMATRANSFERSIZE_SS1);
ADC0Sequencer1SWI_A+;
}
ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC1|UDMA_ALT_SELECT);
if (ui32Mode=UDMA_MODE_STOP)
{
uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、ADC0_FIFO1_UDMA_B、VJDMATRANSFERSIZE);
ADC0Sequencer1SWI_B++;
}


void SWI_Adc1Sequencer0 (void)
{
if (!uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC10))
{
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);
ADC1Sequencer0SWi++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_A、VJDMATRANSFERSIZE = SS0);
ADC1Sequencer0SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、ADC1_FIFO0_UDMA_B、VJDMATRANSFERSIZE = SS0);
ADC1Sequencer0SWI_B++;
}
}

void SWI_Adc1Sequencer1 (void)
{
if (!uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC11))
{
uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
ADC1Sequencer1SWI++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_PRI_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_A、VJDMATRANSFERSIZE = SS1);
ADC1Sequencer1SWI_A++;
}
ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_ALT_SELECT);
if (ui32Mode=udma_mode_stop)
{
uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、ADC1_FIFO1_UDMA_B、VJDMATRANSFERSIZE);
ADC1Sequencer1SWI_B++;
}
}

/*
=== main ====
*/
int main (void)
{
uint32_t ui32SysClkFreq = SysCtlClockFreqSet (((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、VJSYSFRQ);
/*呼叫板初始化函数*/
Board_initGeneral();
EK_TM4C129EXL_initDMA ();
// Board_initEMAC();
Board_initGPIO();
// Board_initI2C();
// Board_initSDSPI();
// Board_initSPI ();
// Board_initUART ();
// Board_initUSB (Board_USBDEVICE);
// Board_initUSBMSCHFatFs();
// Board_initWatchdog();
// Board_initWiFi ();
vj_initAnalogInputs();
vj_initADC0WithDMA();
//vj_initADC0WithOutDMA();
vj_initDMATransForADC0SS0();
vj_initDMATransForADC0SS1 ();
//vj_initADC1WithOutDMA();
vj_initADC1WithDMA();
vj_initDMATransForADC1SS0();
vj_initDMATransForADC1SS1();
vj_initTimer2ForADC (ui32SysClkFreq);

/*启动 BIOS */
BIOS_start();

返回(0);
}

 此时、转接大小设置为1016、效果非常好(我也尝试了1023、也能正常工作)。 进行定义

#define VJDMATRANSFERSIZE_SS0 

可以更改传输大小。 为了调试应用程序、应用程序会递增调试变量、并每1016个 timer2中断将其打印到日志中。
我的 TI-RTOS 设置(.cfg)如下:
/*
版权所有(c) 2015-2016、德州仪器(TI)公司
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//



/*========================= 时钟配置======================== */
var Clock = xdc.useModule('ti.sysbios.knl.Clock');
var LoggingSetup = xdc.useModule('ti.uia.sysbios.LoggingSetup');
/*
默认值取决于系列。 例如、Linux 系统通常仅
*支持最短时间为10000us、是10000 us 的倍数。
* TI 平台的默认值为1000us。
*/
Clock.tickPeriod = 1000;



/*=================== 默认值(模块)配置=================== //
var Defaults = xdc.useModule('xdc.runtime.Defaults');
//
*允许在目标上加载模块名称的标志。 模块名称
*字符串放置在.const 段中以用于调试。
*
*选择一个:
*- true (默认值)
* 将此参数设置为 true 将在.const
*中包含名称字符串 部分、以便更容易调试错误和断言。
*- false
* 将此参数设置为 false 将减小.const
*中的占用空间 部分。 因此、错误和断言消息将包含
* "未知模块"前缀、而不是实际的模块名称。
*/
Defaults.common$.namedModule = true;
//Defaults.common$.namedModule = false;



/*====== 错误配置=================== //
var Error = xdc.useModule('xdc.runtime.Error');
//
*调用此函数以处理所有引发的错误,但与
* Error.raiseHook 不同,此函数负责使用
适当初始化的 Error_Block 完全处理*错误。
*
*选择一个:
*- Error.policyDefault (默认值)
* 使用已初始化的 Error_Block 结构和日志*调用 Error.raiseHook
使用模块的记录器时出错。
*- Error.PolicySpin
* 在 while (1)循环中捕获以最小化目标
的简单替代方法* 封装尺寸。
* 使用 Error.PolicySpin 时、将不会调用 Error.raiseHook。
//
Error.policyFxn = Error.policyDefault;
//Error.policyFxn = Error.policySpin;

//
*如果 Error.policyFxn 设置为 Error.policyDefault,则
每当错误模块引发错误时,都会调用此函数*。
*
*选择一个:
*- Error.print (默认值)
* 为了更方便
*、错误通过 System_printf()进行格式化和输出 调试。
*-空
* 错误未格式化或记录。 此选项减少了代码占用空间。
*-非空函数
* 调用自定义用户函数时出错。 请参阅错误模块文档
* 以了解更多详细信息。
//
Error.raiseHook = Error.print;
//Error.raiseHook =空;
//Error.raiseHook ="&myErrorFxn";

//
*如果 Error.policyFxn 设置为 Error.PolicyDefault,此选项适用于
* Error.raiseHook 函数可被递归
调用的最大次数*。 此选项限制了无限递归的可能性
、*可能导致栈溢出。
*默认值为16。
*/
Error.maxDepth = 2;



/*========================= Hwi 配置=================== //
var halHwi = xdc.useModule('ti.sysbios.hal.Hwi');
var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
//
*在空闲循环中检查 Hwi (系统)堆栈溢出。
*
*选择一个:
*- true (默认值)
* 检查系统堆栈在空闲循环期间溢出的顶字和
* 如果检测到错误、则会引发错误。
*- false
* 禁用运行时检查可提高运行时性能并产生
* 减小了闪存尺寸。
//
//halHwi.checkStackFlag = true;
halHwi.checkStackFlag = false;

//
*当
检测到硬件异常时,以下选项会改变系统的行为*。
*
*选择一个:
*- Hwi.enableException = true
* 此选项会使默认的 m3Hwi.excHandlerFunc 函数完全
* 解码异常并将寄存器转储到系统控制台。
* 此选项会在错误模块中引发错误并显示
* ROV 中出现异常。
*- Hwi.enableException = false
* 此选项通过不解码或打印
*来减少代码占用 系统控制台异常。
* 但是、它仍会在错误模块中引发错误、并显示
* ROV 中出现异常。
*- Hwi.exHandlerFunc =空
* 这是节省代码空间的最积极的选择;但
它* 很难调试异常。 它将闪存空间减小
了* 发生异常时插入默认 while (1)陷阱。 此选项
* 不会导致错误模块出错。
//
m3Hwi.enableException = true;
//m3Hwi.enableException = false;
//m3Hwi.excHandlerFunc =空;

//
*在除以零时启用硬件异常生成。
*
*选择一个:
*- 0 (默认值)
* 在除以0
*- 1
*时禁用硬件异常 在除以零时启用硬件异常
*/
m3Hwi.nvicCCR.DIV_0_TRP = 0;
//m3Hwi.nvicCCR.DIV_0_TRP = 1;

//
*为无效的数据对齐启用硬件异常生成。
*
*选择一个:
*- 0 (默认值)
* 禁用数据对齐的硬件异常
*- 1
* 启用数据对齐的硬件异常
*/
m3Hwi.nvicCCR.UNALIGN_TRP = 0;
//m3Hwi.nvicCCR.UNALIGN_TRP = 1;



/*=========== 空闲配置========================= //
var Idle = xdc.useModule('ti.sysbios.knl.Idle');
//
*空闲模块用于指定
在系统中没有*其他任务正在运行时要调用的函数列表。
*
*此处添加的函数将在空闲任务内连续运行。
*
*函数签名:
* void func (void);
*/
///idle.addFunc ("&myIdleFunc");



/*=================== 内核(SYS/BIOS)配置=================== */
var BIOS = xdc.useModule('ti.sysbios.BIOS');
/*
启用 BIOS 库中的断言。
*
*选择一个:
*- true (默认值)
* 启用断言以进行调试。
*- false
* 禁用断言以减小代码占用空间并提高性能。
//
//BIOS.assertsEnabled = true;
BIOS.assertsEnabled = true;

//
*指定 BIOS 的默认堆大小。
//
BIOS.heapSize = 512;

//
*一个标志,用于确定 xdc.runtime 源是否包含在自定义
*构建的 BIOS 库中。
*
*选择一个:
*- false (默认值)
* 预构建的 xdc.runtime 库由相应的目标
*提供 用于构建应用。
*- true
* xdc.runtime 库源将包含在自定义 BIOS
中* 库。 此选项在两个代码
中生成最高效的库* 封装和运行时性能。
*/
BIOS.includeXdcRuntime = false;
//BIOS.includeXdcRuntime = true;

//
* SYS/BIOS 运行时以库的形式提供
*与应用程序链接*。
SYS/BIOS 产品随附了该库的几种形式。
*
*选择一个:
*- BIOS.LibType_Custom
* 针对代码大小和
*进行了高度优化的定制构建库 运行时性能。
*- BIOS.LibType_Debug
* 自定义构建的库、该库未进行优化
、可用于* 使用调试器单步执行 API。
*
//
BIOS.libType = BIOS.LibType_Custom;
//BIOS.libType = BIOS.LibType_Debug;

//
*运行时实例创建启用标志。
*
*选择一个:
*- true (默认值)
* 允许在运行时调用 Mod_create()和 Mod_delete (),*
需要一个用于动态内存分配的默认堆。
*- false
* 通过禁止 Mod_create()和 Mod_delete ()来减少代码占用空间
* 调用的函数。 对象实例通过
*构造 mod_construct()并通过 Mod_析 构函数()析构。
*/
BIOS.runtimeCreatesEnabled = true;
//BIOS.runtimeCreatesEnabled = false;

/*
启用 BIOS 库中的日志。
*
*选择一个:
*- true (默认值)
* 启用日志以进行调试。
*- false
* 禁用日志记录以减少代码占用空间并改善运行时间
* 性能。
*/
//BIOS.logsEnabled = true;
BIOS.logsEnabled = true;



/*=========== 内存配置=================== //
var 内存= xdc.useModule('xdc.runtime.Memory');
//
*内存模块本身只为 IHeap

模块(例如、 HeapMem、HeapBuf)。
//



/*========================= 程序配置=================== IAR

忽略*//* Program.stack。 使用
* IAR Embedded Workbench 中的项目选项来改变系统堆栈大小。
//
if (!Program.build.target.$name.match (/IAR/)){
/*
*减小系统堆栈大小(由 ISR 和 Swi 使用)以减小
* RAM 使用情况。
*/
Program.stack = 1024;
}



//
*为 GNU 目标启用半主机以打印到 CCS 控制台
*/
if (Program.build.target.$name.match (/GNU/)){
VAR SemiHost = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
}/*
========================= 信标配置=================== //
var semaphore = xdc.useModule('ti.sysbios.knl.Semaphore');
//
*启用对任务优先级挂起队列的全局支持。
*
*选择一个:
*- true (默认值)
* 这允许根据任务优先级为待处理的任务提供服务。
*- false
* 待处理任务是基于先入先出的服务。
*
*在 ROM 中使用 BIOS 时:
* 此选项必须设置为 false。
//
//semaphore.supportsPriority = true;
semaphore.supportsPriority = false;

//
*允许通过信号量隐式布置事件,
*禁用以保存其他代码。
*
*选择一个:
*- true
* 这允许信标模块发布信标和事件
* 同步。
*- false (默认值)
* 必须显式发布事件以解除任务阻止。
*
///semaphore.supportsEvents
= true;
semaphore.supportsEvents = false;



/*=================== Swi 配置=================== //
var Swi = xdc.useModule('ti.sysbios.knl.Swi');
//
*软件中断是一个包含
要*执行的函数和优先级的对象。 软件中断被优先化、优先任务
*并被硬件中断服务例程抢先。
*
*包括此模块是为了允许在用户的应用程序中使用 Swi。
//



/*========================= 系统配置=================== //
var System = xdc.useModule('xdc.runtime.System');
//
*当系统异常退出时调用中止处理程序。
*
*选择一个:
*- System.AbortStd (默认)
* 调用 ANSI C 标准'abort()'来终止应用程序。
*- System.AbortSpin
* 在 while (1) trap
*中无限循环的轻量级中止函数 功能。
*-自定义中止处理程序
* 用户定义的函数。 请参阅*的系统模块说明文件
详细信息。
*/
System.ABortFxn = System.ABortStd;
//System.ABortFxn = System.ABortSpin;
//System.ABortFxn ="&myAbortSystem";

/*
当系统正常退出时,将调用退出处理程序。
*
*选择一个:
*- System.exitStd (默认)
* 调用 ANSI C 标准'exit()'来终止应用程序。
*- System.exitSpin
* 在 while (1) trap
*中无限循环的轻量级退出函数 功能。
*-自定义退出函数
* 用户定义的函数。 请参阅*的系统模块说明文件
详细信息。
//
System.exitFxn = System.exitStd;
//System.exitFxn = System.exitSpin;
//System.exitFxn =“&myExitSystem”;

//
*最小化系统模块中的退出处理程序数组。 System 模块包括
*一个在 System_atexit()中注册的函数数数组,System_exit()
调用该函数组。 默认值为8。
//
System.maxAtexitHandlers = 2;

//
* System.SupportProxy 定义了 System
*函数的低级实现,例如 System_printf ()、System_flush ()等
*
*选择一对:
*- SysMin
* 此模块维护一个内部可配置的循环缓冲
器、该缓冲器* 存储输出,直到调用 System_flush()。
* 循环缓冲区的大小通过 SysMin。bufSize 设置。
*- SysCallback
* SysCallback 允许系统 API 的用户定义实现。
* SysCallback 支持代理的代码占用空间更小
、可以是* 用于提供定制 System_printf 服务。
* 默认的 SysCallback 函数指向存根函数。 请参阅
* SysCallback 模块的文档。
//
var SysMin = xdc.useModule('xdc.runtime.SysMin');
SysMin。bufSize = 128;
System.SupportProxy = SysMin;
//var SysCallback = xdc.useModule('xdc.runtime.SysCallback');
// System.SupportProxy = SysCallback;
//SysCallback.abortFxn =[&myAbort];
//SysCallback.exitFxn ="&myUserExit";/myUserFlushFlush
="/ UserCallback.UserFlushn";
//SysCallback.putchFxn ="&myUserPutch";
//SysCallback.readyFxn ="&myUserReady";




/*=========== 任务配置=================== //
var Task = xdc.useModule('ti.sysbios.knl.Task');
//
*检查任务堆栈是否存在溢出情况。
*
*选择一个:
*- true (默认值)
* 在
*期间启用任务堆栈溢出情况的运行时检查 上下文切换("从"和"到")
*- false
* 禁用任务堆栈溢出条件的运行时检查。
//
//Task.checkStackFlag = true;
Task.checkStackFlag = false;

//
*设置创建任务时的默认任务堆栈大小。
*
*默认值取决于所使用的器件。 减小默认堆栈
*大小可节省更多内存。
*/
Task.defaultStackSize = 512;

/*
启用空闲任务。
*
*选择一个:
*- true (默认值)
* 创建优先级为0的任务、该任务调用空闲挂钩函数。 此
* 选项必须设置为 true 才能获得 Power
*提供的节能效果 模块。
*- false
* 未创建空闲任务。 此选项占用的内存较少、为 no
* 需要额外的默认任务堆栈。
* 若要在没有空闲任务的情况下通过电源模块实现节能
、请执行* 将 Idle.run 添加为 Task.allBllockedFunc。
//
//Task.enableIdleTask = true;
Task.enableIdleTask = false;
//Task.allBlockedFunc = Idle.run;

//
*如果 Task.enableIdleTask 设置为 true,则该选项设置空闲任务
的*堆栈大小。
*
*减小空闲堆栈大小可节省更多内存。
*/
Task.idleTaskStackSize = 512;

/*
减少任务优先级的数量。
*默认值为16。
*减少任务优先级的数量可节省内存。
//
Task.numPriorities = 16;



//
* Idle 函数列表。
*
*此处添加的函数将在空闲任务内连续运行。
*
*函数签名:
* void func (void);
*/
///idle.addFunc ("&myIdleFunc");



/*=================== 文本配置=================== //
var text = xdc.useModule('xdc.runtime.Text');
//
*这些字符串放置在.const 段中。 将此参数设置为
* false 将节省.const 段中的空间。 错误、断言和日志消息
*将打印原始 ID 和 args、而不是格式化的消息。
*
*选择一个:
*- true (默认值)
* 此选项将测试字符串加载到.const 中、以便于调试。
*- false
* 此选项可减小.const 占用空间。
*/
text.isLoaded = true;
//text.isLoaded = false;



/*=========== 类型配置=================== */
var types = xdc.useModule('xdc.runtime.Types');
/*
此模块定义了在
* xdc.runtime 软件包中使用的基本常量和类型。
//



/*========================= TI-RTOS 中间件配置================= */
var mwConfig = xdc.useModule('ti.mw.Config');
/*
包括 TI-RTOS 中间件库
*/



/*================== TI-RTOS 驱动程序的配置==== //
var driversConfig = xdc.useModule('ti.drivers.Config');
//
*包含 TI-RTOS 驱动程序
*
选择一个:
*- driversConfig.LibType_nonInstrumented (默认)
* 使用针对封装和性能进行优化
的 TI-RTOS 驱动程序库* 而不使用断言或日志。
*- driversConfig.LibType_Instrumented
* 使用 TI-RTOS 驱动程序库在启用断言和日志的情况下进行调试。
*/
driversConfig.libType = driversConfig.LibType_noniced;
//driversConfig.libType = driversConfig.LibType_instrumented;



/*=========== 应用程序特定实例========================= //
var m3Hwi0Params = new m3Hwi.Params ();
m3Hwi0Params.instance.name ="HwiHandle_Timer2";
m3Hwi0Params.priority = 0;
Program.global.HwiHandle_Timer2 = m3Hwi.create (39、"&ISR_Timer2"、 m3Hw0Params);
LoggingSetup.sysbiosLogging = false;
LoggingSetup.sysbiosHwiLogging = false;
var m3Hwi1Params = new m3Hwi.Params ();
m3Hwi1Params.instance.name ="HwiHandle_AdSequencer0";
m3Hwi1Parwis.priority = 1;Program_c030_AdwiSequencer0"
、"m30_AdwiSequencer0" m3Hwi1Params);
var m3Hwi2Params = new m3Hwi.Params ();
m3Hwi2Params.instance.name ="HwiHandle_Adc0Sequencer1";
m3Hwi2Params.priority = 1;
Program.global.HwiHandle_Adc0Sequencer1 = m3Hwi.create (31、"&1、"Adc0Sequencer1" m3Hwi2Params);
var m3Hwi3Params = new m3Hwi.Params ();
m3Hwi3Params.instance.name ="HwiHandle_Adc1Sequencer0";
m3Hwi3Params.priority = 1;
Program.global.HwiHandle_Adc1Sequencer0 = m3Hwi.create ("Adc0&isr"、Adc0)、"AdcSequencer0" m3Hwi3Params);
var m3Hwi4Params = new m3Hwi.Params ();
m3Hwi4Params.instance.name ="HwiHandle_Adc1Sequencer1";
m3Hwi4Params.priority = 1;
Program.global.HwiHandle_Adc1Sequencer1 = m3Hwi.create (63、Sequencer1) m3Hwi4Params);
m3Hwi.diterAutoNestingSupport = false;
var swi0Params = new Swi.Params ();
swi0Params.instance.name ="Adc0Sequencer0";
swi0Params.priority = 0;
Program.global.Adc0Sequencer0 = Swi.create ("&SWI_Adc0Sequencer0";sw0Parencer0)
var swi1Params = new swi.Params ();
swi1Params.instance.name ="Adc0Sequencer1";
swi1Params.priority = 0;
Program.global.Adc0Sequencer1 = Swi.create ("&SWI_Adc0Sequencer1"、swi1Params);
LoggingSetup.loadTaskLogging = false;
LoggingSetup.loadSwiLogging = false;
LoggingSetup.loadHwiLogging = true;
LoggingSetup.enableTaskProfiler = false;
LoggingSetup.loadLoggerSize = 1024;
LoggingSetup.mainLoggerSize = 2048;
var swi2Params = new Swi.Params ();
swi2Params.instance.name ="Adc1Sequencer0";
swi2Params.priority = 0;
Program.global.Adc1Sequencer0 = Swi.create ("&SWI_Adc1Sequencer0"、swi2Params);
var swi3Params = new swi.Params ();
swi3Params.instance.name ="Adc1Sequencer1";
swi3Params.priority = 0;
Program.global.Adc1Sequencer1 = Swi.create ("&SWI_Adc1Sequencer1"、swi3Params);



如果您知道我的错误,请告诉我,如果它是一个常见的错误(我已经准备好搜索它)。 我也很高兴看到任何有关如何调试这种奇怪行为的提示。
最诚挚的问候、
Richard
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Richard、

    当您说基于 TI-RTOS 的 TI-RTOS 在大小设置为1024时不起作用时、会发生什么情况? 此外、您能否将 DMA 缓冲器放置在4字节边界上(通过 #pragma 或使其成为 int32_t)。 我认为他们需要在32位边界上...我应该确认、但这是一个简单的测试:)

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

    感谢您的快速播放。 不幸的是、我不再工作了、直到明天才能调整缓冲区。 但是、如果这是问题、那么如果没有 TI-RTOS、这也不是问题?
    但我可以更详细地描述该误差。 误差效应实际上非常奇怪。 CPU 几乎没有输入任何其他 ISR、而是除 ADC0序列发生器0和 ADC0序列发生器1的 ISR。 我推导这种行为是因为每个 ISR 的程序增量和每个 SWI 都是计数器。 如果我让程序运行一小段时间、则所有 ISR 和 SWI 的计数器都很低、但并非完全相同。 除了 ADC0 Sequencer0和 ADC0 Sequencer1 ISR、我找不到进入 ISR 或 SWI 的频率、因此我假设它是随机的。

    此致、

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

    您好 Todd、

    我将存储器与4字节地址对齐、但它仍然不起作用。 我使用的源代码如下:

    #pragma DATA_ALIGN (ADC0_FIFO0_UDMA_A、4)
    uint16_t ADC0_FIFO0_UDMA_A[VJDMATRANSFERSIZE_SS0];
    #pragma DATA_ALIGN (ADC0_FIFO1_UDMA_A、4)
    uint16_t SDR_URAZ1_ADDR_1
    (ADC0_AUDMA_DATA_AURA_A) 4)
    uint16_t ADC1_FIFO0_UDMA_A[VJDMATRANSFERSIZE_SS0];
    #pragma DATA_ALIGN (ADC1_FIFO1_UDMA_A、4)
    uint16_t ADC1_ALIGN FIFO1_UDMA_A[VFIFJDMATRANSFERSIZE_0_USDA_ADC1_ADC1_USD_0
    
    ;#FIFOSD_ADC1_USD_0;4) uSD_ADC1_USD_0
    
    #FIFMA DATA_ALIGN (ADC0_FIFO1_UDMA_B、4)
    uint16_t ADC0_FIFO1_UDMA_B[VJDMATRANSFERSIZE_SS1];
    #pragma DATA_ALIGN (ADC1_FIFO0_UDMA_B、4)
    uint16_t ADSIZ1_ADDR_0
    pragma DATA_USDA_ADC1_ADSDK_0;#FIFO_UDMOS_ADQ1_ADQ1_ADSDK_1 4)
    uint16_t ADC1_FIFO1_UDMA_B[VJDMATRANSFERSIZE_SS1];
    

    但是、我需要继续工作、并将内存管理更改为我想象最终程序应该如何运行的方式。 我分配一个整个存储器块、并将该块拆分为8个存储器块。 这样,数组就会按连续顺序排列。 事实证明、这是问题的解决方案。 以下是相应的源代码:

    //
    *版权所有(c) 2015,Texas Instruments Incorporated
    *保留所有权利。
    *
    *
    只要
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    *
    *源代码的重新分发必须保留上述版权
    声明*、此条件列表和以下免责声明。
    *
    ***二进制形式的再发行必须在
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    *
    ***未经
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *、
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    *贡献者都不对任何直接、间接、偶然、特殊、
    *模范、 或相应的损害(包括但不限于
    *采购替代产品或服务;丧失使用、数据或利润;
    *或业务中断)、但出于任何责任理论
    、*无论是在合同中、严格责任还是由于
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    、*即使已获悉可能会发生此类损坏。
    //
    
    /*
    === empty_min.c ====
    //
    //* XDCtools 头文件*/
    #include 
    #include 
    #include 
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    #include 
    
    /* TI-RTOS 头文件*//
    #include 
    #include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    //#include 
    
    /*板头文件*/
    #include "Board.h"
    
    
    /*/
    #include // C99标准
    #include 的变量定义 // C99标准
    的布尔定义#include "inc/tm4c129encpdt.h"
    #include "inc/hw_memmap.h" //宏定义 Tiva C 的存储器映射
    。#include "inc/hw_types.h" //定义常用类型和宏
    #include "driverlib/sysctl.h" //包括诸如 SysCtlClockSet 和 SysCtlClockGet
    #include "driverlib/interrupt.h"的 API 函数 //为中断和寄存器分配定义
    #include "driverlib/gpio.h" //包括诸如 GPIOPinTypeGPIOOutput 和 GPIOPinWrite
    #include "driverlib/udma.h"
    // Timer 头文件*/
    #include "driverlib/timer.h"
    // ADC 头文件*/
    #include "driverlib/adc.h"
    //*定义*/
    #define VJSYSFRQ 的 API 函数 120000000 //CPU 频率
    #define VJADCINGLECHANNELRATE 50000 //单个麦克风通道的采样率
    #define VJNUMOFCHANNELS_SS0 8. // AdcXSequencer0服务的麦克风通道数
    #define VJNUMOFCHANNELS_SS1 2. // AdcXSequencer1服务的麦克风通道数
    #define VJDMATRANSFERSIZE_SS0 1024 //直至与序列发生器0相关的 DMA 通道的项数将导致中断(AdcXSequencer0中断)
    //为了序列发生器1采样的2个通道的样本与序列发生器1采样的8同时发送,相应的 DMA 通道只需传输序列发生器0
    #define VJDMATRANSFERSIZE_SS1中的1/4个项目 (VJDMATRANSFERSIZE_SS0/VJNUMOFCHANNELS_SS0)* VJNUMOFCHANNELS_SS1//直到与序列发生器0相关的 DMA 通道的项目数将导致中断(AdcXSequencer1中断)
    #define VJNUMOFSAMPLEPERTRANSFER VJDMATRANSFERSIZE_SS0/VJNUMOFCHANNELS_SS0 //单次 DMA 传输中一个麦克风通道的采样数
    // AdcXSequencerY FIFO 的地址*/
    #define VJADC0SS0FIFOADDRESS 0x40038048
    #define VJADC0SS1FIFOADDRESS 0x40038068
    #define VJADC1SS0FIFOADDRESS 0x40039048
    #define VJADC1SS1FIFOADDRESS 0x40039068
    
    
    /*
    原型
    */
    void VJ_initAnalogInputs (void);
    void VJ_initADC0WithOutDMA (void);
    void VJ_initADC1WithOutDMA (void);
    void VJ_initADC0WithDMA (void);
    void VJ_initADC1WithOutDMA (void);
    void VJ_initTimer2ForADC (uint32_t ui32SysClkFreq);
    void ISR_Timer2 (void);
    void ISR_Adc1Sequencer1 (void);
    void ISR_Adc1Sequencer0 (void);
    void ISR_Adc0Sequencer1 (void);
    void ISR_Adc0Sequencer0 (void);
    void VJ_initDMATransForADC1SS1 (void);
    void VJ_initDMATransForADC1SS0 (void);
    void VJ_initDMATForADC0SS1 (void);
    void VJ_initDMATransForADC0SS0 (void);
    void SWI_Adc0Sequencer0 (void);
    void SWI_Adc0Sequencer1 (void);
    void SWI_Adc1Sequencer0 (void);
    void SWI_Adc1Sequencer1 (void);
    void VJ_initMemoryForDma (void);
    
    /*调试变量*/
    uint32_t TIMER2=0、ADC0SEQUENCER0=0、ADC0SEQUENCER1=0、ADC1SEQUENCER0=0、ADC1SEQUENCER1=0、 ui32Mode=0、
    ADC0Sequencer0SWI=0、ADC0Sequencer1SWI=0、ADC0Sequencer0SWI_A=0、ADC0Sequencer0SWI_B=0、ADC0Sequencer1SWI_A=0、ADC0Sequencer1SWI_B=0、ADC0Sequencer1SWI_B=0、
    ADC1Sequencer0SWI=0、ADC1Sequencer1SWI=0、ADC1Sequencer0SWI_A=0、ADC1Sequencer0SWI_B=0、ADC1Sequencer1SWI_A=0、ADC1Sequencer1SWI_B=0、ADC1Sequencer1SWI_B=0、
    DebugPrint=0 ,DmaErrors=0;
    /* DMA Memory */*
    
    首先分配所需的全部内存,因此内存将位于单个块
    中* Sequencer0写入 VJDMATRANSFERSIZE_SS0 项至内存
    * Sequencer1将 VJDMATRANSFERSIZE_SS0/4=VJDMATRANSFERSIZE_SS1项写入内存
    *对于每个 ADC,有1个 Sequencer0和1个 Sequencer1,都有 A 和 B 缓冲
    区*因此所需的数组长度等于:ADC0Sequencer0_A_DMRASIZ0
    * +ADC0Sequencer0_B_Buffer->VJDMATRANSFERSIZE_SS0
    * +ADC1Sequencer0_A_Buffer->VJDMATRANSFERSIZE_SS0
    * +ADC1Sequencer0_B_Buffer->VJDMATRANSFERSIZE_SS0
    * +ADC0Sequencer1_A_Buffer->VJDMATRANSFERSIZE_SS1
    * +ADC0Sequencer1_B_Buffer->VJDMATRANSFERSIZE_SS1
    * +ADC1Sequencer1_A_Buffer->VJDMATRANSFERSIZE_SS1
    * +ADC1Sequencer1_B_Buffer->VJDMATRANSFERSIZE_SS1
    * ------------------------
    * =4*VJDMATRANSFERSIZE_SS0+4*VJDMATRANSFERSIZE_SS1
    */
    uint16_t * p_U16_A_Memory、* p_U16_B_Memory、* p_U16_ADC0_Ss0_UDMA_A、* p_U16_ADC1_A、* p_U16_ADC0_ADDC1_A
    *p_U16_ADC0_SS1_UDMA_A、*p_U16_ADC1_SS1_UDMA_A、*p_U16_ADC0_Ss0_UDMA_B、*p_U16_ADC1_Ss0_UDMA_B、
    *p_U16_ADC0_SS1_UDMA_B、*p_U16_ADC1_SS1_UDMA_B;
    #pragma DATA_ALIGN (p_U16_AB_Memory、4)
    uint16_t p_U16_AB_Memory[4*VJDMATNSFERZE_SS0+VINIT_VSDK_4) uint16_t p_U16_AB_Memory_VSDK_VSDK_4
    
    ;void VDMRANT1 (VSDRANSD_SSEMANZE_SSEM_SS_4
    
    /*
    *将整个内存块拆分为2个:P_U16_A_Memory->A_Buffer,长度为2*VJDMATRANSFERSIZE_SS0+2*VJDMATRANSFERSIZE_SS1
    * P_U16_B_Memory->B_Buffer of length 2*VJDMATRANSFERSIZE_SS0+2*VJDMATRANSFERSIZE_SS1
    *
    P_U16_A_Memory=&(p_U16_AB_Memory[0]);
    P_U16_B_Memory=&p_U16_AB_Memory[2*VJDMATRANSFERSIZE_SS0+2*VJDMATRANSFERSIZE_SS1];
    /*
    *将 A_Buffer 拆分为4个存储器:P_U16_ADC0_Ss0_UDMA_A->A_Buffer for Adc0Sequencer0 of length VJDMATRANSFERSIZE_SS0
    * P_U16_ADC1_Ss0_UDMA_->A_Buffer for Adc1Sequencer0 of length VJDMATRANSFERSIZE_SS0
    * P_U16_ADC0_SS1_UDMA_>Adc0Sequencer1的 A_Buffer,长度为 VJDMATRANSFERSIZE_SS1
    * P_U16_ADC1_SS1_UDMA_>ADC1用于长度为 VJDMATRANSFERSIZE_SS1的 Adc1序列发生器1的 A_Buffer
    *
    P_U16_ADC0_Ss0_UDMA_A&&(p_U16_A_Memory[0]);
    P_U16_ADC1_Ss0_UDMA_A&&(p_U16_A_Memory[VJDMATRANSFERSIZE_SS0]);
    P_U16_ADC0_SS1_UDMA_A&&(p_U16_A_Memory[2*VJDMATRANSFERSIZE_SS0]);
    P_U16_ADC1_SS1_UDMA_A&&(p_U16_A_Memory[2*VJDMATRANSFERSIZE_SS0+VJDMATRANSFERSIZE_SS1]);
    /*
    *将 B_Buffer 拆分为4个存储器:P_U16_ADC0_Ss0_UDMA_B->B_Buffer for Adc0Sequencer0 of length VJDMATRANSFERSIZE_SS0
    * P_U16_ADC1_Ss0_UDMA_B->B_Buffer for Adc1Sequencer0 of length VJDMATRANSFERSIZE_SS0
    * P_U16_ADC0_SS1_UDMA_B->B_Buffer for Adc0Sequencer1 of length VJDMATRANSFERSIZE_SS1
    * P_U16_ADC1_SS1_UDMA_B->B_Buffer for Adc1 Sequencer1 of length VJDMATRANSFERSIZE_SS1
    *
    P_U16_ADC0_Ss0_UDMA_B=&(p_U16_B_Memory[0]);
    P_U16_ADC1_Ss0_UDMA_B=&(p_U16_B_Memory[VJDMATRANSFERSIZE_SS0]);
    P_U16_ADC0_SS1_UDMA_B=&(p_U16_B_Memory[2*VJDMATRANSFERSIZE_SS0]);
    P_U16_ADC1_SS1_UDMA_B=&(p_U16_B_Memory[2*VJDMATRANSFERSIZE_SS0+VJDMATRANSFERSIZE_SS1]);
    }
    
    
    
    
    // VJ_initAnalogInputs:将所有20个所需引脚放置到模拟引脚
    * | 0 | 1 | 2. | 3. | 4. | 5. | 6. | 7
    *端口 E:Pin0->AIN0,Pin1->AIN1,PIN2->AIN2,Pin3->AIN3,Pin4->AIN8, Pin5->AIN9
    *端口 D:Pin0->AIN15,Pin1->AIN14,PIN2->AIN13,Pin3->AIN12,Pin4->AIN7, Pin5->AIN6、Pin6->AIN5、PIN7->AIN4
    *端口 K:Pin0->AIN16、Pin1->AIN17、PIN2->AIN18、Pin3->AIN19
    *端口 B: PIN4->AIN12、Pin5->AIN13
    */
    void VJ_initAnalogInputs(void)
    {
    
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOE))
    {}
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOD))
    {}
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOK))
    {}
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB))
    {}
    //将端口 E 引脚0到5设置为 AIN0到 AIN3以及 AIN8和 AIN9的模拟输入
    GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4|GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_5);
    //将端口 D 引脚7、6、5、4、3、2、1、0设置为 AIN4、AIN5、AIN6、AIN7、AIN12、AIN13、AIN14、AIN15的模拟输入
    GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0);
    //将端口 K 引脚0、1、2、3设置为 AIN16、AIN17、AIN18、AIN19的模拟输入
    GPIOPinTypeADC (GPIO_PORTK_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
    //将端口 B 引脚4.5设置为 AIN12、AIN13的模拟输入
    GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
    }
    
    void VJ_initADC0WithOutDMA (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
    {}
    //将 ADC0的0序列发生器配置为由具有最高优先级的定时器触发
    //adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、1);
    
    //对 ADC0的序列发生器0进行采样以对 AIN0到 AIN7进行采样
    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_IE|ADC_CTL_END);
    //对 ADC0的序列发生器1进行采样以对 AIN8到 AIN9进行采样
    ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH8);
    ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH9|ADC_CTL_IE|ADC_CTL_END);
    
    ADCSequenceEnable (ADC0_BASE、0);//启用 ADC0的序列发生器0
    
    ADCSequenceEnable (ADC0_BASE、1);//启用 ADC0的序列发生器1
    
    ADCIntEnable (ADC0_BASE、0);
    ADCIntEnable (ADC0_BASE、1);
    
    IntEnable (INT_ADC0SS0);//启用 ADC0序列发生器0的中断
    
    IntEnable (INT_ADC0SS1);//启用 ADC0序列发生器1的中断
    
    }
    
    void VJ_initADC1WithOutDMA (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
    {}
    ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);
    //对 ADC1的序列发生器0进行采样以对 AIN10到 AIN17进行采样
    ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH10);
    ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH11);
    ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH12);
    ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH13);
    ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH14);
    ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH15);
    ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH16);
    ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH17|ADC_CTL_IE|ADC_CTL_END);
    //对 ADC1的序列发生器1对 AIN0到 AIN7进行采样
    ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH18);
    ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH19|ADC_CTL_IE|ADC_CTL_END);
    
    ADCSequenceEnable (ADC1_base、0);//启用 ADC1的序列发生器0
    
    ADCSequenceEnable (ADC1_base、1);//启用 ADC1的序列发生器0
    
    ADCIntEnable (ADC1_BASE、0);
    ADCIntEnable (ADC1_BASE、1);
    
    IntEnable (INT_ADC1SS0);//启用 ADC1序列发生器0的中断
    
    IntEnable (INT_ADC1SS1);//启用 ADC0序列1的中断
    }
    
    void VJ_initADC0WithDMA (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
    {}
    //将 ADC0的0序列发生器配置为由具有最高优先级的定时器触发
    //adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
    ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_TIMER、1);
    
    //对 ADC0的序列发生器0进行采样以对 AIN0到 AIN7进行采样
    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_IE|ADC_CTL_END);
    //对 ADC0的序列发生器1进行采样以对 AIN8到 AIN9进行采样
    ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH8);
    ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH9|ADC_CTL_IE|ADC_CTL_END);
    //启用 ADC 以生成 DMA 传输请求
    //启用 ADC0Sequencer0以请求 DMA 传输
    ADCSequenceDMAEnable (ADC0_BASE、0);
    //启用 ADC0Sequencer1以请求 DMA 传输
    ADCSequenceDMAEnable (ADC0_BASE、1);
    
    ADCSequenceEnable (ADC0_BASE、0);//启用 ADC0的序列发生器0
    
    ADCSequenceEnable (ADC0_BASE、1);//启用 ADC0的序列发生器1
    
    ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);//在 ADC0中启用特定序列发生器0中断
    
    ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS1);//在 ADC0中启用特定序列1中断
    }
    
    void VJ_initADC1WithDMA (void)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_ADC1);
    
    while (!SysCtlPeripheralReady (SYSCTL_Periph_ADC1))
    {}
    //将 ADC1的0序列发生器配置为由具有最高优先级的定时器触发
    //adc_adress | Sequencer_Number|Trigger_source|Priority 需要介于0至3、0最高优先级;3最低优先级
    ADCSequenceConfigure (ADC1_base、0、ADC_TRIGGER_TIMER、0);
    ADCSequenceConfigure (ADC1_base、1、ADC_TRIGGER_TIMER、1);
    //对 ADC1的序列发生器0进行采样以对 AIN10到 AIN17进行采样
    ADCSequenceStepConfigure (ADC1_base、0、0、ADC_CTL_CH10);
    ADCSequenceStepConfigure (ADC1_base、0、1、ADC_CTL_CH11);
    ADCSequenceStepConfigure (ADC1_base、0、2、ADC_CTL_CH12);
    ADCSequenceStepConfigure (ADC1_base、0、3、ADC_CTL_CH13);
    ADCSequenceStepConfigure (ADC1_base、0、4、ADC_CTL_CH14);
    ADCSequenceStepConfigure (ADC1_base、0、5、ADC_CTL_CH15);
    ADCSequenceStepConfigure (ADC1_base、0、6、ADC_CTL_CH16);
    ADCSequenceStepConfigure (ADC1_base、0、7、ADC_CTL_CH17|ADC_CTL_IE|ADC_CTL_END);
    //对 ADC1的序列发生器1对 AIN0到 AIN7进行采样
    ADCSequenceStepConfigure (ADC1_BASE、1、0、ADC_CTL_CH18);
    ADCSequenceStepConfigure (ADC1_BASE、1、1、ADC_CTL_CH19|ADC_CTL_IE|ADC_CTL_END);
    
    //启用 ADC1Sequencer0以请求 DMA 传输
    ADCSequenceDMAEnable (ADC1_BASE、0);
    //启用 ADC1Sequencer1以请求 DMA 传输
    ADCSequenceDMAEnable (ADC1_BASE、1);
    
    ADCSequenceEnable (ADC1_base、0);//启用 ADC1的序列发生器0
    
    ADCSequenceEnable (ADC1_base、1);//启用 ADC1的序列发生器0
    
    ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS0);//在 ADC1中启用特定序列0中断
    
    ADCIntEnableEx (ADC1_base、ADC_INT_DMA_SS1);//在 ADC1
    中启用特定序列1中断}
    
    void VJ_initDMATransForADC1SS1 (void)
    {
    uint8_t *检查表=0xFFFFFFFF;
    while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
    {}
    CheckTable=uDMAControlBaseGet ();
    if (CheckTable=0|CheckTable=0xFFFFFFFF)
    {
    while (1)
    {}
    }
    uDMAChannelAssign (UDMA_CH25_ADC1_1);//DMAChannel 25由 ADC1序列发生器1使用
    //禁用通道14、15、24、25的所有通道属性
    uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_ALL);
    /*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
    *将通道14和24的优先级设置为高,通道15和25将保持默认优先级
    *多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
    *Priority-List:0=最重要,3=最不重要
    *-0。 通道14
    *- 1. 通道15
    *- 2. 通道24
    *- 3. 通道25
    *
    uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC11、UDMA_ATTR_USEBURST);
    /*设置通道14、15、24、25的主控制结构体
    *一个传输项目是16位->UDMA_SIZE_16
    *源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
    *目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
    *如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
    *因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
    *
    uDMAChannelControlSet (uDMA_SEC_CHANNEL_ADC11|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);
    /*为通道14、15、24、25设置替代控制结构
    *与主设置相同
    *
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC11|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_2);
    /*将第二个主要传输功能设置为活动状态 ->| UDMA_ALT_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> ping 缓冲器第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、P_U16_ADC1_SS1_UDMA_B、VJDMATRANSFERSIZE_SS1);
    /*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> ping 缓冲器第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、p_U16_ADC1_SS1_UDMA_A、VJDMATRANSFERSIZE_SS1);
    /* 激活频道
    * 第一个传输使用主控制结构体
    *
    uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
    }
    
    void VJ_initDMATransForADC1SS0 (void)
    {
    uint8_t *检查表=0xFFFFFFFF;
    while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
    {}
    CheckTable=uDMAControlBaseGet ();
    if (CheckTable=0|CheckTable=0xFFFFFFFF)
    {
    while (1)
    {}
    }
    uDMAChannelAssign (UDMA_CH24_ADC1_0);//DMAChannel 24由 ADC1 Sequencer0使用
    //禁用通道14、15、24、25的所有通道属性
    uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_ALL);
    /*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
    *将通道14和24的优先级设置为高,通道15和25将保持默认优先级
    *多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
    *Priority-List:0=最重要,3=最不重要
    *-0。 通道14
    *- 1. 通道15
    *- 2. 通道24
    *- 3. 通道25
    *
    uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_ADC10、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
    /*设置通道14、15、24、25的主控制结构体
    *一个传输项目是16位->UDMA_SIZE_16
    *源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
    *目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
    *如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
    *因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
    *
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_PRI_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
    /*为通道14、15、24、25设置替代控制结构
    *与主设置相同
    *
    uDMAChannelControlSet (UDMA_SEC_CHANNEL_ADC10|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_None|UDMA_DST_INC_16|UDMA_ARB_4);
    /*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> ping 缓冲器第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、p_U16_ADC1_Ss0_UDMA_A、VJDMATRANSFERSIZE _SS0);
    /*首先设置备用传输函数激活->| UDMA_ALT_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> pong buffers 第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、P_U16_ADC1_Ss0_UDMA_B、VJDMATRANSFERSIZE _SS0);
    /* 激活频道
    * 第一个传输使用主控制结构体
    *
    uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);
    
    }
    
    void VJ_initDMATransForADC0SS1 (void)
    {
    uint8_t *检查表=0xFFFFFFFF;
    while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
    {}
    CheckTable=uDMAControlBaseGet ();
    if (CheckTable=0|CheckTable=0xFFFFFFFF)
    {
    while (1)
    {}
    }
    uDMAChannelAssign (UDMA_CH15_ADC0_1);//DMAChannel 15由 ADC0 Sequencer1使用
    //禁用通道14、15、24、25的所有通道属性
    uDMAChannelAttributeDisable (UDMA_CHANGE_ADC1、UDMA_ATTR_ALL);
    /*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
    *将通道14和24的优先级设置为高,通道15和25将保持默认优先级
    *多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
    *Priority-List:0=最重要,3=最不重要
    *-0。 通道14
    *- 1. 通道15
    *- 2. 通道24
    *- 3. 通道25
    *
    uDMAChannelAttributeEnable (UDMA_CHANGE_ADC1、UDMA_ATTR_USEBURST);
    /*设置通道14、15、24、25的主控制结构体
    *一个传输项目是16位->UDMA_SIZE_16
    *源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
    *目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
    *如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
    *因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
    *
    uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_2);
    /*为通道14、15、24、25设置替代控制结构
    *与主设置相同
    *
    uDMAChannelControlSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_2);
    /*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> ping 缓冲器第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_CHANNE_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、p_U16_ADC0_SS1_UDMA_A、VJDMATRANSFERSIZE_SS1);
    /*首先设置备用传输函数激活->| UDMA_ALT_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> pong buffers 第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、p_U16_ADC0_SS1_UDMA_B、VJDMATRANSFERSIZE);
    /* 激活频道
    * 第一个传输使用主控制结构体
    *
    uDMAChannelEnable (UDMA_CHANGE_ADC1);
    
    }
    
    void VJ_initDMATransForADC0SS0 (void)
    {
    uint8_t *检查表=0xFFFFFFFF;
    while (!SysCtlPeripheralReady (SYSCTL_Periph_UDMA))
    {}
    CheckTable=uDMAControlBaseGet ();
    if (CheckTable=0|CheckTable=0xFFFFFFFF)
    {
    while (1)
    {}
    
    }
    uDMAChannelAssign (UDMA_CH14_ADC0_0);//DMAChannel 14由 ADC0 Sequencer0使用
    //禁用通道14的所有通道属性
    uDMAChannelAttributeDisable (UDMA_CHANGE_ADC0、UDMA_ATTR_ALL);//TODO:禁用调试突发通道
    /*启用通道14、15、24、25突发模式->只有突发模式将由 DMA 处理
    *将通道14和24的优先级设置为高,通道15和25将保持默认优先级
    *多个通道请求 DMA 时的执行顺序取决于通道编号和优先级设置,通道编号越小越重要
    *Priority-List:0=最重要,3=最不重要
    *-0。 通道14
    *- 1. 通道15
    *- 2. 通道24
    *- 3. 通道25
    *
    uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST|UDMA_ATTR_HIGH_PRIOR]);
    /*设置通道14、15、24、25的主控制结构体
    *一个传输项目是16位->UDMA_SIZE_16
    *源是 ADC 序列发生器的 FIFO,从 FIFO 中读取一个值后,该值被弹出->UDMA_SRC_INC_NONE
    *目标数组是 uint16数组。 每个单元格为16位->UDMA_dst_INC_16
    *如果 FIFO 为半满、则请求 DMA 传输;对于序列发生器0、则在4个采样后进行;对于序列发生器1、则在2个采样后进行
    *因此、如果较高优先级的通道请求传输、则 DMA 应始终在一次突发后重新上腔->序列发生器0的 UDMA_ARB_4、序列发生器1的 UDMA_ARB_2
    *
    uDMAChannelControlSet (UDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_SIZE _16|UDMA_SRC_INC_None|UDMA_DST_ARC_16|UDMA_INC_4);
    /*为通道14、15、24、25设置替代控制结构
    *与主设置相同
    *
    uDMAChannelControlSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_SIZE_16|UDMA_SRC_INC_NONE|UDMA_DST_ARC_16|UDMA_INC_4);
    /*将第二个主要传输功能设置为活动状态 ->| UDMA_PRI_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> ping 缓冲器第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、p_U16_ADC0_Ss0_UDMA_A、VJDMATRANSFERSIZE_SS0);
    /*首先设置备用传输函数激活->| UDMA_ALT_SELECT
    *乒乓传输 -> UDMA_MODE_PINGONG
    *源地址 -> FIFO 地址:删除硬编码地址
    *目的地地址 -> pong buffers 第一个元素的地址
    *项目数(16位) -> 1024 (这是最大值!)
    *
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、p_U16_ADC0_Ss0_UDMA_B、VJDMATRANSFERSIZE_SS0);
    /* 激活频道
    * 第一个传输使用主控制结构体
    *
    uDMAChannelEnable (UDMA_CHANGE_ADC0);
    
    }
    
    void VJ_initTimer2ForADC (uint32_t ui32SysClkFreq)
    {
    SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER2))
    {
    
    }
    uint32_t ui32Period = ui32SysClkFreq/VJADCINGLECHANNELRATE;
    TimerConfigure (TIMER2_base、TIMER_CFG_PERIODICURE);//将 timer2配置为周期计时器
    TimerLoadSet (TIMER2_base、TIMER_A、ui32Period-1);//将计算出的节拍数加载到 timer0中
    TimerControlTrigger (TIMER2_base、TIMER_A、true);//启用 timer2来触发 ADC
    TimerIntEnable (TIMER2_base、TIMER_TIMA_TIMEOUT);//在 timer0中启用特定中断
    TimerEnable (TIMER2_base、timer_A);
    }
    
    void ISR_Adc0Sequencer0 (void)
    {
    ADCIntClear (ADC0_BASE、0);//TODO:欠流和过流检查
    ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);
    Swi_post (Adc0Sequencer0);
    ADC0SEQUENCER0++;
    }
    
    void ISR_Adc0Sequencer1 (void)
    {
    ADCIntClear (ADC0_BASE、1);//TODO:欠流和过流检查
    ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS1);
    Swi_post (Adc0Sequencer1);
    ADC0SEQUENCER1++;
    }
    
    void ISR_Adc1Sequencer0 (void)
    {
    ADCIntClear (ADC1_BASE、0);//TODO:欠流和过流检查
    ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS0);
    Swi_post (Adc1Sequencer0);
    ADC1SEQUENCER0++;
    }
    
    void ISR_Adc1Sequencer1 (void)
    {
    ADCIntClear (ADC1_BASE、1);//TODO:欠流和过流检查
    ADCIntClearEx (ADC1_BASE、ADC_INT_DMA_SS1);
    Swi_post (Adc1Sequencer1);
    ADC1SEQUENCER1++;
    }
    
    void ISR_Timer2 (void)
    {
    //清除计时器中断
    TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);
    TIMER2++;
    DebugPrint=(TIMER2%(VJNUMOFSAMPLEPERTRANSFER));
    开关(DebugPrint)
    {
    情况0:
    LOG_info5 ("HWI !!! Timer2:[%u]| Adc0Sequencer0:[%u]| Adc0Sequencer1:[%u]| Adc1Sequencer0:[%u]| Adc1Sequencer1:[%u]"、TIMER2、ADC0SequEN0、ADC0SEQUENCER 1、ADC1CEREN0;ADC1SEQUENCER
    中断;
    案例1:
    log_info5 ("swi !!! Timer2:[%u]| Adc0Sequencer0_A:[%u]| Adc0Sequencer1_A:[%u]| Adc1Sequencer0_A:[%u]| Adc1Sequencer1_A:[%u]"、TIMER2、ADC0Sequencer0SWI_A、ADC1Sequencer1SWI_A、ADC1Sequencer1_A、ADC1Swi_A、ADC1Sequencer1SW1SW1SW1SW1I、ADC1SequencerA)
    中断;
    案例2:
    log_info5 ("swi !!! Timer2:[%u]| Adc0Sequencer0_B:[%u]| Adc0Sequencer1_B:[%u]| Adc1Sequencer0_B:[%u]| Adc1Sequencer1_B:[%u]"、TIMER2、ADC0Sequencer0SWI_B、ADC1Sequencer1b、ADC1Swi_B、ADC1Sequencer1b)
    中断;
    案例3:
    log_info5 ("DMA 启用!!!! Timer2:[%u]| Adc0Sequencer0:[%u]| Adc0Sequencer1:[%u]| Adc1Sequencer0:[%u]| Adc1Sequencer1:[%u]"、TIMER2、ADC0Sequencer0I、ADC0Sequencer1SWI、ADC1Sequencer1SWI、ADC1Sequencer1)
    中断;
    }
    }
    
    void SWI_Adc0Sequencer0 (void)
    {
    
    if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC0))
    {
    uDMAChannelEnable (UDMA_CHANGE_ADC0);
    ADC0Sequencer0SWI++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_PRI_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038048、p_U16_ADC0_Ss0_UDMA_A、VJDMATRANSFERSIZE_SS0);
    ADC0Sequencer0SWI_A++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC0|UDMA_ALT_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC0|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038048、p_U16_ADC0_Ss0_UDMA_B、VJDMATRANSFERSIZE_SS0);
    ADC0Sequencer0SWI_B++;
    }
    }
    
    void SWI_Adc0Sequencer1 (void)
    {
    if (!uDMAChannelIsEnabled (UDMA_CHANGE_ADC1)
    ){
    uDMAChannelEnable (UDMA_CHANGE_ADC1);
    ADC0Sequencer1SWi++;
    }
    ui32Mode=uDMAChannelModeGet (uDMA_CHANGE_ADC1|UDMA_PRI_SELECT);
    if (ui32Mode=uDMA_MODE_STOP)
    {
    uDMAChannelTransferSet (uDMA_CHANNE_ADC1|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40038068、p_U16_ADC0_SS1_UDMA_A、VJDMATRANSFERSIZE_SS1);
    ADC0Sequencer1SWI_A+;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_CHANGE_ADC1|UDMA_ALT_SELECT);
    if (ui32Mode=UDMA_MODE_STOP)
    {
    uDMAChannelTransferSet (uDMA_CHANNEL_ADC1|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40038068、p_U16_ADC0_SS1_UDMA_B、VJDMATRANSFERSIZE);
    ADC0Sequencer1SWI_B++;
    }
    
    
    void SWI_Adc1Sequencer0 (void)
    {
    if (!uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC10))
    {
    uDMAChannelEnable (UDMA_SEC_CHANGE_ADC10);
    ADC1Sequencer0SWi++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_PRI_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (uDMA_SEC_CHANNE_ADC10|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039048、p_U16_ADC1_Ss0_UDMA_A、VJDMATRANSFERSIZE _SS0);
    ADC1Sequencer0SWI_A++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC10|UDMA_ALT_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC10|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039048、P_U16_ADC1_Ss0_UDMA_B、VJDMATRANSFERSIZE _SS0);
    ADC1Sequencer0SWI_B++;
    }
    }
    
    void SWI_Adc1Sequencer1 (void)
    {
    if (!uDMAChannelIsEnabled (UDMA_SEC_CHANGE_ADC11))
    {
    uDMAChannelEnable (UDMA_SEC_CHANGE_ADC11);
    ADC1Sequencer1SWI++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_PRI_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (uDMA_SEC_CHANNE_ADC11|UDMA_PRI_SELECT、UDMA_MODE_PINGONG、0x40039068、p_U16_ADC1_SS1_UDMA_A、VJDMATRANSFERSIZE_SS1);
    ADC1Sequencer1SWI_A++;
    }
    ui32Mode=uDMAChannelModeGet (UDMA_SEC_CHANGE_ADC11|UDMA_ALT_SELECT);
    if (ui32Mode=udma_mode_stop)
    {
    uDMAChannelTransferSet (UDMA_SEC_CHANNE_ADC11|UDMA_ALT_SELECT、UDMA_MODE_PINGONG、0x40039068、P_U16_ADC1_SS1_UDMA_B、VJDMATRANSFERSIZE_SS1);
    ADC1Sequencer1SWI_B++;
    }
    }
    
    /*
    === main ====
    */
    int main (void)
    {
    uint32_t ui32SysClkFreq = SysCtlClockFreqSet (((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、VJSYSFRQ);
    /*呼叫板初始化函数*/
    vj_initMemoryFordma();
    Board_initGeneral();
    EK_TM4C129EXL_initDMA ();
    // Board_initEMAC();
    Board_initGPIO();
    // Board_initI2C();
    // Board_initSDSPI();
    // Board_initSPI ();
    // Board_initUART ();
    // Board_initUSB (Board_USBDEVICE);
    // Board_initUSBMSCHFatFs();
    // Board_initWatchdog();
    // Board_initWiFi ();
    vj_initAnalogInputs();
    vj_initADC0WithDMA();
    //vj_initADC0WithOutDMA();
    vj_initDMATransForADC0SS0();
    vj_initDMATransForADC0SS1 ();
    //vj_initADC1WithOutDMA();
    vj_initADC1WithDMA();
    vj_initDMATransForADC1SS0();
    vj_initDMATransForADC1SS1();
    vj_initTimer2ForADC (ui32SysClkFreq);
    
    /*启动 BIOS */
    BIOS_start();
    
    返回(0);
    }
    

    所以问题本身已经解决了、但我仍然不明白为什么需要以这种方式构建存储器。 您能给我一点见解吗?这样我以后就可以避免这类问题了。

    大家好

    Richard

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

    [引用 user="Richard Linsspaeter">问题本身已经解决了,但我仍然不明白为什么内存需要这样构建。 您能不能给我提供这方面的任何见解、这样我就可以避免将来出现此类问题?[/引述]

    您好 Richard、

    我们没有发现使用 SPI DMA 进行大小1024传输时出现任何错误或问题。  实际上、最近的增强允许传输大小大于1024、这是通过执行一系列1024大小(最大值)的传输来实现的。

    您使用的是 TI-RTOS 的哪个版本?

    您对缓冲区分配/放置所做的更改会导致缓冲区从交错式 SS0和 SS1缓冲区更改为所有 SS0缓冲区、然后是所有 SS1缓冲区。  我只是指出这一点、因为这是工作与不工作之间的唯一区别、可能与问题有关。

    您提到您的"调试"ISR 和 SWI 计数器不符合您的预期。  您期望什么?您看到了什么?

    您没有真正提到在非工作情况下会发生什么情况。  在不起作用的情况下会发生什么情况?

    此致、

    - Rob

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

    Rob、您好!

    感谢你的答复。 我将 TI-RTOS 用于 TivaC 2.16.0.08。

    [引用用户="Robert Tivy"]

    您对缓冲区分配/放置所做的更改会导致缓冲区从交错式 SS0和 SS1缓冲区更改为所有 SS0缓冲区、然后是所有 SS1缓冲区。  我只是指出这一点、因为这是工作与不工作之间的唯一区别、可能与问题有关。

    [/报价]

    我不认为这是问题、因为在我现在运行的程序中、它们再次交错、但是4个 DMA 传输所使用的所有8个存储器 都是连续的。 我研究了未运行示例、唯一的区别 是链接器不会按顺序放置8个存储器。

    我猜这与问题有关。

    [引用用户="Robert Tivy"]

    您提到您的"调试"ISR 和 SWI 计数器不符合您的预期。  您期望什么?您看到了什么?

    [/报价]

    我希望 TIMER2 ISR (计数变量 TIMER2)的调用频率比 ADC 序列发生器 ISR (ADC1SEQUENCER1例如计数变量)的调用频率高1024倍。 更重要的是、我期望 ADC 序列发生器的 SWI 的调用频率与 ADC 序列发生器 ISR 的调用频率一样。 在我期望的 SWI 中,不应禁用相应的 DMA (计数变量ADC1Sequencer0SWI),因为主结构和替代结构应该切换。 在 SWI 中,我希望缓冲区 A (计数变量ADC1Sequencer0SWI_A)的传输会像调用序列发生器的 ISR 那样被重新启用一半,这同样适用于缓冲区 B (计数变量ADC1Sequencer0SWI_B)的传输。 我希望所有 ADC 序列发生器的这些值都是相同的。 如果我对我的期望有误、请告诉我。 现在、我的程序正在正确运行、这正是我看到的。

    [引用用户="Robert Tivy"]

    您没有真正提到在非工作情况下会发生什么情况。  在不起作用的情况下会发生什么情况?

    [/报价]

    我在之前的帖子中尝试了描述:)我将再次尝试、但实际上很难描述错误行为、因为从我的角度来看、它背后似乎没有确定性。

    在错误情况下、几乎只调用 ADC0Sequencer0和 ADC0Sequencer1的 ISR。 (它们的计数变量远高于其他的计数变量)有时、很少调用其他 ISR、它们对应的计数变量不为零。 对我来说、中断标志似乎没有被正确清除。 这对我来说没有太大意义、但这是我的最佳猜测。 我希望我能把事情弄清楚。

    [引用用户="Robert Tivy"]

    实际上、最近的增强允许传输大小大于1024、这是通过执行一系列1024大小(最大值)的传输来实现的。

    [/报价]

    这对我和我的程序来说听起来很有趣:)我想以与外设散聚模式相同的方式执行它。 连接多个传输。 您能否发布一个链接、以便我可以在其中找到有关增强功能的更多信息。 快速谷歌搜索没有向我显示任何有用的信息。

    此致、

    Richard

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

    [引用 user="Richard Linsspaeter">此外、我期望 ADC 序列发生器的 SWI 与 ADC 序列发生器 ISR 一样频繁地调用。 [/报价]

    你可能已经知道、但是为了确保、在 Swi 有机会运行之前、多个 Swi_post () s 到一个给定的 Swi 将导致 Swi 只运行一次、Swi_post () s 没有计数

    [引用用户="Richard Linsspaeter"]

    我不认为这是问题、因为在我现在运行的程序中、它们再次交错、但是4个 DMA 传输所使用的所有8个存储器 都是连续的。 我研究了未运行示例、唯一的区别 是链接器不会按顺序放置8个存储器。

    我猜这与问题有关。

    [/报价]

    看到这些分立式缓冲器在非工作情况下的放置可能会很有趣。  是否可以附加.map 文件?

    [引用用户="Richard Linsspaeter"]

    Robert Tivy

    实际上、最近的增强允许传输大小大于1024、这是通过执行一系列1024大小(最大值)的传输来实现的。

    这对我和我的程序来说听起来很有趣:)我想以与外设散聚模式相同的方式执行它。 连接多个传输。 您能否发布一个链接、以便我可以在其中找到有关增强功能的更多信息。 快速谷歌搜索没有向我显示任何有用的信息。

    [/报价]

    没有任何网页、至少在 TI 外部可见、也没有我可以找到的提及这一点的文档。  这只是为 Core SDK 3.x 添加的一项功能(Core SDK 是 TI-RTOS 的后续功能、我认为它在版本2.21.01.01停止)。  内核 SDK 3.x 包含对名为 MSP432E4的新"TIVA"器 件的支持、这意味着不会直接支持 Tiva 器件 EK-TM4C129EXL。

    如果您想看一看它、可以在中找到它:
    coresdk_msp432e4_3_60_01_00/source/ti/drivers/SPI/SPIMSP432E4DMA.c

    感谢您详细解释了应发生的情况、并解释了问题发生时观察到的情况。  我希望我能为您提供一些值得尝试或检查的东西、但我不是 SPI 专家。  我将尝试在 TI 内部找到可以进一步帮助您的人。

    此致、

    - Rob

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

    Rob、您好!

    感谢您提供有关增强型 DMA 传输大小的信息!

    [引用用户="Robert Tivy"]

    看到这些分立式缓冲器在非工作情况下的放置可能会很有趣。  是否可以附加.map 文件?

    [/报价]

    当然。 以下.map 文件是使用我在原始帖子中发布的源代码生成的。 (如果有人想尝试:只需创建一个空的 TI-RTOS 项目。 将 empty.c 文件替换为已发布的 c 源代码、将 empty.cfg 替换为已发布的 cfg 源代码。)

    给你:

    e2e.ti.com/.../TIRTOS_5F00_NonWorkingExample_5F00_DMATransfersize1024.txte2e.ti.com/.../TIRTOS_5F00_WorkingExample_5F00_DMATransfersize1016.txt

    唯一的区别是 DMA 传输大小(在已发布的.c 源代码行81:#define VJDMATRANSFERSIZE_SS0中)。 在运行示例中、define 设置为1016、在非运行示例中、它设置为1024。

    此致、

    Richard