我将尝试利用 SLAU723A 的第26节中的信息、在汇编代码中实现一个简单的 RS -232链接。
到目前为止、一切都很顺利、除了一点;我在本文档的任何地方都看不到接收 FIFO 的位置、因此我不知道应该从何处提取任何接收到的数据字节。
有人能告诉我接收 FIFO 在内存中的什么位置、或者我怎么知道它在哪里?
谢谢!
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.
我将尝试利用 SLAU723A 的第26节中的信息、在汇编代码中实现一个简单的 RS -232链接。
到目前为止、一切都很顺利、除了一点;我在本文档的任何地方都看不到接收 FIFO 的位置、因此我不知道应该从何处提取任何接收到的数据字节。
有人能告诉我接收 FIFO 在内存中的什么位置、或者我怎么知道它在哪里?
谢谢!
您好!
Unknown 说:其中我应该取任何接收到的数据字节。
接收到的数据被压入 RxFIFO。 每个 RxFIFO 位置没有唯一的地址、而是您从 UARTDR 寄存器中读取 RxFIFO。 由于 RxFIFO 是一个 FIFO (先进先出)、因此每次从 UARTDR 寄存器读取时、FIFO 都会将先进(最早)的数据传出到处理器。 同样、如果您再次从 UARTDR 寄存器读取、它会将第二输入(FIFO 中最早的数据)数据压出到处理器。

您好!
感谢您的答复。 我能够在 UARTDR 读取传入的数据字节、但这只是间歇性的。 我将使用 UART_echo 样本的命令来设置 UART3、我想知道它们是否会设置我要与之竞争的中断例程来拾取传入的字节。
我想我如果将 FIFO 深度设置为1字节、那么接收中断就被禁用了、这是我通过将 UARTIFLS 的位3、4和5设置为零来实现的、但我现在无法找到读取它的位置。 您能告诉我如何 禁用接收中断、这样我就能确保不与中断例程竞争吗?
再次感谢您。
如果仍有类似的内容[来自 UART_echo 示例]:
>MAP_IntEnable (INT_UART0);
>MAP_UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);
这就是启用 Rx 中断的功能。 假设不需要该 ISR 提供的函数、可以删除这些行。
设置 UARTIFLS=0只是设置触发电平;它不会禁用中断。
为明确起见、我的应用程序使用 UART0通过没有问题的 USB 端口进行通信。 我将使用 UART2和 UART3实现2个 RS -232端口、我现在要测试的端口是 UART3。
我在主程序中找到4个包含 IntEnable 的命令:
UARTIntEnable (UART0_BASE、UART_INT_TX);
SysTickIntEnable ();
UARTIntEnable (UART0_BASE、(UART_INT_OE | UART_INT_BE | UART_INT_PE | UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX));
IntEnable (INT_UART0);
在我看来、这些大多与 UART0相关。 您是否认为他们也会通过 UART3启用 Rx 中断?
我可以通过某种方法查看是否启用了通过 UART3进行的 Rx 中断、 如果启用了、我可以通过某种方法禁用它吗?
非常感谢您的帮助。
启用 UART0中断不会影响 UART3。 (我想您可能刚刚将所有"UART0"更改为"UART3"或其他内容。)
在调试器中、您可以通过"Window->Show View->Registers"查看 UART3寄存器。 您需要的是 IM (中断屏蔽)寄存器。 或者,在您的项目中搜索"UART3_BASE"——可能不多。
您如何读取数据? 您是否正在使用非(FIFO-EMPTY)[UARTFR:RXFE]或原始中断状态[RIS:RXRIS]? 一般而言、我建议使用前者。
在"Window->Show View->Registers"的 UART3下、UART_IM 全部为零。
唯一包含 UART3_base 的命令是:
MAP_UARTConfigSetExpClk (UART3_BASE、g_ui32SysClock、38400、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
我使用以下汇编语言无限循环来读取数据:
while (1)
{
ASM (" movw r1,#0xf000 ");
ASM (" movt r1, #0x4000 ");
ASM (" LDR R2、[R1、#0x03c]"); // UART3_UART_RTS
ASM (" 和 R2,#0x10 "); // RXRIS
ASM (" CMP R2,#0x10 ");
ASM (" 博讷 诺因 ");
ASM (" LDR R3、[R1] ");
ASM (" MOV R3和 R3 ");
asm ("noin:MOV R3、R3 ");
}
我还尝试了位于0x18的 RXFE、它仍然无法可靠地接收数据。 我注意到的一件奇怪的事情是、第16次尝试后、我要发送到它的字符显示在 UART3_UART_DR 中。 说明 FIFO 存在问题、但我在 UARTIFLS 中将位3、4和5设置为零、我想这意味着我会在接收到每个字符时得到每个字符、并且我不需要等到 FIFO 填满。
你能看到我在这里做错了什么吗?
谢谢你。
A.以下是您的第一篇文章的答案(在我阅读第二篇文章之前)
以下是使用以下查找 RXFE 寄存器的代码时发生的情况
while (1)
{
ASM (" movw r1,#0xf000 ");
ASM (" movt r1, #0x4000 ");
ASM (" LDR R2、[R1、#0x018]"); // UART3_UART_FR
ASM (" 和 R2,#0x10 "); // RXFE
ASM (" CMP R2,#0x00 ");
ASM (" 博讷 诺因 ");
ASM (" LDR R3、[R1] ");
ASM (" MOV R3和 R3 "); //在步骤2中添加的断点。&步骤4。
asm ("noin:MOV R3、R3 ");
}
第1步:如果我发送相同的字符16次、该字节将在第16次通过时显示在 UART3_UART_DR 中、而不会像预期的那样显示在 R3中。
第2步:如果我按如图所示放置一个断点、该字节将显示在 R3中、但一些随机的其他字节将显示在 UART3_UART_DR 中。
我查看了 UART_LCRH、其值为70、因此启用了 FIFO。 然后、我本来想我实际上不希望启用 FIFO、所以我把值更改为60、结果好些。
第3步:现在、当我发送一个 char 后、 每次它都会立即出现在 UART3_UART_DR 中、但它仍然没有出现在 R3中。
第4步:当我如图所示放置断点时、字节会显示 UART3_UART_DR 和 R3、但当然、我不能一直在那里有断点。
香港特区政府
B.这是你的第二篇文章的答案,我在回答第一篇之前没有读过。
我删除了为禁用 FIFO 而编写的代码、并将其替换为 UARTFIFODisable (UART3_base)。 它的工作方式与步骤3和4完全相同。 我还尝试了使用 RXRIS、它的工作方式与步骤3和4完全相同。
我想我们已经非常接近解决这个问题了。 非常感谢您的帮助。