реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103+USB Keil ST-Link отладка
igorle
сообщение Oct 28 2013, 20:05
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Есть проект, основанный на ST MassStorage примере. Кроме того, добавлен мой код для работы с UART.

Иногда работает без проблем, иногда на старте умирает. Причем умирает так, что дебагером уже не подключиться. Проблема явно в коде, связанном с USB. Если идем по шагам в дебагере - все работает. Как только убираю все брек поинты и продолжаю бежать код - то одно из двух. Или все работает долго и счастливо. Или затыкается совершенно. Так что отладчик в Кейле выдает ошибку "Cannot access target. Shutting down debugging session" После того подключиться можно только после сброса питания процессора. Похоже, что проблема возникает, если мое устройство не обработало вовремя какой-то пакет от USB хоста.

Кто-то может посоветовать - как узнать, что случилось перед смертью?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 28 2013, 20:35
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (igorle @ Oct 28 2013, 23:05) *
После того подключиться можно только после сброса питания процессора.

Если нога reset тоже помогает, то можно писать какой-то лог в ОЗУ. Поставить точку останова перед процедурой инициализации, чтобы после сброса можно было прочитать содержимое лога перед его затиранием.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Вячик13
сообщение Oct 29 2013, 06:07
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 71
Регистрация: 17-01-12
Пользователь №: 69 604



А нигде в коде не встречается следующая строка:

AFIO->MAPR = (AFIO->MAPR & ~AFIO_MAPR_SWJ_CFG) | AFIO_MAPR_SWJ_CFG_DISABLE; ?

Это отключение JTAG.

Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 29 2013, 07:38
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Я отлаживаю через SWD, не через JTAG. И борд действительно умирает - перестают даже мигать леды, что переключаются в каждом интерапте.

Писать в RAM, а потом читать после ресета - идея красивая. Вот только я не знаю, где именно происходит проблема. Дебаге весь код проходит отлично. Да и так работает с вероятностью 70 процентов. Ставить "маячки" на прохождение каких-то точек можно. Но кода в USB много.

У меня сложилось впечатление, что как работает USB не знает никто sm.gif. Все берут какой-то пример с USB от третьих лиц, и вокруг уже накручивают свою функциональность, стараясь не прикасаться к USB.

Судя по всему - проблема на этапе распознавания USB устройства компьютером.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 29 2013, 08:20
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А это все под какой-нибудь ОС вертится? Может, просто стека не хватает
Попробуйте для исключений написать заглушки, чтобы определяли хоты бы адрес, из которого туда попали
Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 29 2013, 12:47
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Нет никакой ОС. Есть пример MassStorage, где весь код работает в прерывании.
Есть SD card, для которого реализованы синхронные запись и чтение блока
Есть UART - в интеррапте берутся полученные байты и складываются в буфер
И есть цикл, который смотрит - не пришло ли что-то из UARTа, и если пришло - то обрабатывает. Когда накопится достаточно информации - записывает данные на карту, используя FatFS

Затык происходит во время инициализации USB. Похоже, что если устройство замешкается и не обработает вовремя пакет от хоста - то происходит сбой. А точнее поймать ничего не могу. sad.gif
Go to the top of the page
 
+Quote Post
toweroff
сообщение Oct 29 2013, 12:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(igorle @ Oct 29 2013, 16:47) *
А точнее поймать ничего не могу. sad.gif

ну так процессор-то все равно должен где-то вертеться??
напишите заглушки для exception, примерно такие:

Код
volatile unsigned int abort_address;

void CheckUndefined(void)
{
    abort_address = __return_address();
    while(1);    
}

void CheckSWI(void)
{
    abort_address = __return_address();
    while(1);    
}

void CheckAbort(void)
{
    abort_address = __return_address();
    while(1);    
}

void CheckPrefetch(void)
{
    abort_address = __return_address();
    while(1);    
}

void CheckReserved(void)
{
    abort_address = __return_address();
    while(1);    
}


ну и в стартапе их прописать

запуститься из-под отладчика и ждать сбоя sm.gif
как раз будет понятно, какое исключение случилось и откуда оно случилось
Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 29 2013, 14:29
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(toweroff @ Oct 29 2013, 16:55) *
ну так процессор-то все равно должен где-то вертеться??
напишите заглушки для exception, примерно такие:
...

Не, такие проблемы я уже научился отлавливать. Если процессор где-то вертится, то я могу подцепиться дебагером и посмотреть стек, регистры и примерно понять - где произошла ошибка.

А у меня - процессор не реагирует, из отладчика вываливается с сообщением "Cannot access target. Shutting down debugging session". Снова подцепиться дебагером не могу, пока не дерну ножку ресет
Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 31 2013, 17:31
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Я несколько продвинулся. Скорее всего, проблема в том, что есть код в usb_pwr.c, который отправляет процессор спать (suspend). Похоже, что этот сон слишком глубокий для моего устройства.
Я пытался решить проблему в лоб - изменить флаг fSuspendEnabled на FALSE. Это помогло, в том смысле, что теперь процессор не отваливается. Но у хоста занимает много времени распознать устройства. Так-же перестали приходить прерывания USBWakeUp.

Если кто-то натыкался на эту проблему - поделитесь знаниями, пожалуйста. Я пока погуглил "STM32 USB fSuspendEnabled trouble", и понял что не одинок в своей беде. Но решения еще не нашел.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:59
Рейтинг@Mail.ru


Страница сгенерированна за 0.01438 секунд с 7
ELECTRONIX ©2004-2016