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.
您好!
我正在开发一个非常简单的应用、其中 CM-UART 会等待某个 时刻接收字符、而该时刻会立即重新传输回字符。
我已将 CM-UART 配置为9600 8N1、无 FIFO。
然后、 我使用 PuTTY 发送一个字符、然后将按预期触发 CM-UART 中断处理程序。
然而,当我尝试读取接收到的字符时,UART_readCharacter()函数无限循环,等待 UARTFR 寄存器中的 RXFE 位被置位。
问题是 RXFE 位已置位、而且 caracter 在 UARTDR 寄存器中可用、如下图所示。
我做错了什么?
谢谢!
Carlo
此外、当接收到一个字符并触发 ISR 时、UARTRIS / UARTMIS 寄存器中不会设置 RXRIS / RXMIS。
谢谢!
Carlo。
您好、Carlo。
感谢您的提问。 您是否正在使用 FIFO? 否则、RXFE 位的功能发生变化、请参见下面 TRM 寄存器字段。 如果预期的是 FIFO 内容、与接收保持寄存器相比、这种功能变化可能是问题的罪魁祸首:
此致、
Vince
谢谢 Vince,
是的、为了简化操作、我禁用了 FIFO。
因此,如果 FIFO 被禁用,我似乎无法使用任何读取 API (UART_isDataAvailable()、UART_readCharNonBlocking ()、UART_readChar ())、任何写入 API (UART_iswritAvailable()、UART_SpaceChar ())。
第一个字节检查 RXFE 标志状态、如果 FIFO 被禁用(空 RXFIFO)、此值始终为1;第二个字节检查 TXFF 标志状态、如果 FIFO 被禁用(完整 TXFIFO)、此值始终为1。
如果是这样、由于没有 driverlib_cm 支持、也没有 cm bitfield 寄存器支持、唯一的解决方案似乎是基于 HW_REG ()来直接访问数据寄存器 UARTDR。
#define UART_ReadCharNonFIFO ()(HWREG (UART0_BASE + UART_O_DR)
#define UART_WriteCharNonFIFO (c)(HWREG (UART0_BASE + UART_O_DR)= c)
对吗?
另外奇怪的是我已经注意到、每次 UART 中断处理程序被触发时、从 UART_getInterruptStatus()返回的中断状态都是正确的:接收时为0x010、传输时为0x020。
在接收的情况下,如果我在观察窗口中读出 UARTRIS/UARTMIS 寄存器,RXRIS/RXMIS 标志就会置位为0,即使在调用 UART_clearInterruptStatus ()或读取接收到的字符之前也是如此。
传输不存在问题、而是。
原因可能是什么?
谢谢!
Carlo
您好、Carlo。
您是否能够确认数据实际上是在该引脚上接收到的? 这可能是引脚配置问题(可能无法正确设置 RX 引脚 GPIO 多路复用器设置)。
这里、RX 的示波器捕获可以提供一些帮助。
此致、
Vince
您好 Vince、
定义 UART_ReadCharNonFIFO()和 UART_WriteCharNonFIFO(c)宏后,如上一篇文章所述,我正确接收和重新发送字符。 因此不可能是引脚多路复用问题。
下图是一个字符接收事件。
UART 中断处理程序被正确触发、UART_getInterruptStatus ()正确返回0x010、但手表中的 RXRIS / RXMIS 标志为0。
谢谢!
Carlo
您好、Carlo。
感谢您的澄清! 如果您参考的是 UARTRIS.RXRIS 位、这就是预期的行为。 当读取 FIFO (适用于 FIFO 模式)或读取单个字节(适用于非 FIFO 模式)时、该位将被清除。 在这种情况下、您创建的自定义 ReadChar 函数将同时读取该字节并清除 RXRIS 位。
此致、
Vince
您好 Vince、
问题是我还没有读过这个角色。
我在调用 UART_getInterruptStatus()以获取中断原因之后被停在一个断点上。
我还注意到,即使在执行 UART_getInterruptStatus()之前停止,问题也会出现。 在这种情况下,UART_getInterruptStatus()也失败,并且返回0。
谢谢!
Carlo
您好、Carlo。
这仅在您使用断点运行时发生吗? 如果只是与断点一起使用、那么中断很可能发生在传输中途并且会中断所接收到数据的计时。 您能否进行无断点的自由运行、看看这是否修复了它?
此致、
Vince
您好、Vince。
是的、我确认在自由运行时没有问题。
这似乎是一个调试器问题、不是吗?
您好、Carlo。
正确、这似乎是一个与调试器如何中断 SCI 模块有关的问题。 理论上可以使用 SCIRXEMU 寄存器来修改 SCI 对断点的反应方式。 请让我知道这是否适用于该特定问题。 如果不能、我可以联系调试器专家、他们可能可以帮助解决这个问题。
此致、
Vince
您好、Vince。
SCIRXEMU 是 C28 SCI 外设寄存器、而不是 CM UART 寄存器。
我 找不到类似的 CM UART 寄存器。
不管怎样、这个问题的原因可能是 RXRIS/RXMIS 标志被清零、这是因为 Rx 数据寄存器由仿真器读取以更新观察窗口。
我不知道。。。 无论如何、这似乎是一个调试器问题、而不是硬件/软件问题。
谢谢!
Carlo。
您好、Carlo。
我会联系我们的调试器专家、并让他们对此进行回复、请等待1-2个工作日的回复。
此致、
Vince
您好、Carlo。
您认为调试器是这样做的原因是正确的、在正常运行中、到 UART 输出的时钟不会被停止(在正常系统运行中没有时钟停止、仅在断点中)。
此致、
Vince