Deberías usar la siguiente función:
HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
y asegúrese de que las interrupciones de UART y DMA estén habilitadas.
Si observa la implementación, (solo una parte de ella):
/* Set the UART DMA transfer complete callback */
huart->hdmatx->XferCpltCallback = UART_DMATransmitCplt;
/* Set the UART DMA Half transfer complete callback */
huart->hdmatx->XferHalfCpltCallback = UART_DMATxHalfCplt;
/* Set the DMA error callback */
huart->hdmatx->XferErrorCallback = UART_DMAError;
/* Enable the UART transmit DMA Stream */
tmp = (uint32_t*)&pData;
HAL_DMA_Start_IT(huart->hdmatx, *(uint32_t*)tmp, (uint32_t)&huart->Instance->DR, Size);
El DMA se iniciará en el modo IT, y hay tres% de devoluciones de llamada que se llamarán mediante las funciones de devolución de llamada anteriores.
- Transferencia de devolución de llamada completa:
HAL_UART
- La mitad de los bytes se envían:
HAL_UART_TxCpltCallback
- error:
HAL_UART_TxHalfCpltCallback
Todos estos tienen una declaración débil, por lo que debe implementarlos. Por ejemplo:
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart->Instance == USART1) // change USART instance
{
// Transmit complete handle RS-485 related stuff
}
}