UART прерывает FreeRTOS с помощью драйвера STM32 HAL - PullRequest
1 голос
/ 02 мая 2019

Я работаю на контроллере STM32L152VB-A. Я использую FreeRTOS.
Я использовал CubeMX для генерации кода и настроил USART1 с глобальными прерываниями.
Непрерывные RX и TX (HAL_UART_Receive и HAL_UART_Transmit) работают.
Но я пытаюсь заставить его работать с прерываниями.

Только после того, как я позвонил HAL_UART_Receive_IT, я получаю прерывание.
Поскольку я не мог знать размер получаемых данных, я планирую получать символы один за другим.

Поскольку я использую RTOS, я не понимаю, куда писать HAL_UART_Receive_IT, поскольку сообщение может прийти в любое время. кто-нибудь может направить меня ??

PS: я пытался вызвать HAL_UART_Receive_IT внутри ISR, но он также не работает.

1 Ответ

2 голосов
/ 02 мая 2019

Я думаю, вы путаете HAL_UART_Receive_IT с функцией, которая фактически получает что-либо. Это не вариант. Эта функция просто включает периферийное устройство UART и его прерывание приема.

Если вы хотите придерживаться библиотеки HAL, вам нужно передать структуру типа UART_HandleTypeDef в качестве параметра HAL_UART_Receive_IT, которая содержит

  • указатель uint8_t * на буфер приема
  • счетчик переводов для количества элементов, которые вы хотите получить

Насколько я знаю, с этой платформой невозможно получить элементы неопределенно долго, потому что, как только счетчик передачи достигает нуля, прерывание приема автоматически отключается. Поэтому, если вам это нужно, вам, вероятно, лучше написать ISR самостоятельно, переписав слабую функцию, определенную ST (скорее всего, под названием «UARTx_IRQHandler»).

Чтобы окончательно интегрировать прерывание приема в FreeRTOS, у вас есть два варианта:

  1. Получать данные внутри ISR в сырой (uint8_t *) буфер, как это делает HAL, и использовать критическую секцию, которая временно отключает прерывание приема при доступе к нему.
  2. Получать данные внутри ISR в очередь FreeRTOS, используя безопасный API для прерываний. официальная книга FreeRTOS глава 6 очень хорошо объясняет это.
...