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:为什么尚未在USI_A0_ISR中设置UCTXIFG?

Guru**** 2609885 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/655913/msp430fr2433-why-isn-t-uctxifg-not-already-set-in-usci_a0_isr

部件号:MSP430FR2433

您好,

我不熟悉TI的控制器,因此这可能是一个非常基本的问题。

我设置了UCA0并启用了UCTXIEUCRXIE

这是我的ISR:

#pragma vector=USI_A0_vector
__interrupt void USI_A0_ISR(void){

Switch(__偶 数_in_range(UCA0IV,USI_UART_UCTXCPTIFG))
{
案例USI_NONE:中断;
案例USI_UART_UCRXIFG:
RXData = UCA0RXBUF; //清除缓冲区
__BIC_SR_REGISTER_ON_EXIT (LPM0_bits);//在RETI上退出LPM0
中断;
案例USI_UART_UCTXIFG:
如果(UCA0IFG和UCTXIFG)== 0)
{//为什么我们要降落在这里?
while (1);
}
//发送下一个字节(如果有)
sys_if_Cmd_sendByteFromRingBuf();
中断;
案例USI_UART_UCSTIFG:中断;
案例USI_UART_UCTXCPTIFG:中断;
}
} 

一旦ISR被调用,我最终以USSCI_UART_UCTXIFG作为案例,我就会认为UCTXIFG始终是设置的。 但是没有,我的控制器在我为验证此行为而输入的while (1)循环时卡住。 为什么会这样?

 

Jens

 

 

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

    仅当另一个字节写入UCA0TXBUF时,才应重置UCTXIFG,因此除非您正在写入其他位置的缓冲区(如main()中),否则不应在while循环中结束。 您是否可以尝试在此处设置断点并查看UCA0IFG寄存器以查看是否设置了UCTXIFG位(位1)?

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

    感谢您的回复。

    我正在写信给UCA0TXBUF的main()函数,以便传输。 我将我的所有字节放在缓冲区中,发送第一个字节,然后让ISR处理其余的字节。 但我看不出来这是什么原因。 我的意思是,一旦我进入ISR,main()就不会产生任何干扰。
    “您可以尝试在此处设置断点并查看UCA0IFG寄存器以查看是否设置了UCTXIFG位(位1)”,这是什么意思? 我正在检查第12行,还是你也想找别的地方?

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

    UCTXIFG在设备重置时设置,因此一旦代码开始运行,就已设置此字节。 这意味着您将立即进入ISR (您无需写入UCA0TXBUF即可开始传输)。 在输入ISR之前,来自main()的代码可能会写入UCA0TXBUF,这将导致您看到的问题。 我建议您尝试从main()中删除该行,看看您是否仍然看到该问题。

    对于在断点处查看寄存器,假设您使用的是CCS,则在遇到断点时,可以在调试视图中查看寄存器。 如果从main()删除UCA0TXBUF写入不能解决问题,我会尝试此操作。

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

    [报价用户="Nathans"]
     在输入ISR之前,来自main()的代码可能会写入UCA0TXBUF,这将导致您看到的问题。

    [/引述]

    您的意思是,如果我在启用中断之前写入UCA0TXBUF,那么将会清除USI_UART_UCTXIFG吗? 是否仍将执行中断? (听起来不对,但似乎确实发生了)

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

    好的,我解决了。 RTFM的典型案例。

    我采纳了Nathan的建议,在查看寄存器时,使用调试器对我的ISR进行了检查。

    在第4行(开关)中设置了UCTXIFG标志,并且UCA0IV == USCI_UART_UCTXIFG。 到目前为止还不错。 但下一步(第12行)都被清除。 啊! 因此阅读UCA0IV可以清除这些标记! 这就是第12行的计算结果为真的原因。

    仔细阅读家庭用户指南可以帮我省去很多麻烦:"UCAxIV寄存器的读取访问权限会自动重置最高待处理中断条件和标志。" (请参阅SAU445G 21.3 .15.4)