[USART3_IRQHandler()在设置了LL_USART_IsActiveFlag_TXE的情况下连续调用

问题描述 投票:0回答:1

我要开发自己的串行代码(而不是使用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 */
}

serial.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);,问题就消失了(但是后来我看不到串行端口是否可以自由写入)。

serial-port stm32 interrupt irq stm32h743
1个回答
0
投票

逻辑错误。

TXE中断应为only,如果您有一些数据要发送。

当完成输入数据寄存器后,将其禁用。

逻辑上没有TXE清除标志。

© www.soinside.com 2019 - 2024. All rights reserved.