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.

[参考译文] MSP430F6779:MSP430F6779对多个模拟通道进行采样

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1245860/msp430f6779-msp430f6779-sample-multiple-analog-channels

器件型号:MSP430F6779

我将尝试获取多个模拟通道样片、如本文末尾所述 。https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1208935/msp430f6779-msp430f6779-measuring-voltage-of-pwm-signal

我尝试使用 DMA 示例代码修改我的代码、以便对多个模拟通道进行采样。 但是、DMA ISR 会触发、但代码永远不会进入 DMA ISR 中以粗体显示的 switch 语句中。 此外、我注释掉了 ADC ISR、并将代码放置在如下所示的 DMA ISR 中。   

/*准备 ADC10A 进行配置*/
ADC10CTL0 &=~ADC10ENC;
/*清除挂起的中断以确保 DMA 的触发*/
ADC10IFG = 0;

/* ADC 打开、ADC10等待来自 SD24的触发、采样时间2us 8xADCclk、自动下一个转换 */
ADC10CTL0 = ADC10SHT0 | ADC10ON | ADC10MSC;

/*由 SD24触发、SMCLK/6 = 4MHz、脉冲采样模式*/
ADC10CTL1 = ADC10SHP | ADC10SHS_2 | ADC10DIV_0 | ADC10SSEL_0 | ADC10CONSEQ_1;/*单通道、单次转换*/

/* 10位转换结果*/
ADC10CTL2 |= ADC10RES;

/*启用 ADC 转换完成中断*/
ADC10IE |= ADC10IE0;

/* A3 ADC 输入选择;Vref=AVCC */
ADC10MCTL0 |= ADC10INCH_3 | ADC10SREF_0;// A0、A1、A2、A3 (EOS)

/*启动 ADC 并等待软件启动转换触发器*/
ADC10CTL0 |= ADC10ENC;//+ ADC10SC;


//设置 DMA0 (ADC10IFG 触发)
DMACTL0 = DMA0TSEL_24;// ADC10IFG 触发器
DMA0SZ = 0x04;// 4次转换
_data20_write_long ((uintptr_t)&DMA0SA、(uintptr_t)&ADC10MEM0);//源单个地址
_data20_write_long ((uintptr_t)&DMA0DA、(uintptr_t)&ADC_result [0]);//目标数组地址
DMA0CTL = DMADT_4 | DMADSTINCR_3 | DMAEN | DMAIE;//重复单次传输、递增目的地、在转换序列后启用 int

#if defined (__TI_Compiler_version__)|| defined (__IAR_SYSTEMS_ICC__)
#pragma vector=dma_vector
__interrupt void DMA0_ISR (void)
#Elif 已定义(_ GNU _)
void __attribute__((interrupt (DMA_vector))) DMA0_ISR (void)
#else
#错误编译器不受支持!
#endif
{
开关(__even_in_range (DMAIV、16))
{
情况 DMAIV_NONE:break;//无中断
情况 DMAIV_DMA0IFG:// DMA0IFG = DMA 通道0
//转换序列完成
ADC10CTL0 &=~ADC10ENC;
ADC10CTL1 ^= ADC10ISSH;//切换 ISSH 以在每个周期提供触发(EQU0)
ADC10CTL0 |= ADC10ENC;
//_ bic_SR_register_on_exit (LPM0_bits);//在返回时退出 LPM0
中断;
情况 DMAIV_DMA1IFG:中止;// DMA1IFG = DMA 通道1
情况 DMAIV_DMA2IFG:break;// DMA2IFG = DMA 通道2
案例8:中断;//保留
案例10:中断;//保留
案例12:中断;//保留
案例14:中断;//保留
案例16:中断;//保留
默认值:中断;

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

    当您到达 switch ()语句时,DMAIV 中包含什么? [提示:使用 Registers 视图、因为它可以在不进行更改的情况下读取 IV 寄存器。]

    ----------------  

    >ADC10IE |= ADC10IE0;

    如果您使用的是 DMA、请勿设置 IE [参考用户指南(SLAU208Q)次级11.2.11]。

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

    超棒的布鲁斯!! 忘记禁用 ADC 中断了。  

    那么、我是否会在  DMAIV_DMA0IFG 的情况下存储 ADC 值? 换句话说、ADC 值在这个 DMA 中断中是否有效?