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

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

Ответы:


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)()

Да, я ответил на свой вопрос :) Если бы я нашел такой список раньше, это сэкономило бы мне много времени. Надеюсь, это кому-нибудь поможет!
— 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».

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


Спасибо за Вашу информацию! Я не узнаю USART_GetFlat (). Можете ли вы сказать мне, откуда это?
— битмак

Мне жаль, что я неправильно набрал команду, это должно быть USART_GetFlagStatus (), а затем USART_ReceiveData (), исходное сообщение было исправлено. Спасибо Битсмак.
— LostInCoding

Отлично, спасибо! Похоже, имена функций изменились. Используете ли вы стандартную периферийную библиотеку или один из HAL STMCube? Для какого семейства микроконтроллеров?
— bitmack
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.