请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:LAUNCHCC3220MODASF 我在乒乓模式下使用 DMA 传输1024个样本、每个样本都有两个缓冲区。 程序工作正常、因为我可以看到缓冲区中填充了样本值。 我遇到的问题是 DMA 中断会以大约32us 的周期触发、而不是以大约16.32ms 的周期触发、即 ADC 的采样周期* 1024。 下面是我用来设置和处理中断的代码。 该中断由 TI-RTOS 作为在.cfg 文件中静态创建的 Hwi 进行管理。
unsigned int buffer[1024]={1、2、3、4、5、6、7、8、9、10};
unsigned int buffer1[1024];
unsigned int counter=0;
unsigned int counter1=0;
// ADC DMA 控制的标志
*
bit0:
* 0 -主通道处于活动状态
* 1 - al 通道处于活动
状态*
*位1:
* 0 -主缓冲区处理不完整
* 1 -主缓冲器处理完成
*位3:
* 0 -中断被禁用
* 1 -启用中断
*/
char flag=2;
/*
===== mainThread ====
//
void * mainThread (void * arg0)
{
UDMACC32XX_Handle UDMA;
adc_handle adcch2;
ADC_Params 参数;
ADC_Params_init (¶m);
/*设置 DMA 通道传输*/
UDMACC32XX_init();
uDMA=UDMACC32XX_open();
uDMAChannelAssign (UDMA_CH16_ADC_CH2);
uDMA_CHANNEL_CONFIGIN_and_START_TRANSFER (uDMA_CH16_ADC_CH2、UDMA_PRI_SELECT、UDMA_SIZE 32、UDMA_SRC_NOT_NONE、UDMA_DST_INC_16、UDMA_ARB_1、UDMA_MODE_PingODA*(void *)(adc_base_adc_FIFO_pong、通道4100*);
UDMA_CHANNEL_CONFIGURE (UDMA_CH16_ADC_CH2、UDMA_ALT_SELECT、UDMA_SIZE_32、UDMA_SRC_INC_NONE、UDMA_DST_ARC_16、UDMA_INC_1、UDMA_MODE_PINGONG、(void*)(ADC_BASE+ADC_O_O_O_O_LE4INC*)、通道1、100*(void);
/*设置 ADC 通道*/
adc_init();
adcch2=adc_open (CC3220SF_LAUNCHXL_ADC0、¶m);
ADCChannelDisable (ADC_base、ADC_CH_2);
ADCDMAEnable (ADC_base、ADC_CH_2);
ADCIntEnable (ADC_base、ADC_CH_2、ADC_DMA_DONE);
ADCChannelEnable (ADC_base、ADC_CH_2);
while (1){
;
}
}
void toggledma(){
//如果主通道之前处于活动状态,则重新加载主配置
计数器1++;
if ((flag & 0x01)==0){
UDMA_CHANNEL_CONFIGURE (UDMA_CH16_ADC_CH2、UDMA_PRI_SELECT、UDMA_SIZE 32、UDMA_SRC_INC_NONE、UDMA_DST_ARC_32、UDMA_INC_4、UDMA_MODE_PINGONG、(void*)(ADC_BASE+ADC_O_O_O_O_INC_EL41024、通道 FIFATA*);
//为激活的替代通道设置标志
FLAG = FLAG | 0x01;
//设置主缓冲器处理的标志
FLAG = FLAG & 0xFD;
//重新启用 DMA
MAP_uDMAChannelEnable (UDMA_CH16_ADC_CH2);
//主后缓冲区处理
返回;
}
//如果 ALT 通道处于活动状态且主缓冲区处理完成,请重新加载 ALT 配置
if ((flag & 0x01)= 1){
UDMA_CHANNEL_CONFIGURE (UDMA_CH16_ADC_CH2、UDMA_ALT_SELECT、UDMA_SIZE_32、UDMA_SRC_INC_NONE、UDMA_DST_ARC_32、UDMA_INC_4、UDMA_MODE_PINGONG、(void*)(ADC_BASE+ADC_O_O_O_O_LE41024)、通道 FIFO (1、1024)
//为主通道设置标志激活
flag= flag & 0xFE;
MAP_uDMAChannelEnable (UDMA_CH16_ADC_CH2);
返回;
}
FLAG = FLAG & 0xF7;
MAP_ADCIntClear (ADC_base、ADC_CH_2、ADC_DMA_DONE);
MAP_ADCIntDisable (ADC_base、ADC_CH_2、ADC_DMA_DONE);
}
int processbuffer(){
int i=0;
对于(i=0;i<100;i=i+4){
Buffer[i]=buffer[i]>2;
}
flag=flag|0x02;
ADCIntEnable (ADC_base、ADC_CH_2、ADC_DMA_DONE);
toggledma();
返回0;
}
我已经修改了这个程序、这样的话、swi 不再被布置、标志只关心当前激活的结构。
这是实时调试会话的一个片段。 因为您可以将中断触发器设置为大约32us。 根据我的理解、一旦通道计算器中要传输的数据项数为0、中断就会触发。