0

低レベルのシリアル機能を必要とする既存のプロトコル コードベースに接続するために、(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上記のコードで。)

問題は、間違ったフラグ (TXE ではなく TC) をクリアしていることだと思います。

これが問題の原因ですか?

存在しないため、TXEをクリアできませLL_USART_ClearFlag_TXE()ん。

初期化コードでコメントアウトするLL_USART_EnableIT_TXE(serial->usart);と、問題は解決します (ただし、シリアル ポートが自由に書き込めるかどうかを確認できません)。

4

2 に答える 2