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.

[参考译文] LAUNCHCC3220MODASF:CC3200 TI-RTOS ADC DMA 在采样率下连续中断问题

Guru**** 2595800 points


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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/682886/launchcc3220modasf-cc3200-ti-rtos-adc-dma-continuous-interrupts-at-the-sampling-rate-problem

器件型号: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 (&param);

/*设置 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、&param);
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、中断就会触发。  

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

    我注意到的一点是,在您首先设置 DMA 交替缓冲的 mainthread()中,您指定了16位地址增量,尽管数据大小为32位。 地址增量应等于或大于数据大小。 这是在 togledma()函数中正确设置的,因此这可能不是您看到问题的原因。

    我想说的另一点是,在 toggledma()函数中,当您重新设置 DMA 传输时,不会清除 ADC DMA 完成中断,只有在 ISR 未完成任何 DMA 传输的情况下才会清除。 另外,检查 DMA 传输是否完成的一种更好的方法是使用 MAP_uDMAChannelIsEnabled()函数。 如果 DMA 传输在传递给该函数的通道索引上完成、则将返回0。 尝试使用这些建议修改 ISR 函数、并查看程序是否更改了其行为。

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

    我假设您已经解决了 ADC DMA 问题、因为我没有听到您的反馈。 如果没有、请随时在此主题上发帖或打开有关问题的新主题。

    谢谢、
    Michael