k3nt00 wrote on Thursday, May 21, 2015:
Hello,
I am running FreeRTOS 8.2.1 on an STM32F103 with the newest STM32F1 Hal Driver
I had been having some issues with the interrupt UART Tx beginning a new transmission before the one before it completed. I call the interrupt transmit and then wait on a semaphore from the callback to be given.
if(HAL_UART_Transmit_IT(&huart1, (uint8_t*) outBuffer, dataSize) != HAL_OK)
{
Error_Handler();
}
xSemaphoreTake(waitUntilSendDone, portMAX_DELAY);
The Callback:
void HAL_UART_TxCpltCallback (UART_HandleTypeDef *UartHandle)
{
xHigherPriorityTaskWoken = pdFALSE;
xSemaphoreGiveFromISR(waitUntilSendDone, &xHigherPriorityTaskWoken);
}
The problem is, the callback was being called after only 2 bytes had been transmitted, which allowed for the second transmit buffer to be sent prematurely.
The ST Examples use the following:
if(HAL_UART_Transmit_IT(&huart1, (uint8_t*) outBuffer, dataSize) != HAL_OK)
{
Error_Handler();
}
while (UartReady != SET)
{
}
/* Reset transmission flag */
UartReady = RESET;
And the Callback:
void HAL_UART_TxCpltCallback (UART_HandleTypeDef *UartHandle)
{
/* Set transmission flag: transfer complete */
UartReady = SET;
}
This solution solved the problem. The callback wasn’t called until the first buffer was completely transmitted. I do not understand why this is? Why is the method of waiting effecting the callback?
Any insight would be much appreciated.
Thanks
PS Posted this prematurely without proper title. Apologies.