STM32 & ST-LINK - Невозможно подключиться к MCU после успешного программирования


13

Я построил свою собственную плату с STM32F7-45VGT6. Я успешно запрограммировал его с помощью ST-LINK v2 (но не оригинального) и теперь даже не могу подключиться к MCU.

Я использую ST-Link Utility из интерфейса ST и SWD. Это может быть случай, когда я использую выводы SWD в качестве вывода, и в своем коде я установил их как вывод GPIO. Может ли это быть так?

Тем не менее, я подключаю свой контакт сброса к GND и устанавливаю опцию «Подключить при сбросе» в утилите ST-Link, но она не работает ... Что я могу сделать?

В интернете я нашел кое-что об использовании BOOT0 Pin, но точно не знаю ...


«Может случиться, что я использую выводы SWD в качестве выходных данных», это возможно, но единственный, кто узнает, это вы, если только вы не имеете в виду поврежденную загрузку прошивки, которая не умышленно делает это, но может быть в результате ошибка, которая действительно случается. Как правило, это можно восстановить, выполнив начальное подключение SWD с установленным аппаратным сбросом, либо вручную, либо автоматически. Если вы хотите использовать выводы SWD в качестве задержки ввода-вывода на пару секунд, прежде чем выполнять эту настройку, вы можете упростить разработку, но понимаете, что это все равно означает, что вы не можете использовать отладчик.
Крис Страттон

Ответы:


21

Мне удалось решить эту проблему. Если кто-нибудь сталкивается с подобной проблемой, вот что я сделал:

Я использовал ST-Link v2 и ST-Link Utility. В настройках я установил «Подключить при сбросе» и интерфейс SWD (я не уверен насчет частоты).
Затем я нажимаю кнопку сброса на моей плате и нажимаю «Target» -> «Erase chip», и сразу после нажатия я отпускаю кнопку - она ​​стерла чип, чтобы я теперь мог перепрограммировать свой MCU.


В любом случае, если вам нужно использовать выводы SWD в качестве вывода, добавьте некоторую задержку в начале программы или используйте перемычку, чтобы отключить / включить установку этих выводов в качестве выходов.


Да, этого вполне можно ожидать, если вы используете выводы SWD для других целей. Опыт показывает, что даже конструкции STM32, которые не делают этого намеренно, могут иногда «застрять» в режиме, когда контакты SWD не отвечают (повреждена программа?) И требуют такого лечения для восстановления.
Крис Страттон

1
В Linux я использовал эту команду bash, чтобы стереть чип: st-flash
erase

Чип Erase не работал для меня. Я пошел в Target -> Erase Sectors -> Select all -> apply. После этого я снова получил доступ к своей доске. Я не уверен, почему стирание чипа не
andrew

6

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


Если во время включения питания вы подняли вывод BOOT0 на высокий уровень, MCU запустится во внутренний загрузчик, и вы сможете получить доступ, используя несколько последовательных протоколов (см. Справочное руководство для получения дополнительной информации).

Внутри загрузчика должны быть доступны выводы SWD, но я не уверен на 100% в этом.

ST Flash Loader Demonstrator - это инструмент, который позволяет стирать / программировать микро, используя интерфейс UART. Если вы не можете получить доступ к любому из UART вашего микро, это решение не будет работать для вас.


Я могу получить доступ к USART3, который поддерживается загрузчиком, поэтому я попробую это позже - это будет сложно, потому что BOOT0 привязан к GND на плате ... Но я хочу знать, что не так. Что я сделал не так? Я установил выводы SWD / JTAG в качестве выходов в моей функции main (). Но в руководстве сказано, что во время сброса все контакты имеют функцию по умолчанию и могут быть использованы немедленно. Так почему я не могу стереть вспышку при перезагрузке? Я также тестировал U-LINK 2 programmer и uVision 5. Я надеюсь, что уровень защиты не был установлен - как-то случайно - установлен. Я не устанавливал такие биты, но есть ли способ проверить, в порядке ли защитные биты?
zupazt3

@ zupazt3 Я не хочу показаться грубым, но, пожалуйста, перечитайте мое первое предложение. Содержит ответ на проблему с переустановленным соединением. Если вы этого не понимаете, оставьте более конкретный комментарий.
Арсенал

