STM32F042C6T6: не работает SWD при подключенном USB

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Пытаюсь таки впервые в жизни отладку при помощи gdb попробовать (т.к. непонятно в каком месте кода у меня явно вызывается hardfault, скорей всего, из-за невыровненного обращения к чему-то, т.к. на STM32F103 тот же самый код прекрасно работает). И как только подключаю USB, у меня ни прошивка через st-link не работает, ни отладка. Вот, что пишет openocd на это:

Код: Выделить всё

Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 6300ms
Отключал питание от st-link, чтобы только от USB было - не помогло. Пробовал другой st-link - тоже 0 реакции. st-link - обычный, с алиэкспресса за полтора или два бакса (не помню уж, почем брал).
Кстати, еще один глюк этого st-link:

Код: Выделить всё

st-flash reset
st-flash 1.7.0
Failed to parse flash type or unrecognized flash type
2022-10-25T16:27:18 INFO common.c: STM32F04x: 6 KiB SRAM, 32 KiB flash in at least 1 KiB pages.
2022-10-25T16:27:18 WARN common.c: NRST is not connected
Постоянно пишет, что не может определить тип флеша (но при этом МК прошивается и отладка без USB работает), а также постоянно пишет "NRST is not connected", хоть я и соединил NRST чипа и st-link. Может, ему нужно внешнюю подтяжку к NRST, чтобы он таки увидел, что "connected" (хотя, исходя из здравого смысла, проверка должна проводиться просто в режиме floating input, а выход RST прошивалки - подтянут к земле резистором в мегаом).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4309825#p4309825"]также постоянно пишет "NRST is not connected", хоть я и соединил NRST чипа и st-link.[/uquote]
На тех свистках NRST для STM8, нужна доработка.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Reflector, что-то подозрительно это выглядит: ведь там предлагают ногу NRST камня из st-link соединить с NRST своего!

В общем, раскопал я старый st-link (который с jtag) - он не отваливается, когда я подключаю USB, но у него нужно 3.3В с моей платы на Vapp подключать, чтобы работало.
Запустил отладку и понял, что она бесполезна: как я выловлю, что у меня происходит, если сразу после ввода определенных данных по USB камень уходит в blocking handler? Пошаговую здесь не запустишь, разве что breakpoint'ов понатыкать на стадии обработки введенных пользователем данных - ХЗ, в общем…

UPD, ан, нет, факир был пьян:

Код: Выделить всё

jtag status contains invalid mode value - communication failure
Previous state query failed, trying to reconnect
Не знаю, что там st-link'у не нравится, но чуть начал "шагать" по коду после точки остановки, как связь обломилась.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Код для отладуи в flash или sram запускаешь? Стек инициализировать не забыл? Ремап делал?
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Код из флеша, конечно - я в RAM никогда не переношу исполняемый код. Стек инициирован, ремапа нет. Ноги SWD ничем не заняты.
А ведь во время работы отладчика прерывания обязаны работать? Получается, что пока он пошагово дергает исполнение, каждую миллисекунду идет SOF, и ведь чип как-то на него может реагировать (помимо синхронизации таймера).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Ну и зря. В SRAM быстрее и удобнее отлаживаться. Что значит прерывания должны работать во время работы отладчика? Пока программа не остановилась на точке останова всё работает штатно. Во время останова никакой код, естественно, не выполняется. Но периферия то продолжает работать, флаги взводятся, счётчики тикают. SOF-ы вообще аппаратно обрабатываются.

Не понимаю как можно зафейлить USB-код при переносе с F103 на F0. Там разница только в ширине PAM-буфера и встроенном резисторе. Остальное бит в бит рабтает.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

