UART2 передаёт код обратно на USB с некорректными прерываниями

Начал изучать UART STM32 на отладочной плате STM2F446RE. Включил UART2, по умолчанию включились порты PA2,PA3. Включил прерывания, подключил переходник UART/USB CH340, перед этим установив драйвера. Добавил простенький код в stm32f4xx_it.c: в нём объявил две переменные, когда принимается 8 бит buffrec в ответ должен отправляться "Hello world!".

    /* USER CODE BEGIN Includes */
uint8_t buffrec[8];
uint8_t TX_data[]="Hello world!\n\r";
/* USER CODE END Includes */


void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */
  HAL_UART_IRQHandler(&huart2);
  /* USER CODE BEGIN USART2_IRQn 1 */
  HAL_UART_Transmit(&huart2,TX_data,14,0xFFFF);
 HAL_UART_Receive_IT(&huart2, buffrec,8);
  /* USER CODE END USART2_IRQn 1 */
}

В main.c объявил приём и передачу сигнала UART:

/* USER CODE BEGIN 2 */
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_TC);

  /* USER CODE END 2 */

В компиляции нет никаких ошибок и предупреждений. Приём и передачу мониторю через Advanced Serial Port Terminal 6. В итоге при попытке отправить комбинацию "12345" записываются только первые 2 числа. При этом происходит отправка 2 сообщений "Hello world!" сразу. Результат отправки 12345

При этом при записи двух бит, они записываются в пустые биты, а затем перезаписывают их.Результат отправки 12 Кроме того, результат приходит на COM3 (порт подключения отладочной платы), а не на COM4 (порт подключения CH340), к которым подключены пины UART2 PA2, PA3.

Порты USB

Из-за чего могут возникать эти проблемы?


Ответы (1 шт):

Автор решения: maestro

Прерывание RXNE возникает каждый раз, когда в регистре DR оказался новый принятый байт. Поэтому каждый раз после поступления очередной цифры ваш UART перезаряжается на начало приёма. Просто вынесите приём из прерывания в main.

→ Ссылка