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.
Теперь я могу получить входящий кадр надежно.
Спасибо за комментарии и помощь.