У меня собственно USB нормально работал, пока я не решил перенести код с кольцевым буфером, чтобы повысить скорость работы USB (вдруг где понадобится). И вот, когда стал распихивать функции по образу и подобию F103 и F303 (чтобы был эдакий костяк работы с USB, который легко под другие серии портировать, а не так, как было), то где-то, видимо, "очепятался" или ХЗ, что там еще. Но "в красивом виде" не работает, а "в некрасивом" - работает!
Конечно, частота здесь взяла свое: если на STM32F103 у меня жирный буфер отправлялся со скоростью чуть ли не в 9Мбит/с, то на F042 уже до 6Мбит/с не дотягивает. Возможно, если еще как-то по-уму обработать код (скажем, запускать отправку следующего пакета сразу по прерывании об отправке предыдущего), будет чуть шустрей, но у меня так не заработало (из-за того, что прерывание, внутренности которого неплохо так весят, вызывалось слишком часто). Я просто в суперлупе на каждый проход вызываю функцию, которая и проверяет - не нужно ли очередную порцию данных отправить.

И вообще, сделал уже несколько вариантов работы с USB, но вижу, что все еще совершенно неоптимально. Тот же кольцевой буфер нужно и на прием реализовать. И с CAN, наверное, так же сделать: увеличить буфер и работать по прерываниям, а не поллингом (хотя, на достаточно хорошо забитой шине с 250кбод я не встречал пропуска пакетов, но он вполне может быть - ведь F042 достаточно медлителен).
В общем, с такими запросами мне и 32кБ ОЗУ не хватит!..
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Eddy_Em писал(а):Запустил отладку и понял, что она бесполезна: как я выловлю, что у меня происходит, если сразу после ввода определенных данных по USB камень уходит в blocking handler?
Ставьте точку останова на HardFault_Handler и когда выполнение дойдет до него, смотрите историю вызова функций (Call Stack). Примерно как здесь http://purebasic.mybb.ru/viewtopic.php?id=564#p7599
Тогда узнаете всю цепочку вызова функций, которая привела в сбою.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Мурик, спасибо, попробую.
Ну, охренеть, убивается на делении вот здесь:

Код: Выделить всё

char *u2str(uint32_t val){
    static char strbuf[11];
    char *bufptr = &strbuf[10];
    *bufptr = 0;
    if(!val){
        *(--bufptr) = '0';
    }else{
        while(val){
            *(--bufptr) = val % 10 + '0';
            val /= 10;
        }
    }
    return bufptr;
}
При этом другой код с точно такой же функцией нормально работает (да и много где оно у меня используется)!

Добавлено after 57 minutes 47 seconds:
Вот же япона городовой! Взял Makefile из другого места, заработало! Видать, что-то я левое там накорячил, что у меня софтовое деление не работало... Сейчас гляну.

Вот же япона городовой! Не добавил LD_FLAGS += $(ARCH_FLAGS)!

Добавлено after 31 minute 14 seconds:
Итак, спасибо Мурик. Ошибка была в делении: т.к. оно софтовое. Однако, т.к. я про[censored] в Makefile указание архитектуры линкеру (видать, слишком "наоптимизировал" Makefile), то деление, видимо, пыталось вызваться аппаратное → хардфолт.
ОК. В кои-то веки не без пинков от VladislavS и прочих я оценил возможности gdb. Теперь надо литературы по нему скачать и почитать, там много чего интересного есть.
Правда, косяки в работе самих real-time протоколов таким образом отладить будет сложновато (и уж точно без "отваливания" от линии связи на время отладки это никак не сделать). Вот если бы gdb умел условный трейс с мониторингом в файл писать (а может и умеет? надо читать).

Однако, все это не отменяет того факта, что никакой st-link не работает с моим STM32F042 (плата отсюда, просто первая попавшаяся под рукой была, я и решил к ней кольцевой буфер на USB прикрутить). Стоит лишь подключить USB, как make flash отваливается. И отладка буквально через несколько секунд после подвисания помирает с матюками вроде

Код: Выделить всё

Info : dropped 'gdb' connection
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 100ms
Info : Previous state query failed, trying to reconnect
...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 5816
Зарегистрирован: Ср ноя 11, 2009 17:19:30
Откуда: Воронеж

Сообщение >TEHb< »

Прикол чисто для информации: при использовании CMSIS от STшников вдруг обнаружил, что название векторов в таблице прописаны не все! То есть объявляю обработчик от условного компаратора, включаю прерывание, а процессор сваливается в default_handler, что сильно сбивало с толку. Будьте внимательны с файлами от производителя, там могут быть подвохи!
Усложнять просто. Упрощать сложно.
Контактная информация:
Это не хвост, это антенна
Сообщения: 1339
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

