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.

[参考译文] CCS/MSP-EXP430FR2355:我无法使中断代码正常工作

Guru**** 2563960 points
Other Parts Discussed in Thread: MSP430FR2355

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/748472/ccs-msp-exp430fr2355-i-am-not-able-to-get-interrupt-code-working

器件型号:MSP-EXP430FR2355
主题中讨论的其他器件:MSP430FR2355

工具/软件:Code Composer Studio

大家好、

我是中断编码的新手。 我将 TimerB 中断用于 MSP430FR2355器件。 您能告诉我以下代码中的错误吗?  

int main (空)

WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

P1DIR |= BIT0;//设置引脚、LED1用于输出

TB0CCR0 = 100;

TB0CCTL0 = CCIE;

TB0CTL = MC_1|ID_3|TBSSEL_1|TBCLR;//设置计时器并启动计时器


#pragma vector = TIMER0_B1_vector
_interrupt void TB1_ISR (void)

// P1OUT |= BIT0;
while (1){
volatile unsigned int i;// volatile 以阻止优化

P1OUT ^= 0x01;//使用异或切换 P1.0

I = 10000;// SW 延迟
我----
while (i!= 0);

从所有在线参考中、我似乎都有使用中断所需的所有步骤。 我们非常感谢您的任何帮助。 谢谢你。

-Ritika

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

    您还需要使用设置全局中断使能
    _enable_interrupt ();

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

    > TB0CCTL0 = CCIE;
    >#pragma vector = TIMER0_B1_vector

    CCR0有其自己的矢量。 尝试:

    >#pragma vector = TIMER0_B0_vector

    [编辑:忘记引用:用户指南(SLAU445H)第14.2.6节]

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

    非常感谢您的回复。 我在实际代码中有__enable_interrupt ()。 但我想、当我试图删除其他内容时、我错误地删除了上面的代码行。 但是、在添加 TIMER0_B0_Vector 后、我在加载代码时看到 LED1闪烁、但在加载之后它不起作用。

    我是否缺少其他东西? 感谢您的所有帮助。

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

    我想我使用了正确的矢量地址、但猜不是。 在更改上述行后、当我加载代码时、由于代码数量较少、代码会闪烁、但此后无法再次工作。 我多次重新加载它、并且也按下了复位按钮。

    根据代码、LED 应一直闪烁。 但似乎没有这样做。 感谢您提前提供的所有帮助。

    -Ritika
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定我是否理解您描述的症状。

    我要指出、这是一个非常不寻常的代码结构、因为你会得到一个中断、并且你永远不会离开 ISR ("while (1)")。

    我建议您将 while (1)移到 main 中、并在 ISR 中仅保留"P1OUT ^= BIT0;"行。 (摆脱 do{}循环即可。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    按照建议、我移除了 while (1)和 DO 循环。 仍然无法正常工作。

    以下是我的更新代码;

    int main (void)
    {
    WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
    
    P1DIR |= BIT0;//设置 LED1的引脚以输出
    P1OUT = BIT0;//预加载 LED1打开(低电平有效!)
    
    
    TB0CCR0 = 1000;
    TB0CCTL0 = CCIE;
    TB0CTL = MC_1|ID_3|TBSSEL_1|TBCLR;//设置计时器并启动它
    __ENABLE_INTERRUPT (
    
    
    
    
    );}#pragma vector = TIMER0_B0_Vector __INTERRUPT void TB1_ISR (void)
    {void)
    
    P1OUT ^= 0x01; //切换 P1.0
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在配置 P1OUT 之后添加此行、如下所示:

    > PM5CTL0 &=~LOCKLPM5;//启用 GPIO

    这是编译器警告您的内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢。 它起作用了、因此在代码中、我们需要定义我们在 ISR 中使用的 GPIO。 以上代码的作用是什么?

    -Ritika
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它比它更具神秘。 在 FR2xx、FR4xx 和 FR5xx 器件(包括 FR2355)中,复位时 GPIO 配置为“锁定”-您可以设置例如 P1DIR 和 P1OUT,但在该位被清除之前它不会生效。 它提供两种您从未听说过的低功耗模式(LPM3.5和 LPM4.5)。

    用户指南(SLAU445H)第8.3.1节对此进行了介绍、但仅需记住在每个程序中包含该行代码即可。
    编译器警告是一个好的提醒。 (您也应该检查任何其他警告。)