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.

[参考译文] 编译器/TM4C1290NCZAD:UART 中断原始并被屏蔽

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/756270/compiler-tm4c1290nczad-uart-interrupt-raw-and-masked

器件型号:TM4C1290NCZAD

工具/软件:TI C/C++编译器

您好!  

我的硬件通过 UART 中断(接收和发送)连续运行。 由于某些原因、我会得到帧、奇偶校验和中断错误、我必须忽略这些错误。 我正在使用 TI 的驱动程序库读取掩码后的中断寄存器、其中 uint32_t uInts = MAP_UARTIntStatus (my_UART_base、true);   

我发现、几个小时后、我很少看到 uInts=0、但已抛出中断。 我读取原始寄存器、然后查看该寄存器0x380的值。 如果原始状态与屏蔽状态不同、只在非常罕见的情况下、会发生什么情况?

此致

Micky

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

    我最初的怀疑是 uInts 状态以某种方式被清除。 您提到已经输入代码来读取原始寄存器、因此听起来像是一个变量、该变量只是为了调试目的存储未屏蔽的中断状态的结果。 考虑到这一点、是否还可以添加一个唯一目的也是存储屏蔽结果的额外变量? 然后、您可以比较问题发生时的结果、并确定 uInts 状态是否受到软件其他部分的影响。

    此外、为了澄清这一点、您肯定会在问题发生时收到中断、并且当中断发生时、您不会从 uInts 中获得值、但您来自 Raw 寄存器? 我要求澄清的是、就像没有设置中断事件一样、原始中断状态仍然可以通过 UART 原始中断状态寄存器看到、但中断状态将不在屏蔽的中断状态寄存器中显示。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    [引用用户="Ralph Jacobi"]
    此外、为了澄清这一点、您肯定会在问题发生时收到中断、并且当中断发生时、您不会从 uInts 中获得值、但您来自 Raw 寄存器? 我要求澄清的是、就像没有设置中断事件一样、原始中断状态仍然可以通过 UART 原始中断状态寄存器看到、但中断状态将不在屏蔽的中断状态寄存器中可用。[/引用]

    这绝对是大约4个小时的情况... (但不是真正的 regualary),程序运行到 vfnInternalError()中。 我有点不确定、为什么会发生这种情况。

    我的代码如下所示:

    void vfnUartIntHandler (void)
    {
    uint32_t uInts = MAP_UARTIntStatus (my_UART_base、true);
    MAP_UARTIntClear (my_UART_base、uInts);
    IF (uInts &(UART_INT_TX))
    {
    // Ein 发送中断=> nächstes Zeichen 满载,跌落
    vfnUeberging();
    }
    IF (uInts &(UART_INT_RX | UART_INT_9BIT | UART_INT_FE | UART_INT_PE | UART_INT_be))
    {
    
    。}
    IF (uInts &(UART_DR_OE))
    {
    
    。}
    //永远不会发生…
    if (((uInts &(UART_INT_RX | UART_INT_9BIT | UART_INT_FE | UART_INT_PE | UART_INT_be | UART_DR_OE | UART_INT_TX))==0)
    {
    uint32_t uIntsRaw = MAP_UARTIntStatus (ELMOS_UART_base、false);
    uint32_t auData[2]={uInts、uIntsRaw};
    vfnInternalError (enUARTRecv、(uint8_t*)&auData、8);
    }
    
    } 

    此致

    Micky

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

    感谢您分享代码! 我现在看到问题了。

    您正在使用的 UART_DR_OE 标志用于 UART_O_DR 寄存器、但您不会从该寄存器读取。

    您需要使用 UART_INT_OE 或 uart.h 头文件中的其他标志、这些标志定义了来自中断状态寄存器的所有 INT 标志。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    感谢您的提示。 我选对了它。 无论如何、我存储了这两个标志并将其存储在日志存储器中

    uint32_t uInts = MAP_UARTIntStatus (ELMOS_UART_base、true);
    uint32_t uIntsRaw = MAP_UARTIntStatus (ELMOS_UART_base、false);
    uint32_t auData[2]={uInts、uIntsRaw}; 
    vfnInternalError (enUARTRecv、(uint8_t*)&auData、8);

    我的日志是

    17:10:31 17-12-2018:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00

    17:35:31 17-12-2018:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00

    20:55:32 17-12-2018:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00

    2018年1:15:33 18-12-12:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00

    2018年2:45:34 18-12-12:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00

    2018年4月30:35 18-12-12:
     Val: 0x00-0x00-0x00-0x00-0x00-0x80-0x03-0x00-0x00


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

    我一直在查看文档和您的代码、但实际上还没有给出有关此行为的说明。 这不是我们以前看到过的。 不过、我确实注意到代码中存在另一种可能的差异。 您可以使用 my_UART_base 检查 UARTIntStatus 并将其清除、但要读取原始状态寄存器、您的 API 会使用 ELMOS_UART_base。 这些是否等效定义?

    我认为此时还需要查看 UART 初始化设置、尤其是 UARTIntEnable 函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ralph、
    我检查了我的代码并找到了一些参考您的评论的内容:
    "我要求澄清、就像没有设置中断事件一样、原始中断状态仍然可以通过 UART 原始中断状态寄存器看到"
    在每个字节之后,我使用 ROM_UARTCharPutNonBlocking()执行带有 TX 中断的 UART 传输。
    至少我发现了一个情况,即没有为下一个 char 抛出 TX 中断,但从另一个函数将下一个 char 加载到带有 ROM_UARTCharPutNonBlocking ()的寄存器中。 我不能说,如果这正是问题的原因,但至少我不再看到这种行为。
    此致
    Micky