Вы можете отключить / включить ВСЕ прерывания, включая это UART7_IRQHandler()
, используя это ядро ARMCMSIS вызывает:
__disable_irq();
__enable_irq();
Источник: https://stm32f4 -discovery.net / 2015/06 / как правильно правильно включить-прерывать-в-руке-кортекс-м /
Итак, вы можете сделать следующее, чтобы отключить прерывание, сбросить RxState
, а затем снова запустить прием на основе прерываний, когда будете готовы:
__disable_irq();
huart7->RxState= HAL_UART_STATE_READY;
__enable_irq();
HAL_UART_Receive_IT(&huart7, (uint8_t *)rx_buffer, expectedNumberOfBytes);
Вы можете отключить / включить ТОЛЬКО прерывания UART7_IRQHandler()
(все 10 типов прерываний uart7, связанных с этим вектором прерываний, включая связанные с Tx, связанные с Rx, связанные с ошибками и т. Д.), Используя эти вызовы STM32 HAL:
HAL_NVIC_DisableIRQ(UART7_IRQn);
HAL_NVIC_EnableIRQ(UART7_IRQn);
Затем сделайте то же самое, что и выше, за исключением того, что вместо этого используйте эти вызовы для отключения / включения прерываний.
Если вы углубитесь в реализацию HAL_UART_IRQHandler()
однако, который вызывается UART7_IRQHandler()
, вы увидите, что он вызывает только прерываниеоснованный на t обработчик приема, UART_Receive_IT()
, если оба бита USART_SR_RXNE
(«Получение не пусто» внутри регистра состояния USART) и бит USART_CR1_RXNEIE
(«Разрешение прерывания приема не пусто», внутри регистра управления USART1), оба установлены.Бит RXNE
устанавливается каждый раз, когда поступает байт, и очищается всякий раз, когда вы читаете регистр данных или записываете в него ноль. Бит включения прерывания - это то, что вы имеете полный контроль над отключением этого прерывания приема UART, и если вы сбросите этот бит вручную, вы отключите приемное прерывание, отключив любые другие типы прерываний, связанных с этим USART.Это лучший способ сделать это, поскольку с этим UART связано 10 источников прерываний. Другими словами, очистка этого бита не только приводит к сбою проверки внутри HAL_UART_IRQHandler()
, но и предотвращает прерывание приема.происходит в первую очередь!См. Справочное руководство RM0090 Ред. 16 , например:
p969:
p1009:
p1011:
p1015:
p1013:
Таким образом, чтобы отключить / включить только прерывание приема не пустой USART, выполните следующие действия. См. Регистр управления (USART_CR1) на p1013, показанный чуть выше.
// Disable the USART Receive Not Empty interrupt
CLEAR_BIT(huart7.Instance.CR1, USART_CR1_RXNEIE);
// Enable the USART Receive Not Empty interrupt
SET_BIT(huart7.Instance.CR1, USART_CR1_RXNEIE);
Теперь вы можете сделать следующее, чтобы отключить прерывание приема USART, сбросить HAL RxState, а затем снова запустить прием на основе прерываний, когда будете готовы:
CLEAR_BIT(huart7.Instance.CR1, USART_CR1_RXNEIE);
huart7->RxState= HAL_UART_STATE_READY;
SET_BIT(huart7.Instance.CR1, USART_CR1_RXNEIE); // This call isn't actually necessary, as this bit is set inside `HAL_UART_Receive_IT()` as well
HAL_UART_Receive_IT(&huart7, (uint8_t *)rx_buffer, expectedNumberOfBytes);