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

HardFault при одновременной передаче/приеме по UART на STM32F405

Всем привет.

Есть проблема - периодически МК падает в HardFault во время обмена по UART. Процессор - STM32F405.

Формат общения - Запрос-Ответ - чужое устройство посылает команды по UART, которые МК должен обработать и отправить ответ. Скорость обмена 115200, 8N1.

Работало стабильно, но до того момента, пока обмен не стал более интенсивным.

 

Подцепил логический анализатор на шину и увидел, что в момент, когда МК отправляет данные, устройство тоже что-то пытается отправить - после чего логика работы МК рушится и он падает в HardFault. На скриншоте записанный обмен - верхняя линии это команды от устройства, нижняя - ответы МК, соответственно.

 

В момент, когда МК отправляет ответ устройству, тот по непонятной причине сам отправляет какой-то мусор (судя по содержимому) в МК, в результате последний сходит с ума и шлет какой-то адовый по своему размеру буфер (при этом в отладчике видно, что длина данных при отправке была указана верно), после чего падает.

 

Почему такое происходит и как бороться?

 

P.S. Падение в HardFault может произойти и через 5-10 минут, а может и через 1,5 часа.

post-89977-1490543167_thumb.png

Изменено пользователем haker_fox
Уточнил название темы, добавил теги, переместил в нужный раздел.

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


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

Почему такое происходит и как бороться?

 

Тяжела работа телепата... С хорошей долей вероятности ищите проблему в коде. Скорее всего в обработчике UART'а или около того. Аппаратная заморочка практически 100% исключена.

 

А уж что у Вас там написано - это Вам виднее. Перекрытие буферов, не отключение приемного канала (если реально жесткий полудуплекс), перезаписывание структур - причин масса.

 

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


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

Режим обмена - ну да, фактически полудуплекс. В буфере, который я отправляю в ответ, есть заголовок, в нем длина данных - значение там верное. Почему принимающая сторона начинает отправку данных, не дожидаясь конца пакета - вопрос интересный, но мне больше интересно, как обойти эту проблему, ведь именно после этой внеплановой посылки мой проц сходит с ума и отправляет гораздо больше данных, чем должен. То есть пришедшие от устройства данные что-то портят в настройках УАРТа - выглядит это так.

 

Попробовал на время обработки полученных данных и отправки ответа отключать приемную линию - в регистре CR1 обнулил бит RE - не помогло, все равно упало..

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


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

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

Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние.

Вам уже сказали - ищите проблему у себя.

Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое.

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


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

Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние.

Вам уже сказали - ищите проблему у себя.

Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое.

 

 

Так я и не спорю с этим - понятно, что проблема в моем коде. Сигналы анализатором решил посмотреть для понимания.

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


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

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

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

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

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

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

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

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

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

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