Я думаю, вы путаете HAL_UART_Receive_IT с функцией, которая фактически получает что-либо. Это не вариант. Эта функция просто включает периферийное устройство UART и его прерывание приема.
Если вы хотите придерживаться библиотеки HAL, вам нужно передать структуру типа UART_HandleTypeDef в качестве параметра HAL_UART_Receive_IT, которая содержит
- указатель uint8_t * на буфер приема
- счетчик переводов для количества элементов, которые вы хотите получить
Насколько я знаю, с этой платформой невозможно получить элементы неопределенно долго, потому что, как только счетчик передачи достигает нуля, прерывание приема автоматически отключается. Поэтому, если вам это нужно, вам, вероятно, лучше написать ISR самостоятельно, переписав слабую функцию, определенную ST (скорее всего, под названием «UARTx_IRQHandler»).
Чтобы окончательно интегрировать прерывание приема в FreeRTOS, у вас есть два варианта:
- Получать данные внутри ISR в сырой (uint8_t *) буфер, как это делает HAL, и использовать критическую секцию, которая временно отключает прерывание приема при доступе к нему.
- Получать данные внутри ISR в очередь FreeRTOS, используя безопасный API для прерываний. официальная книга FreeRTOS глава 6 очень хорошо объясняет это.