Когда STM32 разрабатывается с использованием библиотеки HAL,Иногда, когда последовательный порт отправляет и получает большой объем данных,,Проблемы возникнут. Например, последовательный порт может отправлять и получать одновременно.,Через некоторое время его можно будет только отправить,Получить не Работа. Или просто получить,Но это не работает, когда объем данных большой. Эти вопросы и их содержание кратко изложены ниже.
Когда объем данных слишком велик, а частота передачи высокая, последовательный порт может переполниться и не войти в прерывание последовательного порта.
Включите прерывание RXNE и прерывание ORE:
if(HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE)!-HAL_OK)
{
__HAL_UART_ENABLE_IT(&huart1, UART_IT_ERR);
}
Добавьте определение функции обратного вызова прерывания при ошибке последовательного порта в usart.c.
/* Функция обработки ошибок прерывания, здесь обрабатываются ошибки переполнения. */
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
uint8_t i = 0;
if(__HAL_UART_GET_FLAG(huart,UART_FLAG_ORE) != RESET)
{
__HAL_UART_CLEAR_OREFLAG(huart);
HAL_UART_Receive_IT(huart,(u8 *)&i,1);
}
}
Очевидно, что связь через последовательный порт STM32 является полнодуплексной, но при использовании последовательного порта STM32 библиотеки HAL для отправки и получения обнаруживается, что при большом объеме данных возникают проблемы при одновременной отправке и получении. . Причина проблемы в том, что библиотека HAL STM32 на некоторое время блокирует последовательный порт при обработке приема, в результате чего он на короткое время становится «полудуплексным». В это время могут возникнуть проблемы при отправке и приеме. в то же время.
В функции HAL_UART_Receive_IT блокировка выполняется в начале
Хотя его окончательно разблокировали в UART_Start_Receive_IT,
Однако существует множество ситуаций, которые могут привести к невозможности разблокировки, что повлияет на прием последовательного порта. При использовании HAL_UART_Transmit вы можете видеть, что исходный код этой функции также имеет блокировку и разблокировку, и это та же самая блокировка, управляемая UART_Start_Receive_IT! ! ! Хороший полнодуплексный режим был преобразован библиотекой HAL в полудуплексный.
Ручная разблокировка
return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
if(return_state!=HAL_OK)
{
//Выходим из состояния занятости (вызванного ORE, очищаем бит ORE)
if(return_state == HAL_BUSY)
{
//Очистить ошибки ORE
// __HAL_UART_CLEAR_OREFLAG(&huart1);//прозрачныйOREФлаговый бит
// huart1.RxState=HAL_UART_STATE_READY;
huart1.Lock=HAL_UNLOCKED;
//Перезапускаем прием
return_state=HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer,RXBUFFERSIZE);
}
}