UART на FreeRTOS

Осваиваем FreeRtos на примере приема-передачи по UART

Логично используем 2 потока (2 задачи "task"): один для UART 2 (передатчик) и UART3 (приемник).

Передатчик (Master) посылает данные по нажатию кнопки (KEY1), приемник (Slave) получает и отсылает обратно мастеру.

Все реализуем на одной плате, один контроллер STM32F407VET6 на свободной среде Atollic True Studio.

Внизу как обычно можно скачать готовый проект.

фотка 1

Примерно так выглядит трассировка:

фотка 2

Работает связка на прерываниях HAL_UART_Transmit_IT (HAL_UART_TxCpltCallback) на передачу,

Включен HAL_UART_Receive_IT (HAL_UART_RxCpltCallback) для обоих портов UART соответственно,
и данные принимаются не блокируя основные потоки программы.

Из прерывания HAL_UART_RxCpltCallback данные через очередь xQueueSendToBackFromISR засылаются каждой задаче индивидуально соответственно. Задачи соответственно ждут в цикле поступления принятый байтов по UART : xQueueReceive.

Что можно в итоге сказать : работает без проблем ,но медленно: задержка 0.3 сек. между передачей и обратным приемом.
Примечание: на самом деле, уменьшите периоды блокировки ожидания xQueueReceive и все полетит.

фотка 3

А так все байты стабильно передаются , ничего не теряется:

фотка 4

Файлы для скачивания

* STM32F407VET6 UART2 UART3 FreeRtos Atollic True Studio [zip]
свободный проект на Atollic Treu Studio с открытым исходным кодом