Но я не связываю это все время :) В моем первом посте я имел в виду, что Я ДАЖЕ связал это непосредственно с GND, чтобы проверить, поможет ли это. Но обычно я не привязываю NRST к GND, а к программисту, поэтому он контролирует сброс. И это все еще не соединится. Я также пытался использовать U-Link 2 и Keil uVision 5, но с тем же результатом. В чем может быть причина?
zupazt3

@ zupazt3, что не совсем понятно из твоего вопроса. Возможно, может помочь увеличение часов SWD, поскольку оно может получить соединение до того, как цель переключится на выход. Но я случайно установил выводы SWD на выход и не смог подключиться к моей цели, и только с помощью BOOT0 я смог восстановить его, если вы привязали их к заземлению напрямую (без резистора), это будет жесткий.
Арсенал

1
Мне наконец удалось стереть чип! С помощью ST-Link Utility - я нажал кнопку сброса, нажал кнопку «полное стирание» и отпустил кнопку, она как-то стерлась сама и теперь работает. Я пробовал это раньше, но только сейчас это сработало.
zupazt3

3

если вы используете stmcubemx, вам нужно настроить последовательный провод на вкладке распиновки stmcube. на вкладке распиновки нажмите SYS и измените параметр отладки на последовательный провод. это решит мою проблему, и, возможно, вашу проблему тоже.


Хотя это может быть проблемой, если оставление выводов SWD в режиме включения по умолчанию в режиме SWD не является настройкой по умолчанию для этого программного пакета, это, возможно, довольно серьезный дефект юзабилити, который требует сообщения об ошибке и исправления. Вы уверены, что не изменили настройки по сравнению с их первоначальными значениями или не начали с конкретного проекта, который требовал использования этих контактов не по умолчанию?
Крис Страттон

Во-первых, я просто установил мои контакты как SYS_SW .... но они окрашены в оранжевый цвет. Также была проблема с подключением к чипу после загрузки кода. Когда я выбрал режим отладки в SYS-Serial Wire, микросхема подключается нормально после прошивки.
ГТУ

1

Я загрузил некоторый код на свою собственную плату STM32F427. Тогда я больше не могу подключиться к своей плате с помощью утилиты ST-LINK. Я думаю, что мой код испортил конфигурации контактов порта отладки (? Не могу подтвердить). Я сделал следующее, чтобы установить соединение и перепрограммировать мою плату:

  1. Откройте утилиту ST-LINK и приготовьтесь «Подключиться» в меню «Цель».
  2. Подайте питание на вашу плату (в моем случае я использую USB-кабель) и В ТО ЖЕ ВРЕМЯ нажмите кнопку «Подключиться» в утилите ST-LINK.

Я восстановил 2 доски с помощью этого трюка. Надеюсь это поможет. --Bob


1

Как Дили сказал:

если вы используете stmcubemx, вам нужно настроить последовательный провод на вкладке распиновки stmcube. на вкладке распиновки нажмите SYS и измените параметр отладки на последовательный провод. это решит мою проблему, и, возможно, вашу проблему тоже.

STM32CubeMx не настраивает порт отладки по умолчанию, следовательно, ST-Link перестанет работать, как только вы загрузите свой код. Вы должны стереть чип с помощью ST-Link Utility, например. Чтобы подключиться к MCU, мне пришлось во время включения питания сильно тянуть контакт BOOT0, чтобы активировать загрузчик. Затем перейдите в меню Tarjet и стереть чип .


0

Чтобы перепрограммировать MCU, удерживайте кнопку сброса и выберите «Подключиться к устройству» в ST-Link Utility или нажмите «загрузить» в вашей IDE (например, Keil), а затем отпустите кнопку сброса.


-1

Загрузочные контакты (биты в некоторых версиях) могут препятствовать запуску отладчика. Убедитесь, что вы не внедрили загрузочный шаблон при запуске (определенный двоичный шаблон на контактах boot0 и boot1), иначе ваш MCU перейдет в состояние загрузки.


Я привязал контакт boot0 к GND ... Я не уверен в том, что вы написали, потому что - как я уже сказал - мне удалось успешно запрограммировать мою флэш-память, и программа все еще выполняется сама на MCU - я просто не могу подключиться к MCU с ST -Ссылка через интерфейс SWD. При сбросе он не должен выполнять загрузку, а контакты должны быть в состоянии по умолчанию, поэтому я не понимаю, почему он не подключается.
zupazt3

Вы уверены, что? Как вы думаете, какая комбинация отключит SWD таким образом, что манипулирование сбросом не может переопределить?
Крис Страттон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.