Очистить флаги прерываний USART (UART) в STM32?

8

Я использую 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()функция, но она принимает только небольшое подмножество флагов.

Существует восемь различных источников прерываний, которые можно выборочно включить, и десять различных флагов. Есть ли где-нибудь краткое изложение того, как управлять всеми этими флагами?

bitsmack
источник

Ответы:

16

Как правило, вам нужно обрабатывать только те флаги прерываний, которые вы специально включили USART_ITConfig().

Однако, если вы включаете прерывание RXNE ( USART_ITConfig(USARTx, USART_IT_RXNE)), то это также включает прерывание Overrun! Таким образом, вы должны справиться с обоими из них.

intmap

Флаги USART могут сбивать с толку. Есть отдельные флаги состояния и флаги прерываний, и они имеют одинаковые имена. Например: USART_IT_RXNEи USART_FLAG_RXNE.

Кроме того, существуют различные способы очистки этих флагов. Например, USART_ClearITPendingBit()функция работает только для четырех (из десяти) возможных флагов.

Вот краткое изложение флагов прерывания и как их использовать. Они специфичны для STM32F105, но являются репрезентативными:


USART_IT_TXE - «Регистр передачи данных пуст»

  • Очищается автоматически при звонке USART_SendData()

USART_IT_RXNE - «Регистр получения данных не пуст»

  • Очищается автоматически при звонке USART_ReceiveData(USARTx)

  • Это можно очистить вручную, позвонив USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC - "Передача завершена"

  • Это очищается автоматически:

    • USART_GetITStatus(USARTx, USART_IT_TC) с последующим
    • USART_SendData()
  • Это также можно очистить вручную, позвонив USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS - "CTS change"

  • Очищается по телефону USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD - "Обнаружен разрыв LIN"

  • Очищается по телефону USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE - "Ошибка четности"

  • Очищено от:
    • USART_GetITStatus(USARTx, USART_IT_PE) с последующим
    • USART_ReceiveData(USARTx)

USART_IT_NE - "Ошибка шума"

  • Очищено от:
    • USART_GetITStatus(USARTx, USART_IT_NE) с последующим
    • USART_ReceiveData(USARTx)

USART_IT_ORE - "Ошибка переполнения"

  • Очищено от:
    • USART_GetITStatus(USARTx, USART_IT_ORE) с последующим
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE - «Обнаружена свободная линия»

  • Очищено от:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) с последующим
    • USART_ReceiveData(USARTx)()
bitsmack
источник
Да, я ответил на свой вопрос :) Если бы я нашел такой список раньше, это сэкономило бы мне много времени. Надеюсь, это кому-нибудь поможет!
bitmack
2
Этот ответ - золото; очень четкая ссылка на то, как очистить каждое из этих прерываний.
jjmilburn
2

Просто хочу добавить немного моего опыта по этой проблеме, я следую инструкциям:

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».

Надеюсь, это сработает для вас и сэкономит гораздо больше времени на этом вопросе. =)

LostInCoding
источник
Спасибо за Вашу информацию! Я не узнаю USART_GetFlat (). Можете ли вы сказать мне, откуда это?
битмак
Мне жаль, что я неправильно набрал команду, это должно быть USART_GetFlagStatus (), а затем USART_ReceiveData (), исходное сообщение было исправлено. Спасибо Битсмак.
LostInCoding
Отлично, спасибо! Похоже, имена функций изменились. Используете ли вы стандартную периферийную библиотеку или один из HAL STMCube? Для какого семейства микроконтроллеров?
bitmack