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.

[参考译文] MSP430FR2433:中断卡住、无法返回低功耗模式。

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/885394/msp430fr2433-interrupt-stuck-and-cannot-go-back-to-low-power-mode

器件型号:MSP430FR2433
大家好、我是 msp430fr2433的初学者、我为电路控制器制作了代码。 

MSP430以 PWM (32kHz)在低功耗模式下运行、P1.4每2秒向 P2.2发送中断信号、然后读取 ADC 并更改中断中的 CCR1值。

在中断中完成 ADC 后、它应该返回到低功耗模式、但它保持 ISR。

您能不能评论这个问题

谢谢!




//
// MSP430FR2433
// --------
// /|\| |
// || |
// -|RST 用于电路控制
的 P1.0 |--> PWM // | P1.1 |-->基准电压输出
// | 用于开路检测的 P1.2 |--> ADC 输入
// | P1.4 |-->PWM 用于中断
// | P2.2 |-->中断输入
//
//
////*********


#include 

短推 ADCValue;
短电流 ADCValue;
短 peakADCValue;
短引用值;

int main (空)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
PM5CTL0 &=~LOCKLPM5;


P1DIR = 0xFF; //将所有 P1引脚的方向设置为输出
P2DIR = 0xFF; //将所有 P2引脚的方向设置为输出
P1OUT = 0; //将所有 P1引脚设置为低电平
P2OUT = 0;

_bis_SR_register (SCG0); //禁用 FLL
CSCTL3 |= SELREF_REFOCLK; //将 REFOCLK 设置为 FLL 基准源
CSCTL0 = 0; //清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位
CSCTL1 |= DCORSEL_3; //设置 DCOCLK = 8MHz
CSCTL2 = FLLD_1 + 121; // FLLD = 1、DCODIV = 4MHz
_DELAY_CYCLES (3);
_BIC_SR_register (SCG0); //启用 FLL
while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); //轮询直到 FLL 锁定
CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK; //设置 ACLK = XT1 = 32768Hz、DCOCLK 作为 MCLK 和 SMCLK 源
CSCTL5 |= DIVM1; // SMCLK = MCLK = DCODIV/2 = 1MHz,默认情况下




P1DIR |= BIT1; // P1.1
P1SEL1 |= BIT1; // P1.1选项选择
TA0CCR0 = 320;
TA0CCR1 = 160;
TA0CCTL1 = OUTMOD_7;
TA0CTL = tassel_1 | MC_1; // ACLK
TA0CCTL0 &=~CCIE;

P1DIR |= BIT4; // P1.1和 P1.2输出
P1SEL1 |= BIT4; // P1.1和 P1.2选项选择
TA1CCR0 = 64000;
TA1CCR2 = 100;
TA1CCTL2 = OUTMOD_7;
TA1CTL = tassel_1 | MC_1; // ACLK、
TA1CCTL0 &=~CCIE;

P1DIR &=~BIT2; //将 P1.2设置为 ADC 的输入
P1REN |= BIT2; //启用 P1.5上拉/下拉电阻器
P1OUT &=~BIT2; //将 P1.2设置为低电平(由于 p2ren 设置为1、引脚也被下拉)
P1IFG &=~BIT2; //为了防止立即中断,清除 P1.5标志
P1IE &=~BIT2; //禁用 P2.0中断

P2DIR &=~BIT2;//将 P2.2设置为中断的输入位(输入默认加电)
P2OUT &= BIT2;// BIT2打开、将 OUTbit 设置为上拉
P2REN |= BIT2;// BIT2打开、启用内部上拉寄存器
P2IES &=~BIT2;//一个是下降边沿
P2IE |= BIT2; // BIT2打开,P2.3中断被启用
P2IFG &=~BIT2;// BIT2关闭、P2.3 IFG 被清零//激活先前配置的端口设置

P2IFG = 0;


ADCCTL0 |= ADCSHT_2 | ADCON; // ADCON、S&H=16 ADC 时钟
ADCCTL1 |= ADCSHP; // ADCCLK = MODOSC;采样定时器
ADCCTL2 |= ADCRES; // 10位转换结果
ADCMCTL0 |= ADCINCH_2; // A1 ADC 输入选择;Vref=AVCC
ADCIE |=~ADCIE0;
_bis_SR_register (LPM3_bits + GIE);//启用中断的 LPM3
}


//端口2中断服务例程
#pragma vector=port2_vector
_interrupt void Port_2 (void)
{
P1OUT &=~BIT6;

P1OUT ^= BIT0;

_delay_cycles (50);
ADCCTL0 |= ADCON; //打开 ADC
ADCCTL0 |= ADCENC + ADCSC; //采样和转换开始

currADCValue = ADCMEM0;

peakADCValue = currADCValue;

peakADCValue = 0.1 * TA0CCR1;


ADCCTL0 &=~ADCENC; //确保 ADC10关闭
P2IFG = 0; //清除 P2标志
P1OUT |= BIT6;

}

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

    >      ADCIE |= ~ADCIE0;

    (拼写错误警报:)这几乎可以实现所有功能。 我猜您会得到一个 ADCINIFG 并转到 DEFAULT_ISR。 尝试:

    >      ADCIE &= ~ADCIE0;

    或者(更好)完全删除该代码行。

    [编辑:此外、您无需等待 ADC 完成、然后再读取 MEM0。 插入如下内容:

    > while (ADCCTL1 & ADCBUSY)/* empty*/;  //等待 ADC 完成

    ]

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

    非常感谢!

    它现在可以工作了!

    祝你度过美好的一天!