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.

[参考译文] MSP430FR5994:ADC12始终处于忙状态

Guru**** 2582405 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/828817/msp430fr5994-adc12-always-busy

器件型号:MSP430FR5994

我总是会遇到 ADC12忙。 我希望 ADC12CONSEQ0 =  单通道、单次转换。  

我看到过类似这样的另一篇文章、但它没有解决我的问题。 以下是代码。  

#include 
#include 
/**
* main.c
*/

int AnalogRead (uint8_t channel);

void main (void){
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

for (;;){
int val = AnalogRead (ADC12INCH_5);//读取 A5
}
}


int AnalogRead (uint8_t channel)
{
/*配置 ADC 通道*/
ADC12CTL0 &=~ADC12ENC;//确保 ENC 为0,以便我们可以配置读取
ADC12CTL0 = ADC12SHT0_3 + ADC12ON + ADC12IE0;//64个时钟周期、ADC 开启、启用中断
ADC12CTL1 = ADC12SSEL_0;// ADC12OSC
ADC12MCTL0 =通道;//通道
ADC12CTL0 |= ADC12ENC + ADC12SC;//启用并开始转换
while (((ADC12BUSY & ADC12CTL1)=0x01);//等待转换结束
返回 ADC12MEM0;
}

// ADC12中断服务例程
#pragma vector=ADC12_vector
__interrupt void ADC12_ISR (void)
{
__BIC_SR_REGISTER_ON_EXIT (CPUOFF);//返回活动模式
} 

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

    您可能也应该设置 ADC12SHP。

    您正在启用 ADC12IE0、但 ISR 不会清除该条件(通过读取 ADC12MEM0)。 ADC 完成后、您将永远进入 ISR。 根据您的其余代码、我建议您完全不要使用 ADC12IE0。

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

    非常感谢。 以下是针对具有相同问题的任何其他人的更正代码。  

    #include 
    #include 
    /**
    * main.c
    */
    
    int AnalogRead (uint8_t channel);
    int val;
    
    void main (void){
    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
    
    for (;;){
    Val = AnalogRead (ADC12INCH_5);//读取 A5
    
    }
    }
    
    
    int AnalogRead (uint8_t channel)
    {
    /*配置 ADC 通道*/
    ADC12CTL0 &=~ADC12ENC;//确保 ENC 为0,以便我们可以配置读取
    ADC12CTL0 = ADC12SHT0_3 + ADC12ON;//64个时钟周期、ADC 开启、启用中断
    ADC12CTL1 = ADC12SSEL_0 | ADC12SHP_1;// ADC12OSC
    ADC12MCTL0 =通道;//通道
    ADC12CTL0 |= ADC12ENC + ADC12SC;//启用并开始转换
    while (((ADC12BUSY & ADC12CTL1)=0x01);//等待转换结束
    返回 ADC12MEM0;
    }