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.

[参考译文] Starterware/MSP430FR6972:DMA的问题

Guru**** 2536030 points
Other Parts Discussed in Thread: MSP430FR6972

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/580609/starterware-msp430fr6972-the-question-of-dma

部件号:MSP430FR6972

工具/软件:Starterware

您好,  

我 要使用DMA传输将ADC数据传输到FRAM。 ADC模式是 从 ADC12MCTL0到ADC12MCTL1的信道重复序列模式,ADC触发信号 为0.1。代码如下

//ADC12 (内部)触发器,0.1 PWM 8.192KHz,来自32.768kHz晶体振荡器
TA01_PWMOUT (4,2,tassel__ACLK);
//设置ADC信道引脚
ADC_PIN_SET();

ADC12CTL0 &=~ADC12CTL0;
ADC12C12L0和



STI ADC12L0;
~ADC12L0的上升信号和CA1;ADC12L0的C12L0;C12L0和CAB= CASP12的上升信号;
// ADC触发器0.1 ,ADC时钟为SMCLK
ADC12CTL1 |= ADC12SHS_1| ADC12PDIV__1| ADC12DIV_0| ADC12SSEL_3;
//通道重复序列
ADC12CTL1 |ADC12CONSE_3;
// ADC12CD_CASC1= ADC12CAF_12






//end Mem
ADC12MCTL1 |= ADC12EOS;

//DMA set
DMACTL0 |= DMA1TSEL__ADC12IFG;
__data16_write_addr ((unsigned short)&DMA1SA,(INT16U)&ADC12MEM1);
__data16_write_addr (((unsigned short)&DMA1DA,(INT16U)&ElectfieldBuffer[0]);	
DMA1SZ =5120;
DMA1CTL = DMADT_4 | DMADSTINCR_3 | DMASRCINCR_0 |DMASWDW |DMAEN;

"当CONSEQx ={1,3}时,序列中最后一个ADC12MEMx的ADC12IFG标志可以触发DMA传输。 ”(MSP430FR6972用户指南的第336页)。 我知道  只有ADC12MEM1的ADC12IFG可以触发DMA传输,但我发现它不是。 DMA浪费了625ms 来完成5120点。 但是,时间理论应该是(1/8.192KHz)*2*5120=1250ms 。1250。 为什么?

此致,

Jent

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

    可以是任何ADC12Config 触发器DMA传输。 我发现数组中的两个搜索值相同..

      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每122微秒传送5120个字(与转换序列的计时器相同的采样频率),我预计总时间为625毫秒,您能解释一下为什么您期望得到不同的结果吗? 使用转换序列时,序列中最后一个转换的ADC12IFG是DMA的触发器。 重复的数组值可能是偶然的,因为值没有显著变化,您能否提供更多数据来证明您的理论? 请同时确认您的计时器频率。

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

    谢谢你Ryan,

      我设置了序列 模式,每个传送带都必须由0.1 触发,因此A2将 在第一个122 miscroseconds转换,A3 将在第二个122 miscroseconds转换,然后A2将 在第三个122 miscroseconds转换。  总之 ,A2的采样时间为244 miscroseconds,A3与A2相同。       传输5120字需要5120 X 244 =1250毫秒。

      我 从MSP430FR6972设备错误表(第3页)中找到了原因,但我认为变通办法不符合我的要求。 我希望 A2和A3在 不使用中断的情况下连续存储在两个数组[5120]中。 你有好主意吗?

    最好的拉加德

    Jent

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您进一步解释您的应用Jent,我了解您现在要完成的任务,ADC43勘误表似乎详细介绍了您遇到的问题。 最简单的解决方案是使用单通道转换对一个输入采样5120次,然后切换到下一个输入并重复,但如果您需要同时对两个输入采样,则不起作用。 由于您必须在每次转换时触发,我的建议是使用两个DMA通道,这两个通道都使用相同的触发器,但其源和目标是不同的(ADCMEMM1到ElectfieldBuffer,ADCMEMM0到CurrentFaultBuffer)。 由于将有重复项(传输的每个样本中有2个),您必须将阵列大小加倍(1.024万)或中途停止(2560),清除额外数据,然后继续采样后半部分。 但是,一旦对所有数据进行了相应的组织,这仍需要一个额外的数组大小(7680),并且数组末尾有死空间(2560)。 最不利的替代方案是反复打断,根据需要安排信息。 我看到了几个选项,但无法确定解决您困境的完整方法。

    此致,
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您可以处理在单个大阵列中同时存储ADC12MEM0和ADC12MEM1值,则可能的解决方案是使用具有相同触发器但优先级较低的第二个DMA通道(并在重复的单传输模式下) 要更改ADC12MEM0和ADC12MEM1之间第一个通道的源地址,将导致1.024万字节的不间断传输(第一个样本A2,第一个样本A3,第二个样本A2,第二个样本A3等)

    此致,
    Ryan