VladislavS писал(а):Но периферия то продолжает работать
Работу части периферии можно приостанавливать при работе в прерывании в регистрах DBGMCU -> APBxFZ. Например, если таймеры работают парой ведущий-ведомый, то можно замораживать работу ведущего, выполняя под отладчиком код ведомого.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

>TEHb<, я базу стартапа стащил из opencm3 и понемногу туда нужные мне камни вручную копипастил, сверяясь, чтобы имена обработчиков прерывания в духе предыдущих были.
А вот описания регистров и флагов брал от ST (еще из SPL, кажись, выдирал), и там кое-чего не было, приходилось вручную дописывать. Ну, тут хоть не так все плачевно, как с STM8: для них мне вообще пришлось заголовочный файл вручную формировать по мануалу. Благо, хоть регистров и флагов там негусто. Из SPL для STM8 выдрать нельзя было, т.к. оказалось, что дурной sdcc не оптимизирует, если ты к регистрам как к элементам структуры обращаешься (а кроме sdcc под STM8 компиляторов не существует).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Это не хвост, это антенна
Сообщения: 1339
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Сообщение tonyk »

Eddy_Em писал(а):а кроме sdcc под STM8 компиляторов не существует).
Уже не один год есть бесплатный от самой STM. Они его у кого-то купили. Почитай.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

tonyk, cosmic что ли? Разве оно под линуксом работает?
Ну, мне все равно пока не нужно. Я прикинул по производительности, периферии и ценам, и решил, что таки STM32F030 гораздо приятней, чем STM8. А уж если брать STM32F0x2, то будет еще и USB (причем, без необходимости напаивать кварц); да и CAN будет работать одновременно с USB (собственно, на STM32F042 я и делаю простейшие переходники CAN-USB, а на основе F072 — всякие железки, где периферия побогаче нужна). Вот только грусть-печаль, что нельзя F042 программно в DFU-режим загнать, как F072, приходится кнопочки "boot" и "reset" напаивать для программирования, либо выводить SWD (а это не всегда возможно).
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

В общем, выложил код на гитхаб. Теперь у меня есть вариант USB с двумя круговыми буферами (и на передачу, и на прием), причем отправку и прием очередной порции данных я запихал в прерывания (раньше это поллингом делалось). Правда, на STM32F042C6T6 время передачи данных уменьшилось совсем незначительно по сравнению с поллингом (т.к. слабоват он, приличное количество времени на накладные расходы по работе с буферами тратится, так что выше ~5.1Мбит/с никак не выходит). Надо будет проверить, улучшилось ли на F303 - вдруг все 12Мбит/с вытянуть получится?

P.S. Да, st-link так и продолжает отваливаться через какое-то время после подключения USB. Приходится для заливки прошивки или старта дебаггера сначала выдернуть USB-шнурок из платы, а потом уже его вставлять. Правда, дебаг длительный тоже не сделать: буквально через 5-10с после останова оно ругается на разрыв соединения.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
u37
Это не хвост, это антенна
Сообщения: 1352
Зарегистрирован: Пн май 01, 2017 20:01:45

Сообщение u37 »

Помнится, неоднократно были темы [думаю, не нужно указывать где] типа "SWD не подключается" или "работает плохо", и в них были полезные советы.
Впрочем, лично я как-то слабо верю в "железячные" проблемы. Скорее, это ваши личные заморочки из-за софта. Подключайте и пользуйте отладочный инструмент нативно.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Куда уж нативнее? gdb - нативней некуда!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Родился
Сообщения: 1
Зарегистрирован: Пт мар 29, 2024 19:22:53

Сообщение aneox »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4309825#p4309825"]Info : Previous state query failed, trying to reconnect
Error: jtag status contains invalid mode value - communication failure
Polling target stm32f0x.cpu failed, trying to reexamine
Examination failed, GDB will be halted. Polling again in 6300ms[/uquote]

удалось разобраться? у меня такая же беда с f105, когда включаю usb
Ответить

Вернуться в «ARM»