Я хочу разработать свой собственный последовательный код (а не использовать HAL CubeMX) для взаимодействия с существующей кодовой базой протокола, которая нуждается в низкоуровневых последовательных функциях.
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
в коде выше.)
Я думаю, что проблема в что я сбрасываю неправильный флаг (T C вместо TXE).
Это причина проблемы?
Я не могу очистить TXE, поскольку LL_USART_ClearFlag_TXE()
не существует.
Если я закомментирую LL_USART_EnableIT_TXE(serial->usart);
в коде инициализации, проблема исчезнет (но тогда я не смогу увидеть, свободен ли последовательный порт для записи).