STM32 i ST-LINK - Nie można połączyć się z MCU po udanym programowaniu

13

Zbudowałem własną płytę z STM32F7-45VGT6. Z powodzeniem zaprogramowałem go za pomocą ST-LINK v2 (choć nie oryginalnego), a teraz nie mogę nawet połączyć się z MCU.

Używam ST-Link Utility z interfejsu ST i SWD. Może być tak, że używam pinów SWD jako wyjścia i w swoim kodzie ustawiam je jako wyjście GPIO. Czy może tak być?

Mimo to podłączam pin reset do GND i ustawiam opcję „Connect under reset” w ST-Link Utility, ale to nie działa ... Co mogę zrobić?

W Internecie znalazłem coś na temat używania BOOT0 Pin, ale nie wiem dokładnie ...

zupazt3
źródło
„Może być tak, że używam pinów SWD jako wyjścia” to możliwe, ale jedynym, który by cię znał, chyba że masz na myśli zepsute oprogramowanie układowe, które nie robi tego celowo, ale może w wyniku błąd, który rzeczywiście się zdarza. Zasadniczo jest to możliwe do odzyskania przez wykonanie początkowego połączenia SWD z potwierdzeniem resetu sprzętowego, ręcznie lub automatycznie. Jeśli chcesz użyć styków SWD, ponieważ opóźnienie wejścia / wyjścia na kilka sekund przed dokonaniem tego ustawienia może ułatwić programowanie, ale zdaj sobie sprawę, że nadal oznacza to, że nie możesz użyć debugera.
Chris Stratton

Odpowiedzi:

21

Udało mi się rozwiązać ten problem. Jeśli ktoś napotka podobny problem, oto co zrobiłem:

Użyłem ST-Link v2 i ST-Link Utility. W ustawieniach ustawiam „Połącz w trakcie resetowania” i interfejs SWD (nie jestem pewien częstotliwości).
Następnie wciskam przycisk resetowania na mojej płycie i klikam „Cel” -> „Wymaż chip” i zaraz po kliknięciu zwolniłem przycisk - Wymazałem chip, dzięki czemu mogę teraz przeprogramować MCU.


W każdym razie, jeśli potrzebujesz użyć pinów SWD jako wyjścia, dodaj trochę opóźnienia na początku programu lub użyj zworki, aby wyłączyć / włączyć ustawienie tych pinów jako wyjść.

zupazt3
źródło
Tak, tego można się spodziewać, jeśli używasz pinów SWD do innego celu. Doświadczenie pokazuje, że nawet projekty STM32, które nie robią tego celowo, mogą czasami „utknąć” w trybie, w którym piny SWD nie reagują (uszkodzony program?) I wymagają takiego leczenia w celu odzyskania.
Chris Stratton,
1
W systemie Linux użyłem tej komendy bash, aby wymazać układ: st-flash erase
nathan
Chip Erase nie działał dla mnie. Poszedłem do Cel -> Usuń sektory -> Wybierz wszystko -> zastosuj. Po tym odzyskałem dostęp do mojej tablicy. Nie jestem pewien, dlaczego kasowanie chipów nie powiedziało
andrew
6

Aby połączenie z resetem działało, ST-Link musi mieć kontrolę nad pinem resetowania, jeśli przywiążesz go do uziemienia, ST-Link nie ma szans na uruchomienie celu i uzyskanie do niego dostępu.


Jeśli wyciągniesz pin BOOT0 wysoko podczas włączania, MCU uruchomi się w wewnętrznym module ładującym i możesz uzyskać dostęp za pomocą kilku protokołów szeregowych (więcej szczegółów znajdziesz w instrukcji obsługi).

Wewnątrz modułu ładującego piny SWD powinny być dostępne, aby uzyskać dostęp, ale nie jestem tego w 100% pewien.

Demonstrator programu ładującego ST Flash to narzędzie, które umożliwia kasowanie / programowanie mikro za pomocą interfejsu UART. Jeśli nie możesz uzyskać dostępu do żadnego z UART mikroprocesora, to rozwiązanie nie będzie działać.

