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.

[参考译文] MSP430G2553:为什么不在 LPM0模式下执行 ADC ISR?

Guru**** 2531310 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/624059/msp430g2553-why-the-adc-isr-is-not-executed-in-lpm0-mode

器件型号:MSP430G2553

您好!

我已将 GPIO P1.4配置为 ADC10 (A4)的输入、ADC10在 A4引脚上执行16次测量、的2.5V 内部电压 用作基准电压。 转换工作正常。 问题在于进入和退出 LPM0模式。 如果在 while 循环之前我们进入 LPM0模式(_bis_SR_register (LPM0 + GIE))、则 永远不会执行 ADC10 ISR。 为什么? 提前感谢。

#include 

int adc [16]={0};
int avgadc = 0;
volatile int conversionFlag = 0;

int main (void){

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
BCSCTL1 = CALBC1_1MHz;//设置范围
DCOCTL = CALDCO_1MHz;

ADC10CTL1 = CONSEQ_2 + INCH_4; //重复单通道,A4
ADC10CTL0 = SREF_1 + REF2_5V + REFON + ADC10SHT_1 + MSC + ADC10ON + ADC10IE;//采样保持时间+ ADC10打开+中断使能
ADC10DTC1 = 0x10; // 16次转换
ADC10AE0 |= BIT4; // P1.4 ADC 选项选择

ADC10CTL0 &=~ENC; //禁用转换
while (ADC10CTL1 & BUSY); //如果 ADC10忙则等待
ADC10SA =(int) ADC; //将数据传输到下一个数组
ADC10CTL0 |= ENC + ADC10SC; //启用并开始转换
_bis_SR_register (LPM0 + GIE);//低功耗模式0、ADC10_ISR

while (1){
if (conversionFlag){
avgADC =((ADC[0]+ADC[1]+ADC[2]+ADC[3]+ADC[4]+ADC[5]+ADC[6]+ADC[7]+)
ADC[8]+ADC[9]+ADC[10]+ADC[11]+ADC[12]+ADC[13]+ADC[14]+ADC[15])>> 4);

conversionFlag = 0;
_bis_SR_register (LPM0 + GIE);//低功耗模式0、ADC10_ISR
}
};
}

// ADC10中断服务例程
#pragma vector=ADC10_vector
__interrupt void ADC10_ISR (void)
{
conversionFlag = 1;
_BIC_SR_REGISTER_ON_EXIT (CPUOFF);
} 

此致、
弗兰·马丁。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >_bis_SR_register (LPM0 + GIE);//低功耗模式0、ADC10_ISR
    这不符合您的要求。 尝试:
    > _bis_SR_register (LPM0_bits + GIE);//低功耗模式0、ADC10_ISR