Я использую STM32F105 для связи с чипом Linx GPS с помощью UART.
Если я не использую прерывания (если я просто опрашиваю флаг RX), то это работает просто отлично. Но я получаю неожиданные результаты, когда пытаюсь использовать прерывания.
Например, если я включаю только прерывание RXNE («RX not empty») USART_ITConfig(USARTx, USART_IT_RXNE)
, то код должен передавать вектор ISR только для этого одного конкретного события. Но прерывание срабатывает и для условия переполнения.
Что касается очистки флагов, кажется, что метод зависит от флага. Чтобы снять флажок Overrun ( USART_IT_ORE
), в Руководстве пользователя объясняется, что я должен сначала прочитать USARTx_SR
регистр, а затем прочитать USARTx_DR
регистр. Это работает; флаг очищен
Существует также USART_ClearITPendingBit()
функция, но она принимает только небольшое подмножество флагов.
Существует восемь различных источников прерываний, которые можно выборочно включить, и десять различных флагов. Есть ли где-нибудь краткое изложение того, как управлять всеми этими флагами?
источник
Просто хочу добавить немного моего опыта по этой проблеме, я следую инструкциям:
USART_IT_ORE - "Ошибка переполнения"
Отменено: USART_GetITStatus (USARTx, USART_IT_ORE), за которым следует USART_ReceiveData (USARTx) ()
Кажется, это не работает, и вместо этого у меня работает следующая команда:
USART_GetFlagStatus (USARTx, USART_IT_ORE), за которым следует USART_ReceiveData (USARTx)
Если вы посмотрите на функции:
USART_GetFlagStatus () и USART_ReceiveData ()
Вы найдете то, что именно Битсмак написал раньше ... «Сначала прочитайте регистр USARTx_SR, затем прочитайте регистр USARTx_DR».
Надеюсь, это сработает для вас и сэкономит гораздо больше времени на этом вопросе. =)
источник