serial-port - USART3_IRQHandler() 被连续调用并设置了 LL_USART_IsActiveFlag_TXE
问题描述
我要开发自己的串行代码(而不是使用 CubeMX 的 HAL)来连接需要低级串行功能的现有协议代码库。
USART3_IRQHandler()
被反复调用(因此serial::serial_irq_handler()
也是如此。
/**
* @brief This function handles USART3 global interrupt.
*/
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
serial_irq_handler(&usart3);
/* USER CODE END USART3_IRQn 0 */
/* USER CODE BEGIN USART3_IRQn 1 */
/* USER CODE END USART3_IRQn 1 */
}
序列号.c:
/**
* @brief Should be called only by UART/USARTx_IRQHandler()
*/
void serial_irq_handler(struct serial *serial)
{
// "while" is used in case we decide to turn on the limited FIFOs (USARTs only).
while (LL_USART_IsActiveFlag_RXNE(serial->usart)) {
uint8_t b = LL_USART_ReceiveData8(serial->usart);
circbuf_push(&serial->rxcircbuf, b);
}
if (LL_USART_IsActiveFlag_TXE(serial->usart)) {
LL_USART_ClearFlag_TC(serial->usart);
serial->txbusy = 0;
}
}
(serial->usart == USART3
在上面的代码中。)
我认为问题在于我清除了错误的标志(TC 而不是 TXE)。
这是问题的原因吗?
我无法清除 TXE,因为LL_USART_ClearFlag_TXE()
不存在。
如果我LL_USART_EnableIT_TXE(serial->usart);
在初始化代码中注释掉,问题就会消失(但我无法看到串行端口是否可以自由写入)。
解决方案
错误的逻辑。
只有当您有一些数据要发送时,才应启用 TXE 中断。
当您完成输入数据寄存器时 - 您将其禁用。
没有 TXE 清除标志是合乎逻辑的。EMPTY标志只能通过使其不为空来清除
但是然后我无法查看串行端口是否可以自由写入
您需要实现一个缓冲区。并检查缓冲区中是否有空间来放置要发送的新数据。
推荐阅读
- javascript - 使用 XAMPP 对 .js 文件的代码更改无效
- javascript - Firebase signInWithEmailAndPassword 在 UI 焦点更改之前不会触发 .then()
- c++ - 阅读格式不一致的文本文件
- html - 如何通过 .exe 接受除 .exe 之外的所有文件类型控制
- google-ads-api - 通过 Google Ads API 运行或安排 Adwords 脚本
- c# - 在 c# 中使用 wordpay 创建桌面应用程序自助服务亭
- html - Outlook CSS 渲染与浏览器不同
- zurb-foundation - 将样式应用于 Zurb 电子邮件基础中的列
- reactjs - 如何在 createMuiTheme 中使用断点?材质 UI 和 React.js
- jquery - 革命滑块 - 如果滑块全高,则停止滚动页面