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.

[参考译文] MSP430FR5739:ADC10B:重复通道序列转换

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601993/msp430fr5739-adc10b-repeat-sequence-of-channels-conversion

器件型号:MSP430FR5739

大家好、团队、

我对 通道的重复序列 ADC10B 有一些困惑。 当我们配置 ADC 的这种模式时、我们在每个通道转换或完整序列转换上都获得 ADC10IFG 标志设置吗? ADC10MEM0是单字结果电阻器、如何访问所有转换的结果? 请说明相同的内容。

我的要求是以重复序列模式对 ADC0和 ADC1通道进行采样。 我参考了一个示例、其中我们将传输相同通道的32个样本、并根据我的要求进行修改、如下所示:  

//
#include

int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT
//配置 SMCLK = 1MHz
CSCTL0_H = 0xA5;
CSCTL1 |= DCOFSEL0 + DCOFSEL1;//设置最大值 DCO 设置
CSCTL2 = SELA_1 + SELESS_3 + SELM_3;//设置 ACLK = VLO;MCLK = DCO
CSCTL3 = DIVA_0 + DIVS_3 + DIVM_3;//设置所有分频器

//配置 ADC10;
ADC10CTL0 = ADC10SHT_3 + ADC10MSC + ADC10ON;// 32ADCclks、ADC 打开
ADC10CTL1 = ADC10SHP + ADC10CONSEQ_3 + ADC10SSEL_3 + ADC10DIV_1;// SMCLK/2
//采样计时器,rpt 单通道
ADC10CTL2 = ADC10RES;// 10位分辨率
ADC10MCTL0 = ADC10INCH_1 + ADC10SREF_1;// Vref+、A10

//配置内部基准
while (REFCTL0 & REFGENBUSY);//如果基准发生器忙,请等待
REFCTL0 |= REFVSEL_3+REFON;//选择内部基准= 2.5V
//内部基准打开
_DELAY_CYCLES (75);//参考延迟(~75us)以实现稳定

//配置 DMA (ADC10IFG 触发器)
DMACTL0 = DMA0TSEL__ADC10IFG;// ADC10IFG 触发器
__data16_write_addr ((unsigned short)&DMA0SA、(unsigned short)&ADC10MEM0);
//源单个地址
__data16_write_addr ((unsigned short)&DMA0DA、(unsigned short) 0xC800);
//目标数组地址
DMA0SZ = 0x04;// 4次转换
DMA0CTL = DMADD_5 + DMADSTINCR_3 + DMAEN + DMAIE + DMALEVEL;
// rpt、inc dest、word access、
//在32次转换后启用 int

while (1)

while (ADC10CTL1 & BUSY);//如果 ADC10内核处于活动状态则等待
ADC10CTL0 |= ADC10ENC + ADC10SC;//开始采样
_bis_SR_register (CPUOFF + GIE);// LPM0、ADC10_ISR 将强制退出
__no_operation();//<<在此设置断点
__DELAY_CYCLES (5000);//转换之间的延迟

#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=dma_vector
_interrupt void DMA0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(DMA_vector)) DMA0_ISR (void)
其他
错误编译器不受支持!
#endif

switch (__evo_in_range (DMAIV、16))

情况0:中断;//无中断
案例2:
// 32次转换完成
ADC10CTL0 &=~ADC10ENC;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//退出 LPM
中断;// DMA0IFG
案例4:中断;// DMA1IFG
案例6:中断;// DMA2IFG
案例8:中断;//保留
案例10:中断;//保留
案例12:中断;//保留
案例14:中断;//保留
案例16:中断;//保留
默认值:break;

根据我的情况,我应该将 DMA0SZ 保留为0x2,因为我需要两个 ADC 通道数据,但当我保留它时,该程序通过 DMA 为我提供一个通道重复结果。 当我将其保持为0x04时,它会将两个通道结果作为重复的结果提供给我,即0xC800、0xC802上的通道1结果和 0xC804、0xC806上的通道0结果

请帮助我更正此示例...

此致、

Vikas Chola

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

    每次转换完成时 ADC10IFG0被置位、结果被存储到 ADC10MEM0中、因为你正在使用重复块传输模式、那么一个完整的时钟被一个触发器传输。 您将需要使用重复单次传输(DMADD_4)、以便每次传输都需要触发器。 请参阅 MSP430FR57xx_ADC10_10.c 并确保配置 ADC PxSEL 寄存器。 如果您计划切换 ADC10ENC 位、您也应该只使用通道序列模式(ADC10CONSEQ_1)。

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

    您好、Ryan、

    感谢您的回答。 因此、这意味着如果我不使用 DMA、ADC0和 ADC1的每次转换都会触发 ADC 中断、如果启用的话、我需要通过我的软件来处理 ADC 值... 对吧?

    此外、我还想知道我为什么要通过代码中的 DMA 传输获得重复的结果... 请指出我的错误、我也使用了 DMADD_4、但结果没有区别。

    此致、

    Vikas Chola

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    每个转换都会设置 ADC IFG、而不管 DMA 的使用情况如何、请参阅第16.2.7节以了解更多信息。 您应该能够使用 DMA 传输 ADC 值、而无需使用 ADC 中断。 我再次建议您验证 MSP430FR57xx_ADC10_10.c 操作、然后对其进行修改以供您自己使用。

    此致、
    Ryan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Ryan、
    它符合我的要求。 在浏览并比较我的现有程序后、我发现由于 DMALEVEL 位、我的结果在目标存储器上复制了两次。 我找不到同样的原因、请解释为什么会发生这种情况。 我的客户问题将在您的指导下得到解决。 感谢您的支持。

    此致、
    Vikas Chola
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请阅读用户指南的第7.2.3节、仅当选择 DMAE0外部触发器时、才应使用电平敏感触发器(DMALEVEL 置位)。 否则、边沿触发器(DMALEVEL 被清零)被用来启动传输。 每次转换获得两个 DMA 传输、因为在 DMA 完成第一个传输时 ADC10IFG 还没有复位、因此自从 DMALEVEL1被置位后、开始第二个传输。

    此致、
    Ryan