工具/软件: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