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/MSP430FR2355:调试器在 UART 上给出奇怪的结果

Guru**** 2539500 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/915287/ccs-msp430fr2355-debugger-giving-strange-results-on-uart

器件型号:MSP430FR2355

工具/软件:Code Composer Studio

我有一个 UART ISR...在接收部分,我递增计数器,然后从 LPM3唤醒以进行处理,然后进入睡眠状态并等待下一个传入的 Rx 数据..... 我 有一个逻辑分析仪连接到数据流(TX 和 Rx)并对其进行监控...我的第一个 Rx 流进入为"ER_CMD#P9"... 我看到两个奇怪的结果:

1. 如果我在 __BIC_SR_REGISTER_ON_EXIT (LPM3_BITS)上放置一个断点;在 Rx ISR 内,第一次通过计数器读取1,但我的 RXBUFFER 寄存器显示9?  这是复位后、这是我在代码中接收的唯一内容。  这是怎么可能的?

2. 在 main 内、我进入睡眠状态、然后等待从 Rx ISR 唤醒、此时我有命令

IF (UCA1IFG 和 UCRXIFG){

在这里、我做的第一件事是读取 RXBUFFER。  首先、这里有两个问题、我从未在这个问题中遇到过、这似乎意味着第二个问题、根据用户指南、您清除 IFG 的方法是读取 RXBUFFER、但它似乎可以通过进入和退出 ISR 而不执行操作来自行清除 正在读取缓冲区...... 请评论??

谢谢

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

    因为您没有显示您的代码、我猜是这样。

    我假设您通过读取 UCA1IV 寄存器来找出引起中断的中断源。 它返回最高优先级中断的值并将该中断复位。 因此、在主例程中查找 RXIFG 将不起作用、因为它已复位。 (用户指南的22.3.15.4)

    您的接收 ISR 应该读取 RXBUF 并在安全的地方堆存数据。 FIFO 队列是我通常使用的队列。

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

    大卫…

    感谢您的回应...是的,我正像您说的那样努力,但我认为我可以得到“聪明的”,然后修整 ISR ...我不太理解您在上面说的内容...但是,手册说您必须阅读 RXBUFFER 以清除标志,RX 是最高优先级...基于我所读的内容 如果我得到一个 RX IFG、那么我会跳转到 ISR 并清除如果读取 RXBUFFER、否则唤醒(请参阅下面的代码)并读取 main 中的 RXBUFFER (它将唤醒的行)...

    switch (__evo_in_range (UCA1IV、USCI_UART_UCTXCPTIFG))
    {
    USCI_NONE 案例:中断;
    USCI_UART_UCRXIFG 案例:
    howMany ++;
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
    中断;
    USCI_UART_UCTXIFG 案例:
    _BIC_SR_REGISTER_ON_EXIT (LPM3_BITS);
    中断;
    案例 USCI_UART_UCSTTIFG:中断;
    案例 USCI_UART_UCTXCPTIFG:break;
    }
    

    是的,这两种方法都很短,但这只是实验代码的开头,我必须在其中加入一些其他的 RX/TX 内容..... 主函数看起来应该是:

    案例响应:
    startTB3();
    _bis_SR_register (LPM3_bits);
    * prx = UCA1RXBUF;
    prx++;
    

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

    该手册说、读取 RXBUF 会复位 RXIFG、但它从未说过您必须这么做、或者这是唯一的方法。

    请勿使 ISR 保持较短的时间。 执行您需要执行的操作。