Skocz do zawartości

STM32 uruchomienie całego programu w RAM


virtualny

Pomocna odpowiedź

Jak w temacie - oczywiście pod warunkiem, że program się w RAM'ie zmieści.

Zdarza się, że uruchomienie programu w RAM jest bardzo wygodne. W moim przypadku mam external loadery, które zapisują flash SPI
przy użyciu ST-LINK UTILITY, albo STM32CubeProgrammer. Problem z tymi aplikacjami jest taki, że o ile zapis do pamięci flash 
jest bezbłędny, o tyle odczyt czy weryfikacja nie przebiega poprawnie, chociaż dane w pamięci SPI flash zostały właściwie zapisane.

Oprócz weryfikacji chciałbym mieć możliwość odczytywania do pliku danych zawartych w tych pamięciach flash i w tym momencie
bardzo wygodnie jest wrzucić program do RAM, odczytać żądane dane swoim programem na VCP, nie naruszając programu głównego osadzonego we flaszu mikrokontrolera. Oczywiście wielka szkoda że firmowe programy tego nie uciągną i trzeba to rozwiązać we własnym zakresie.

Odnalazłem 2 metody do linkowania programu w RAM.
Pierwszą zastosowałem dla BLUEPILL'a PLUS (F103). Wystarczy podać linkerowi że początkowa część RAM jest pamięcią flash.

01.thumb.jpg.800b13ee28896f2fdfc1eedf5fee0b92.jpg

LINKER.thumb.jpg.4e10eb69a80b2931755421785774d751.jpg

MEMORY
{
  RAM    (xrw)    : ORIGIN =  0x20002800,   LENGTH = 10K
  FLASH    (rx)    : ORIGIN = 0x20000000,   LENGTH = 10K
}


Druga rzecz, to dodanie 2 linii w startupie do zainicjalizowania stosu (SP)

startup.thumb.jpg.14b5bc6a84644c43af90fdf5d3ddb731.jpg

Reset_Handler:

/* set stack pointer */
    mov r0, 0x20000000
    ldr sp, [r0]

Trzecia rzecz, aby wszystko sprawnie działało z przerwaniami, to relokacja tablicy wektorów za pomocą rejestru SCB->VTOR

main.thumb.jpg.793f0d15ad3d6e691fd29fe5ddbe9ab4.jpg

 

   SCB->VTOR = (uint32_t) 0x20000000;


I... już - program działa, przerwania dla HAL_Delay(500) przychodzą od Systicka i wszystko pięknie śmiga.


Pierwszy sposób, choć prosty, jest troszkę mniej poręczny od drugiego, w którym nie trzeba sztucznie dzielić pamięci RAM na FLASH i RAM. Drugi przykład wykonałem dla zestawu "Black board F407VE".

02.thumb.jpg.16c21c3d9de98d38f6aaf58887a4b0d4.jpg

Druga metoda jest dzięki uprzejmości MCD Application Team, który od pewnego czasu dla niektórych procesorów zaczął zamieszczać dwie wersje skryptu linkera, pierwszy z postfixem "FLASH", drugi z postfixem "RAM".

LINKER_OPTIONS.thumb.jpg.a22de475fe7d7eed2b1e542f45b4a182.jpg
Otóż wystarczy tylko w ustawieniach podmienić nazwę pliku linkera i na początku funkcji "main" zmienić adres tablicy wektorów jak w przypadku F103.

F407_RAMRUN.thumb.jpg.ea537338d54c023ed979102a3e745c2c.jpg


Teraz jeszcze jedna rzecz - można by faktycznie binarki tych programów dołączać do programu we flaszu, który po resecie przepisywałby go do RAM, ale z drugiej strony... jaki sens ma umieszczenie programu z RAM we flash? Trochę dziwnie prawda?
Chodzi mi o to, że takie programy z RAM zgodnie ze specyfikacją ARM'ów nie mają prawa uruchomić się, ponieważ proc startuje się z flasza!!! 
Co więcej, nawet gdyby zmieniono bootowanie na pamięć RAM, to nadal niewiele daje, ponieważ po odłączeniu zasilania w RAM przy starcie procka wartości są po prostu RANDOMOWE!

I tutaj z pomocą przychodzi kolejny raz support STM32, który za pomocą programatora ST-link robi taką sztuczkę, że odczytuje adres startu programu (Entry Point) z tablicy wektorów i po zaprogramowaniu RAMu naszym programem na końcu rejestr PC zostaje zainicjowany adresem do Entry Pointa !
Prawda że genialne? W przypadku botowania ustawionego na flash program działa do pierwszego hardware'owego resetu. Nie sprawdzałem opcji, gdy bootowanie ustawione jest na RAM, ale według specyfikacji program powinien działać od nowa po hardware'owym resecie do momentu wyłączenia zasilania.

 

W załączeniu programy: BLUEPILL_RAMRUN.zip , _F407_RAMRUN.zip

 

Linki do repozytoriów na github:

 

BLUEPILL PLUS RAM RUNNING

STM32F407VET6 BLACK RUNNING IN RAM

  • Lubię! 1
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.