Elektroda.pl
Elektroda.pl
X
Computer Controls
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Rozwiązano] Własny programator SWD stm32

20 Lut 2018 22:44 741 3
  • Poziom 2  
    Witam

    Próbuje od jakiegoś czasu zmusić jeden procesor do zaprogramowanie części pamięci w drugim za pomocą protokołu swd. Bazowałem na początku na dokumentacji odnośnie EFM32 (jedyny cortex m3 który znalazłem w miarę opisany). Niestety zatrzymałem się na etapie, możliwości odczytu, zapisu do pamięci ram oraz odczytu z pamięci flash. Niestety nie jestem w stanie wpisać danych do pamięci flash. Kiedy używam procedury która mi działa w przypadku pamięci ram otrzymuje błąd oraz zostaje wystawiona flaga WDATAERR w rejestrze CTRL/STAT. Kończą mi już się pomysły. Pierwsze moje pomysły zakładały że problem leży w konieczności czyszczenia flesha przed zapisem niestety użycie procesora wyczyszczonego wcześniej nic nie pomogło mimo że przez st-linka jestem w stanie wgrać dane bez czyszczenia takiego procesora. Nie bardzo mam już pomysł gdzie szukać informacji na temat procedury zapisu do pamięci flash. Dlatego pytanie z mojej strony czy któryś z forumowiczów nie próbował się już mierzyć z tym tematem i był by w stanie coś podpowiedzieć. Poniżej fragment kody który o ile wywołuje z adresem pamięci ram działa w pożądku
    Kod: c
    Zaloguj się, aby zobaczyć kod


    natomiast jeżeli chce się odnieść do flasha działa tylko odczyt. Z góry dziękuje za wszystkie podpowiedzi

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod: c
    Zaloguj się, aby zobaczyć kod


    Pozdrawiam
  • Computer Controls
  • Użytkownik usunął konto  
  • Computer Controls
  • Pomocny post
    Specjalista - Mikrokontrolery
    Odpowiedź na Twoje pytanie jest dosyć prosta - protokół SWD nie ma rozkazu zapisu do flash i tego się po prostu nie da tak zrobić jak zapisu do RAM. Oprogramowanie na PC, które się komunikuje przez SWD z układem (np. program do ST-Linka, OpenOCD) wgrywa do RAMu specjalną procedurę, która fizycznie realizuje zapis (poprzez odpowiednią sekwencje zapisów do rejestrów specjalnych mikrokontrolera), oraz wgrywa do RAMu dane dla tej procedury, po czym ją uruchamia i czeka aż skończy - proces powtarza się tak długo aż zostanie zapisane wszystko co zażyczył sobie użytkownik. Można oczywiście obejść się bez takiej procedury w RAM i po prostu bezpośrednio przez SWD wykonywać tą odpowiednia sekwencję zapisów do rejestrów specjalnych, ale to jest zwykle dużo wolniejsze. Idea jest generalnie taka, że przez SWD musisz zrobić dokładnie to samo co musiałbyś zrobić chcąc napisać bootloader lub zapisywać z poziomu firmware'u coś do flash - w firmware nie możesz przecież zrobić czegoś na styl `*(volatile uint32_t*)<jakiś-adres-we-flash> = 0x12345678;` więc i przez SWD nie możesz tak zrobić (bez dodatkowych operacji na rejestrach systemowych).

    Tym samym pojawia się druga kwestia. Nie jest możliwe zrobienie takiego kodu który byłby uniwersalny i pozwolił zapisywać każdy flash w każdym mikrokontrolerze. W każdym układzie robi się to inaczej, wiec oprogramowanie musi użyć zupełnie innego algorytmu (procedury ładowanej do RAMu) dla STM32, a zupełnie innej dla LPC17xx.
  • Poziom 2  
    Dziękuje za odpowiedź miałem nadzieję że da się to jakoś prościej wykonać ale chyba metoda z wykorzystaniem części ramu jako bootloadera będzie najprostsza. Jutro spróbuje coś takiego napisać.

    Pozdrawiam