Перейти к содержанию
    

stm32 вопрос по приоритетам прерываний

Это как это? В прерывании по приёму одного байта вычитываете несколько? Ждёте что ли их? Опрашиваете RXNE? Отключаете прерывание при этом?

Да, ожидаю RXNE. Прерывания не отключаю. Получаю строчку и выхожу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, ожидаю RXNE. Прерывания не отключаю. Получаю строчку и выхожу.

Хм. Как-то это криво, не? А если первый символ - помеха? Да и глухо висеть в прерывании столько времени - не комильфо. Хотя дело ваше конечно.

Ну хорошо. А строчка-то приходит? Целиком?

Если так, то проблема скорее всего в лишней зачистке RXNE. Либо напрямую, либо при вычитывании DR. По идее, каждому новому RXNE должно соответствовать ровно одно чтение DR. Причём первый раз RXNE уже взведён при входе в прерывание.

Больше в голову ничего не приходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм. Как-то это криво, не?

Похоже, что Вы правы. Если просто сохранять символ в буфер, все работает. Но стоит во время работы обработчика поступить еще хотя бы одному символу - как прерывания прекращаются несмотря на все танцы с бубном. Но ведь должно же быть хоть какое-то логическое объяснение происходящему!

Изменено пользователем Nikitoc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не применительно к данному контроллеру, а по идеологии: прерывание вычитывает только один быйт и помещает его в буфер (скорее кольцевой). В основном потоке идет обработка принятых данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но ведь должно же быть хоть какое-то логическое объяснение происходящему!

Мне тоже интересно:) Давайте посмотрим на код HostProt_Parser()? (желательно упрощённый вариант, при котором ошибка ещё воспроизводится)

Ну или попробуйте сделать ещё один финт - перед каждым чтением DR вычитывайте SR. Это вычистит ошибки, может в них дело.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте посмотрим на код HostProt_Parser()

В действительности там нет ничего особенного - я ожидаю RXNE, считываю байт-два оправляю строку в ответ и т.д.

После HostProt_Parser() - вычитываю SR - его значение 0x0280 - т.е. никаких ошибок, установлены только флаги CTS и TXE. И при этом дальнейших прерываний не происходит :laughing:

Изменено пользователем Nikitoc

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

e846e7aa0326.jpg

помогите понять в чем дело. выставляю приоритеты так. и в обработчик прерывания от UART системным таймером хоть убей не перебивается

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я банальную вещь скажу, но либо это место в библиотеке не выполняется, либо поверх кто-то что-то пишет.

Проверяйте значения регистров (благо их немного совсем), потом выясняйте всю иерархию - кто, когда и откуда в них пишет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...