STM32 USART Rx Interrupt не работает правильно

Я использую STM32F407 и работаю над проектом, который я пытаюсь получить с помощью USART3.

Обзор проекта:

Я должен послать специальный PWM секвенс по проводу. После того, как я отправил ШИМ, я сразу же получил ответ о последовательных данных (стандарт USART, 8N1). Я генерирую ШИМ с прерыванием обновления timer1. После последнего импульса я деактивирую прерывание по таймеру1 и активирую прерывание по USART Rx. Тогда - обычно - я должен получить серийные данные. Код, который получает данные и сохраняет их в кольцевом буфере, прекрасно работает в другом проекте.

Моя проблема:

Последовательные данные, которые поступают, иногда будут приниматься правильно (это поток из 96 отдельных байтов). С помощью осциллографа, который может декодировать сигналы USART, я вижу, что правильные данные поступают на вывод RX USART. Но прерывание USART Rx работает неправильно. В основном я получаю только один байт (только одно прерывание). Для отладки ISR я сохранил регистр SR, DR и CR1 в массиве, чтобы записать, какие из флагов ошибок произошли. Значения в регистре показывают мне, что каждый раз, когда прием кадра не удался, у меня установлен один или несколько разных флагов ошибок. Ошибка шума, ошибка переполнения и ошибка кадрирования. Но если иногда прием работает, я вижу, что никаких флагов ошибок не было установлено.

Я думал, что прерывание Rx будет генерироваться каждый раз, когда байт прибыл в USART независимо от состояния флагов ошибок...

Я действительно понятия не имею, почему ISR работает только один раз, если есть флаг ошибки.

Может ли кто-нибудь помочь мне?

Обновление 1

Вот краткое обновление. Я говорил с кем-то, кто сказал мне, что может быть проблема в том, что USART тоже получает сигналы ШИМ. Я постараюсь изменить состояние вывода в качестве выхода, пока USART еще работает. После последнего импульса ШИМ я изменю состояние контакта как вход RAS UASRT. Возможно, это могло бы решить проблему, если USART может принимать только последовательные сигналы. Я опубликую свой прогресс здесь.

Решение

На прошлой неделе я решил свои проблемы.

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

Второй проблемой было плохое качество сигнала. USART STM32 имеет возможность работать в режиме ONEBIT. Этот режим (как я понял) сэмплирует бит ervery только один раз, а не три раза каждого бита. Поэтому я увеличил допуск моего USART до 3,88%.

Наконец, но это только для безопасности, я очистил все ожидающие биты прерывания USART перед тем, как активировать прерывание USART Rx.

Теперь я могу получить входящий кадр надежно.

Спасибо за комментарии и помощь.

0 ответов

Другие вопросы по тегам