Я знаю, что можно включить прерывание приема UART, используя
HAL_UART_Receive_IT(&huart2, (uint8_t *)rx_buffer, expectedNumberOfBytes)
- Но однажды начавшись, как это остановить «вручную»?
Мы можем отключить прерывание UART, используя HAL_NVIC_DisableIRQ()
(например: HAL_NVIC_DisableIRQ(USART1_IRQn)
). Это предотвратит возникновение прерывания, но состояние, установленное функцией HAL_UART_Receive_IT
, которое равно HAL_UART_STATE_BUSY_RX
, должно быть установлено обратно в HAL_UART_STATE_READY
, чтобы дескриптор uart вернулся в состояние, которое может принять новый вызов HAL_UART_Receive_IT()
.
Вопрос
Как мне сбросить состояние прерывания UART, если я хочу отключить прерывание Rx через некоторое время?
Вопросы о переполнении стека не касаются того, как сбросить состояние; Я обратился к этим вопросам:
- Отключение прерывания в обработчике прерываний STM32F407
- https://electronics.stackexchange.com/questions/100073/stm32-usart-rx-interrupts < / а>
Я мог бы использовать USART_ClearITPendingBit()
или USART_ITConfig()
, но они определены как частные функции библиотекой STM HAL. Так я должен их использовать?
HAL_UART_Receive_IT
- это функция драйвера, а не обработчик прерывания. Он устанавливает состояние для принимающего драйвера. Периферийное устройство UART имеет собственное состояние прерывания, но оно отличается от состояния в программном драйвере, на котором, похоже, вы застряли. Итак, я думаю, вы спрашиваете, как мне сбросить состояние драйвера STM32 HAL UART? Если вы имеете в виду не это, и вы хотите сбросить состояние периферийного устройства (оборудование UART) или хотите сбросить состояние обработки прерываний (оборудование NVIC), отредактируйте свой вопрос, чтобы прояснить это. - person Ben Voigt   schedule 29.03.2019