Arsenał
źródło
Mogę uzyskać dostęp do USART3 obsługiwanego przez bootloader, więc spróbuję później - będzie to trudne, bo BOOT0 jest związany z GND na płytce drukowanej ... Ale chcę wiedzieć, co jest nie tak. Co złego zrobiłem? Ustawiam piny SWD / JTAG jako wyjścia w mojej funkcji main (). Ale w instrukcji napisano, że podczas resetowania wszystkie piny mają domyślną funkcję i można z nich natychmiast korzystać. Dlaczego więc nie mogę skasować pamięci flash podczas resetowania? Testowałem również programator U-LINK 2 i uVision 5. Mam nadzieję, że nie został ustawiony żaden poziom ochrony - jakoś przypadkowo - ustawiony. Nie ustawiłem żadnych takich bitów, ale czy jest jakiś sposób na sprawdzenie, czy bity ochronne są w porządku?
zupazt3
@ zupazt3 Nie chcę brzmieć niegrzecznie, ale proszę ponownie przeczytaj moje pierwsze zdanie. Zawiera odpowiedź na problem z połączeniem w trakcie resetowania. Jeśli nie rozumiesz, opublikuj bardziej szczegółowy komentarz.
Arsenał
Ale nie wiążę tego cały czas :) W moim pierwszym poście miałem na myśli, że JESZCZE związałem go bezpośrednio z GND, aby sprawdzić, czy to pomoże. Ale zwykle nie wiążę NRST z GND, ale z programistą, więc ma kontrolę nad resetowaniem. I nadal się nie łączy. Próbowałem również użyć U-Link 2 i Keil uVision 5, ale z tym samym rezultatem. Co może być przyczyną?
zupazt3
@ zupazt3, które nie były całkiem jasne z twojego pytania. Może może pomóc zwiększenie zegara SWD, ponieważ może on uzyskać połączenie, zanim cel przełączy się na wyjście. Ale przypadkowo ustawiłem piny SWD na wyjście i nie byłem w stanie uzyskać połączenia z moim celem i tylko używając BOOT0 byłem w stanie go odzyskać, jeśli przywiązałeś je bezpośrednio do uziemienia (bez rezystora) to et twardy.
Arsenał
1
W końcu udało mi się usunąć chip! Dzięki ST-Link Utility - nacisnąłem przycisk resetowania, kliknąłem przycisk „pełne kasowanie” i przycisk zwalniający, a jakoś się skasował i teraz działa. Próbowałem tego wcześniej, ale dopiero teraz zadziałało.
zupazt3
3

jeśli używasz stmcubemx, musisz skonfigurować przewód szeregowy na zakładce stmcube pinout. na zakładce pinout kliknij SYS i zmień opcję debugowania na przewód szeregowy. naprawiło mój problem, a może i twój problem.

dili
źródło
Chociaż może to stanowić problem, jeśli pozostawienie styków SWD w domyślnym trybie włączenia zasilania w trybie SWD nie jest domyślnym ustawieniem tego pakietu oprogramowania, jest to prawdopodobnie dość poważna wada użyteczności, która wymaga zgłoszenia błędu i korekty. Czy na pewno nie zmieniłeś ustawień od ich oryginalnych wartości, ani nie zacząłeś od konkretnego projektu, który wymagał użycia tych pinów w sposób inny niż domyślny?
Chris Stratton
Najpierw po prostu ustawiłem moje szpilki jako SYS_SW .... ale były one koloru pomarańczowego. Miałem również problem z połączeniem z chipem po przesłaniu kodu. Kiedy wybrałem tryb debugowania w SYS-Serial Wire, układ łączy się normalnie po flasingu.
gtu
1

Pobrałem trochę kodu na własną płytkę STM32F427. Wtedy nie mogę już połączyć się z moją płytą za pomocą ST-LINK Utility. Myślę, że mój kod popsuł konfiguracje pinów portu debugowania (? Nie można potwierdzić). Wykonałem następujące czynności, aby nawiązać połączenie i przeprogramować płytę:

  1. Otwórz Narzędzie ST-LINK i przygotuj się na „Połącz” w menu Cel.
  2. Zasil swoją płytę (w moim przypadku używam kabla USB) i W TYM SAMYM CZASIE kliknij „Połącz” w Narzędziu ST-LINK.

Za pomocą tej sztuczki przywróciłem 2 plansze. Mam nadzieję że to pomoże. --Kok

Bob Liu
źródło
1

Jak powiedział Dili:

jeśli używasz stmcubemx, musisz skonfigurować przewód szeregowy na zakładce stmcube pinout. na zakładce pinout kliknij SYS i zmień opcję debugowania na przewód szeregowy. naprawiło mój problem, a może i twój problem.

STM32CubeMx domyślnie nie konfiguruje portu debugowania, w związku z czym ST-Link przestanie działać po flashowaniu kodu. Na przykład musisz skasować układ za pomocą ST-link Utility. Aby połączyć się z MCU, musiałem pociągnąć pin BOOT0 wysoko podczas włączania, aby aktywować bootloader. Następnie przejdź do menu Tarjet i wymaż chip .

Pablo Soria
źródło
0

Aby ponownie zaprogramować MCU, przytrzymaj przycisk resetowania i wybierz podłącz do urządzenia w ST-Link Utility lub naciśnij pobierz w swoim IDE (na przykład Keil), a następnie zwolnij przycisk resetowania.

Misagh
źródło
-1

Szpilki rozruchowe (bity w niektórych wersjach) mogą uniemożliwić uruchomienie debugera. Upewnij się, że nie wdrażasz wzorca rozruchu podczas uruchamiania (pewien wzorzec binarny na pinach boot0 i boot1), w przeciwnym razie MCU przejdzie w stan rozruchu.

Lior Bilia
źródło
Mam pin boot0 związany z GND ... Nie jestem pewien, co napisałeś, ponieważ - jak powiedziałem - udało mi się pomyślnie zaprogramować swoją pamięć flash i program nadal wykonuje się na MCU - po prostu nie mogę połączyć się z MCU za pomocą ST -Link przez interfejs SWD. Podczas resetowania nie powinien uruchamiać się, a piny powinny być w stanie domyślnym, więc nie rozumiem, dlaczego się nie łączy.
zupazt3
Jesteś pewien? Jak myślisz, jaką kombinację wyłączyłby SWD w sposób, którego manipulacja resetem nie może zastąpić?
Chris Stratton,