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.

[参考译文] MSP430FR2155:MSP430FR2155中断锁定

Guru**** 2512055 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/851141/msp430fr2155-msp430fr2155-interrupt-lock

器件型号:MSP430FR2155

您好!

我需要一些有关如何同步中断和主代码的帮助。  

我有一个 UART 连接、在主循环中我处理该数据。 每当一个数据出现时、它就会存储在中断时的环形缓冲器上。 主循环会一直运行、如果环形缓冲区上有新数据、则会处理该数据。 我想实施 LPM、但我看到它存在一些风险。

根据以下代码、如果数据是在"if (get_size_ring _buffer ()< 1)"之后以及在执行此命令之前从 UART 发出的、则"__bis_SR_register (LPM3_bits | GIE)";它将处于 LPM 模式、但环形缓冲区上有需要处理的数据。 如何解决此问题? 有什么建议吗?

while (1)
{
if (get_size_ring 缓冲区()>0)
{
process_data();
}

if (get_size_ring 缓冲区()< 1)
{
_bis_SR_register (LPM3_bits | GIE);
{
#pragma


vector=USCI_A1_vector
__interrupt void USCI_A1_ISR (void)
{
uint8_t 数据;

开关(__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
{
USCI_UART_UCRXIFG 案例:

数据= EUSCI_A_UART_receiveData (EUSCI_A1_BASE);

环缓冲区放置(Rb、数据)(&Data)
LPM3_EXIT;
中断;
}
} 

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

    在第二个 if ()之前--一个带有 LPM 的 I--前面加上_disable_interrupt (),然后在 if 块后面加上_enable_interrupt ()。 LPM 中的 GIE 可确保您将被唤醒。

    您有时会(重新)不必要地启用、但它比检查更便宜。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    while (1)
    {
    if (get_size_ring 缓冲区()>0)
    {
    process_data();
    }
    
    _disable_interrupt ();
    
    if (get_size_ring 缓冲区()< 1)
    {
    _bis_SR_register (LPM3_bits);
    {
    
    __ENABLE_INTERRUPT();
    } 

    您建议使用以下代码、对吧?

    但是这次我不应该在禁用和启用中断之间丢失来自 UART (如果有)的传入数据?

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

    否 请将您在 LPM 语句中使用的 GIE 放回:

    >         __bis_SR_register( LPM3_bits | GIE );

    这可确保您将被唤醒。

    如果执行 get_size_ring buffer()所需的字符时间超过2个,则可能会丢失数据。 我猜它不需要那么长的时间。

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

    感谢你的善意帮助。 您能否解释一下您的两个字符时间是什么意思?

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

    您好!

    原因是禁用了中断。 这意味着直至达到

    __bis_SR_register( LPM3_bits);

    __enable_interrupt();

    您不会对来自 UART 的传入数据做出反应。 只要在这段被停用的中断期间内只有一个字节进入、它不会对您造成伤害、因为 UART RX 的标志将被置位、并且一旦您重新启用 GIE、您就会执行中断服务例程。 但是、如果应该输入两个或更多字节/字符、最后一个字节/字符将覆盖 UART 模块缓冲区中的上一个字节/字符、因此您将丢失该字节/字符。

    此致

    Peter