Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Вт окт 25, 2022 16:29:40

Пытаюсь таки впервые в жизни отладку при помощи 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 прошивалки - подтянут к земле резистором в мегаом).

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

Вт окт 25, 2022 16:50:47

также постоянно пишет "NRST is not connected", хоть я и соединил NRST чипа и st-link.

На тех свистках NRST для STM8, нужна доработка.

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

Вт окт 25, 2022 17:19:24

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'у не нравится, но чуть начал "шагать" по коду после точки остановки, как связь обломилась.

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

Вт окт 25, 2022 18:04:47

Код для отладуи в flash или sram запускаешь? Стек инициализировать не забыл? Ремап делал?

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

Вт окт 25, 2022 19:04:02

Код из флеша, конечно - я в RAM никогда не переношу исполняемый код. Стек инициирован, ремапа нет. Ноги SWD ничем не заняты.
А ведь во время работы отладчика прерывания обязаны работать? Получается, что пока он пошагово дергает исполнение, каждую миллисекунду идет SOF, и ведь чип как-то на него может реагировать (помимо синхронизации таймера).

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

Вт окт 25, 2022 19:22:55

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

Не понимаю как можно зафейлить USB-код при переносе с F103 на F0. Там разница только в ширине PAM-буфера и встроенном резисторе. Остальное бит в бит рабтает.

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

Вт окт 25, 2022 19:53:25

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

И вообще, сделал уже несколько вариантов работы с USB, но вижу, что все еще совершенно неоптимально. Тот же кольцевой буфер нужно и на прием реализовать. И с CAN, наверное, так же сделать: увеличить буфер и работать по прерываниям, а не поллингом (хотя, на достаточно хорошо забитой шине с 250кбод я не встречал пропуска пакетов, но он вполне может быть - ведь F042 достаточно медлителен).
В общем, с такими запросами мне и 32кБ ОЗУ не хватит!..

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

Ср окт 26, 2022 01:03:58

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

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

Ср окт 26, 2022 09:58:41

Мурик, спасибо, попробую.
Ну, охренеть, убивается на делении вот здесь:
Код:
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
...

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

Ср окт 26, 2022 11:09:57

Прикол чисто для информации: при использовании CMSIS от STшников вдруг обнаружил, что название векторов в таблице прописаны не все! То есть объявляю обработчик от условного компаратора, включаю прерывание, а процессор сваливается в default_handler, что сильно сбивало с толку. Будьте внимательны с файлами от производителя, там могут быть подвохи!

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

Ср окт 26, 2022 12:13:41

VladislavS писал(а):Но периферия то продолжает работать

Работу части периферии можно приостанавливать при работе в прерывании в регистрах DBGMCU -> APBxFZ. Например, если таймеры работают парой ведущий-ведомый, то можно замораживать работу ведущего, выполняя под отладчиком код ведомого.

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

Ср окт 26, 2022 15:07:09

>TEHb<, я базу стартапа стащил из opencm3 и понемногу туда нужные мне камни вручную копипастил, сверяясь, чтобы имена обработчиков прерывания в духе предыдущих были.
А вот описания регистров и флагов брал от ST (еще из SPL, кажись, выдирал), и там кое-чего не было, приходилось вручную дописывать. Ну, тут хоть не так все плачевно, как с STM8: для них мне вообще пришлось заголовочный файл вручную формировать по мануалу. Благо, хоть регистров и флагов там негусто. Из SPL для STM8 выдрать нельзя было, т.к. оказалось, что дурной sdcc не оптимизирует, если ты к регистрам как к элементам структуры обращаешься (а кроме sdcc под STM8 компиляторов не существует).

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

Ср окт 26, 2022 15:26:43

Eddy_Em писал(а):а кроме sdcc под STM8 компиляторов не существует).

Уже не один год есть бесплатный от самой STM. Они его у кого-то купили. Почитай.

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

Ср окт 26, 2022 15:35:31

tonyk, cosmic что ли? Разве оно под линуксом работает?
Ну, мне все равно пока не нужно. Я прикинул по производительности, периферии и ценам, и решил, что таки STM32F030 гораздо приятней, чем STM8. А уж если брать STM32F0x2, то будет еще и USB (причем, без необходимости напаивать кварц); да и CAN будет работать одновременно с USB (собственно, на STM32F042 я и делаю простейшие переходники CAN-USB, а на основе F072 — всякие железки, где периферия побогаче нужна). Вот только грусть-печаль, что нельзя F042 программно в DFU-режим загнать, как F072, приходится кнопочки "boot" и "reset" напаивать для программирования, либо выводить SWD (а это не всегда возможно).

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

Чт окт 27, 2022 13:01:48

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

P.S. Да, st-link так и продолжает отваливаться через какое-то время после подключения USB. Приходится для заливки прошивки или старта дебаггера сначала выдернуть USB-шнурок из платы, а потом уже его вставлять. Правда, дебаг длительный тоже не сделать: буквально через 5-10с после останова оно ругается на разрыв соединения.

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

Чт окт 27, 2022 13:19:38

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

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

Чт окт 27, 2022 16:19:41

Куда уж нативнее? gdb - нативней некуда!

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

Пт мар 29, 2024 19:41:49

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


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