ST意法半导体
直播中

王超

8年用户 1396经验值
私信 关注
[问答]

我需要在启用TXEIE后立即手动检查TXE是否为1吗?

STM32F746-迪斯科板;Windows 10,STM32CubeIDE 1.7.0,空项目,只有 CMSIS,没有别的。
为了学习,我正在编写一个基于中断的 UART 传输驱动程序,在寄存器上带有环形缓冲区(没有 DMA,稍后会在我提高一些智商后出现)。阅读数据表、参考手册和编程手册(针对 NVIC),我想我理解了这些东西。驱动程序还没有准备好测试,它正在进行中,虽然设置已经完成。我想确保我正确理解了这些内容。
关键点:
请参阅所附图片,一流的绘画技巧来解释我的 uart tx 环形缓冲区的工作原理。
书面形式:我有一个数组,用作传输的环形缓冲区。有一个指向当前正在发送的元素的指针和“在最后一个元素之后”的指针。当我到达数组的最后一个元素时,我移动到数组的开头。因此,环形缓冲区。
现在,想象一下我已经在发送一些东西了。那时我有另一个发送请求。我所做的是检查我的环形缓冲区有多少可用空间(缓冲区大小减去仍在等待发送的字符数),如果它适合,它位于我将新数据写入缓冲区并相应地移动到最后一个指针之后. 基本上,将其附加到已经等待发送的内容。
然而,这让我开始思考。由于在设置传输完成标志之前我有一个完整的 UART 帧将下一个字节加载到发送寄存器(传输数据寄存器,USART1->TDR),我想我可以在加载新的时禁用 UART 中断(传输,更具体地说是 TXE)数据放入缓冲区环形数组。但我仍然希望它们成为“待定”,这样当我在数据加载到缓冲区后重新激活中断时,程序将看到这些中断发生并处理它们(所以如果我需要 1 个 UART 位时间将数据复制到缓冲区,在第 2 位,MCU 会将下一个字节加载到 USART1->TDR)。
这里有几件事需要考虑:
  • 我一般不想在 NVIC 中禁用 UART 中断,因为它会损坏接收器功能(尚未编写,但当然会)
  • 这意味着,我需要禁用 UART TXEIE(TDR 空中断启用),然后运行缓冲区加载功能,然后重新启用中断。
问题:假设我有 TXEIE=1(启用 TXE 中断),但 TXE = 0(无中断)。然后我禁用 TXEIE=0,所以 TXE=1 不会触发中断。但是 TXE=1 发生,没有中断发送到 NVIC。在 TXE=1 发生后,我再次启用 TXEIE。TXE 是否会中断触发或我需要在启用 TXEIE 后立即手动检查 TXE 是否为 1?
正如所承诺的,这是我对我正在做的事情的粗略视觉表示。对于这个问题来说并不是那么重要,但仍然如此。
另外,问题 2。没有直接关系,但在我讨论的时候。如果我有 UART 触发中断,但在 NVIC 中禁用了 UART 中断,它会在我在 NVIC 中启用中断后触发吗?
此外,如果您有心情,请随时批评我的算法,随时接受反馈,尤其是考虑到我是开发人员的幼虫。








回帖(1)

李彬

2022-12-14 14:17:11
这意味着一旦中断触发,我需要确保清除 TXE
是的,您需要清除中断或禁用它。
UART模式下不能用clear flag清除TXE标志,只能写TDR清除。
另外,问题 2。没有直接关系,但我正在研究它。如果我有 UART 触发中断,但在 NVIC 中禁用了 UART 中断,它会在我在 NVIC 中启用中断后触发吗?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分