Merge pull request #6027 from EmergReanimator/stm-uart-fix

Stm uart fix
This commit is contained in:
Scott Shawcroft 2022-02-13 18:42:28 -08:00 committed by GitHub
commit 59837fe24a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 22 additions and 7 deletions

View File

@ -325,19 +325,22 @@ size_t common_hal_busio_uart_write(busio_uart_obj_t *self, const uint8_t *data,
if (self->tx == NULL) {
mp_raise_ValueError(translate("No TX pin"));
}
bool write_err = false; // write error shouldn't disable interrupts
// Disable UART IRQ to avoid resource hazards in Rx IRQ handler
HAL_NVIC_DisableIRQ(self->irq);
HAL_StatusTypeDef ret = HAL_UART_Transmit(&self->handle, (uint8_t *)data, len, HAL_MAX_DELAY);
if (ret != HAL_OK) {
write_err = true;
}
HAL_UART_Receive_IT(&self->handle, &self->rx_char, 1);
HAL_StatusTypeDef ret = HAL_UART_Transmit_IT(&self->handle, (uint8_t *)data, len);
HAL_NVIC_EnableIRQ(self->irq);
if (write_err) {
if (HAL_OK == ret) {
HAL_UART_StateTypeDef Status = HAL_UART_GetState(&self->handle);
while ((Status & HAL_UART_STATE_BUSY_TX) == HAL_UART_STATE_BUSY_TX) {
RUN_BACKGROUND_TASKS;
Status = HAL_UART_GetState(&self->handle);
}
} else {
mp_raise_ValueError(translate("UART write error"));
}
return len;
}
@ -359,6 +362,14 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *handle) {
}
}
#if (1)
// TODO: Implement error handling here
#else
while (HAL_BUSY == errflag) {
errflag = HAL_UART_Receive_IT(handle, &context->rx_char, 1);
}
#endif
return;
}
}
@ -436,6 +447,10 @@ STATIC void call_hal_irq(int uart_num) {
if (context != NULL) {
HAL_NVIC_ClearPendingIRQ(context->irq);
HAL_UART_IRQHandler(&context->handle);
if (HAL_UART_ERROR_NONE != context->handle.ErrorCode) {
// TODO: Implement error handling here
}
}
}