STM32 Проблема передачи прерывания Uart - PullRequest
1 голос
/ 20 января 2020

Я пытаюсь реализовать uart в режиме прерывания, но что-то go явно не так. Вот моя проблема: я хочу отправить несколько строк как можно скорее (пример: хочу отправить 10 раз строку «test123»), но по какой-то причине это невозможно (я делаю некоторую ошибку, но не могу понять, где это ошибка). Я использую STM32CubeIDE, mcu - это stm32f407vgt6. После первой успешной передачи код попадает в Error_Handler (), что недопустимо. Когда я использую задержки между каждой передачей, вся строка будет успешно передана, но почему это можно сделать таким образом. Вот код

uint8_t TxData[] = "test123\n";
bool flagTxCmpltUsart = true;

for(i = 0; i < 10; i++){`

    if(HAL_UART_Transmit_IT(&huart3, TxData, strlen(TxData)) != HAL_OK)
    {
        Error_Handler();
    } 
        Wait_Unit_Uart_Tx_Is_Complete();
        Reset_Uart_Tx_Complete_Flag();}
void Reset_Uart_Tx_Complete_Flag(void) 
{
    flagTxCmpltUsart = false;
}

void Wait_Unit_Uart_Tx_Is_Complete(void)
{
    while(!flagTxCmpltUsart){}
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART3)
    {
        flagTxCmpltUsart = true;
    }
}

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Так как void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) вызывается в контексте прерывания, вы должны установить свой флаг завершения как

volatile bool flagTxCmpltUsart = true;

Чтобы убедиться, что компилятор знает, что он может измениться за пределами обычного ход выполнения программы.

0 голосов
/ 20 января 2020

Вы должны проверить свой статус UART, вы получите ошибку, если линия передачи занята. Попробуйте вставить следующий код между каждым вызовом:

while (HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY){
   //Do Something..
} 
...