Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: HardFault при одновременной передаче/приеме по UART.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
charkin
Всем привет.
Есть проблема - периодически МК падает в HardFault во время обмена по UART. Процессор - STM32F405.
Формат общения - Запрос-Ответ - чужое устройство посылает команды по UART, которые МК должен обработать и отправить ответ. Скорость обмена 115200, 8N1.
Работало стабильно, но до того момента, пока обмен не стал более интенсивным.

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

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

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

P.S. Падение в HardFault может произойти и через 5-10 минут, а может и через 1,5 часа.
Alex A. Mihaylov
Цитата(charkin @ Mar 26 2017, 18:46) *
Почему такое происходит и как бороться?


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

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

Попробовал на время обработки полученных данных и отправки ответа отключать приемную линию - в регистре CR1 обнулил бит RE - не помогло, все равно упало..
jcxz
Цитата(charkin @ Mar 26 2017, 20:05) *
Режим обмена - ну да, фактически полудуплекс. В буфере, который я отправляю в ответ, есть заголовок, в нем длина данных - значение там верное. Почему принимающая сторона начинает отправку данных, не дожидаясь конца пакета - вопрос интересный, но мне больше интересно, как обойти эту проблему,

Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние.
Вам уже сказали - ищите проблему у себя.
Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое.
charkin
Цитата(jcxz @ Mar 27 2017, 00:34) *
Проблема в Вашем кривом коде. Та сторона тут не при чём, как сигналы и осциллограф - тут лишние.
Вам уже сказали - ищите проблему у себя.
Что бы ни отправляла удалённая сторона, пускай совершенный бред - принимающее ПО не должно от этого виснуть или вылетать в исключение. Если так происходит - это ПО кривое.



Так я и не спорю с этим - понятно, что проблема в моем коде. Сигналы анализатором решил посмотреть для понимания.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.