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.

[参考译文] TMS320F28386D:CM FLASHAPI 擦除闪存期间 CM 丢失 UART 中断

Guru**** 2459230 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/980411/tms320f28386d-cm-lost-a-uart-interrupt-during-cm-flashapi-erasing-flash

器件型号:TMS320F28386D
主题中讨论的其他器件:C2000WARE

您好!

我正在开发我们的闪存引导加载程序。

在我调用闪存 API 擦除某些闪存扇区期间、CM-UART Rx 中断缺失。

如果我不调用 闪存 API 进行擦除、它就能完美工作。

我确认 了中断处理程序中调用的所有函数都是 ramfuncs。

并且 UART Rx FIFO 中的日期计数超过  了 UARTIFLS 的设置、但中断仍不会被触发。

处理程序函数引用了 C2000 Ware 示例"C:\ti\c2000\C2000Ware_3_02_00_00\driverlib\f2838x\examples\cm\UART\UART_ex1_echoback.c"。

中断空 UART_RX_IntHandler (空)

uint32 ui32状态;

ui32Status = UART_getInterruptStatus (UART0_BASE、UART_RAW_INT);

UART_clearInterruptStatus( UART0_BASE,ui32Status );

if (ui32Status & UART_INT_RX)

drive_uart_receive();

但是,如果我没有调用 UART_clearInterruptStatus(),则会按预期触发中断。

在 UART.h 中 ,UART_clearInterruptStatus()的注释说 ,建议在 中断处理程序函数中调用该函数。

如何解决中断丢失问题,并且仍然调用 推荐的函数 UART_clearInterruptStatus()?

谢谢

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

    您好、Frederick、

    根据 UART.h 中的函数注释,如果 在 ISR 中的某个位置没有调用 UART_clearInterruptStatus(),则中断将在退出 ISR 时立即触发。  我认为删除清零功能可以掩盖另一个问题、即您的 UART 以不会产生额外 RX 的方式变得不同步。  我认为逻辑的下一步是将该函数保留在中、然后检查 UART 模块的状态以确定是否设置了任何错误标志。   

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

    你(们)好  

    "但随后检查 UART 模块的状态以确定是否设置了任何错误标志。"

    我应该检查哪个寄存器的错误标志?  UARTRIS?

    谢谢

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

    您好!

    我在 最后一个 Rx 中断中检查 UARTRIS、在下一个中断丢失后、没有错误标志(无错误原始中断状态)。

    在丢失下一个中断后、我弹出 FIFO 中的每个剩余数据(UART_readChar ())并读取 UARTRSR、也没有错误标志。

    我还可以检查该状态的寄存器吗?

    谢谢

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

    您好、Frederick、

    很抱歉缺少具体内容。  看起来最好 直接在 UARTDR 或 UARTRSR 中观察到错误。  我对 UARTRIS 寄存器的解释是、只有在通过 UARTIM 寄存器显式启用时才会显示错误(启用错误中断也可能是一个选项、但我认为如果您不直接看到错误、这可能不会提供额外的信息)。

    一些其他调试方法:

    • 传入的消息来自哪里?  您是否已通过示波器或逻辑分析仪确认消息仍在传入?
    • 是否确定消息仍然从 RX 引脚传输到 UART 模块?  此处的主要问题是 GPIO 设置已发生更改、因此 GPIO 多路复用器不再将引脚路由到模块。
    • UART 模块中是否更改了其他设置?  转储所有配置寄存器(使用 CCS 中设置为 UART 模块基础的存储器浏览器、然后将所有存储器保存到文件中、然后再次保存并在运行闪存 API 后进行比较)可能是合理的。
    • 是否在 UART 中设置了 RX 标志、但不会传播到 CPU?  这可能来自 CPU 中断硬件中的未确认标志、也可能来自持续发生并使 UART ISR 快得多的另一个中断。  
    • ISR 矢量是否仍然映射到 RAM 中的预期位置? ISR 旨在映射到 RAM (从闪存复制)、但实际上最终映射到原始闪存、这在某种程度上是合理的;因此它在闪存被擦除前一直工作?   

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

     您好 Devin、

    我在您的建议 渠道中找不到任何异常。

    我在下面描述了我复制的步骤。

    以下时间序列是否会导致下一个 UART Rx 中断?

    初始 中断 FIFO 深度为2。(UARTIFLS = 0x4)

    Rx FIFO 有13个字节的数据。

    2.中断被触发(FIFO 中的数据多于2个)。

    3.在中断处理程序中,读取 UART_getInterruptStatus()和 UART_clearInterruptStatus()。

    在 同一中断处理程序中、从 Rx FIFO 中弹出2个字节的数据(左侧11个)、并将 中断 FIFO 级别设置为8 (UARTIFLS = 0x2)。

    5.从 中断处理程序返回。

    6.没有触发下一个中断。(我认为 FIFO 中的11个数据比8级多、它将触发下一个中断。)

    然后我的问题会在上面重现。 明白了吗?

    如果有道理、我如何解决我的问题。 为了提高程序的效率、我们需要首先从 FIFO 中弹出2个数据、然后在下一个中断中弹出左侧数据。  

    谢谢

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

    您好、Frederick、

    因此、当您离开 ISR 时、FIFO ISR 级别设置为8、FIFO 中有11个字?  您是否希望/期望立即重新进入 ISR (可能在中间处理具有更高优先级的 ISR?  我猜是只有在接收到一个新字时才检查 FIFO 水平、而这个检查可以是(FIFO 计数= FIFO 水平)、而不是(FIFO 计数>= FIFO 水平)。   

    如前所述、 需要调用 UART_clearInterruptStatus 以防止 ISR 立即重新进入。  通常情况下、这是不可取的、但听起来就像您想要的那样。  我想、如果您还有剩余的字节需要处理、您不会调用 Clear 函数、而是在您最终将最后一个字从 FIFO 中拉出时调用该函数。   

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

     您好,Devin,

    好的、没问题。 它工作得非常好。

    谢谢你。