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

[STM32][C/RIDE7] Bootloader IAP

07 Cze 2010 21:03 2739 7
  • Poziom 9  
    Witam,

    Chciałbym napisać własny bootloader, który miałby działać podobnie jak ten z noty 2557 od ST. Bootloader chciałbym umieścić na początku pamięci FLASH, zaś aplikację we flashu z pewnym offsetem, podobnie jak w przykładzie od ST.

    Aplikacja jaka ma być ładowana/zmieniana przez bootloader jest już gotowa, zmodyfikowałem skrypt linkera tak aby program zaczynał się od innego adresu. przy pisaniu bootloadera ograniczyłem długość flasha.
    Code:

    BOOTLOADER
    MEMORY
    {
      RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
      FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0x2000
    ...
    }


    Code:

    APLIKACJA
    MEMORY
    {
      RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
      FLASH (rx) : ORIGIN = 0x8002000, LENGTH = 256K-0x2000
    ...
    }
    dodatkowo:
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);


    Mam jednak kilka pytań i problemów:
    1. Czy da się załadować do Flash-a obydwa programy? Jeżeli tak to w jaki sposób? Chodzi o to żebym mógł się przełączać pomiędzy bootloaderem a aplikacją.
    2. Co z wektorami przerwań? Jak rozwiązać ten problem? Bootloader i aplikacja używają przerwań.
    3. Czy jeszcze o czymś zapomniałem?
    4. Mam jeszcze pytanie troche z innej beczki: jak w pamięci Flash umieścić pod jakimś adresem np 0x8004000 pewną stałą wartość? deklaracja const umieszcza w pamieci flash stałą jednak nie ma kontroli gdzie ta wartosc bedzie umieszczona. Chodzi o podobne operacje jak w asm:
    Code:

    CSEG AT ADRES
    db wartosc


    Dzięki za pomoc i za wskazówki.
    Pozdrawiam
  • Poziom 17  
    1. Nie słyszałem żeby dało się tak zrobić, głównie ze względu na przemapowanie przerwań. Jednakże mógłbyś zaimplementować sobie taki skok pomiędzy aplikacjami (wliczając w to przemapowanie przerwań) po naciśnięciu przycisku itd.
    Jednak jeżeli ładujesz do flash bootloader a potem aplikację to nie licz na to że będziesz mógł debugować obie na raz. Ładujesz kod obiektowy do jednej z nich i debuger nie wie nic o tej drugiej.
    Jednakże jeżeli ktoś uważa, że jest to możliwe, to chętnie posłucham.

    2. Przy przejściu pomiędzy bootloaderem a aplikacją musisz posprzątać po sobie (tzn. powyłączać przerwania itd) oraz przemapować przerwania pod inny adres, bo aplikacja działa z ofsetem.
  • Poziom 9  
    nenpa8lo napisał:
    1. Nie słyszałem żeby dało się tak zrobić, głównie ze względu na przemapowanie przerwań. Jednakże mógłbyś zaimplementować sobie taki skok pomiędzy aplikacjami (wliczając w to przemapowanie przerwań) po naciśnięciu przycisku itd.



    Ok rozumiem ze mogę sobie przełączać aplikacje przyciskiem, ale jak ma załadować oba programy do flasha - nie używając na początku bootloadera. Da się jakoś złączyć pliki hex lub bin? jeżeli tak to jak?
    Lub może jakimś innym sposobem?
  • Poziom 17  
    No normalnie to ładujesz swojego bootloadera do flasha przy pomocy powiedzmy flash magic. A następnie generujesz sobie BIN swojej aplikacji w ofsetem i tego BINa podsuwasz bootloaderowi i on używając IAP powinien to wpisać do flasha.
  • Poziom 9  
    nenpa8lo napisał:
    No normalnie to ładujesz swojego bootloadera do flasha przy pomocy powiedzmy flash magic. A następnie generujesz sobie BIN swojej aplikacji w ofsetem i tego BINa podsuwasz bootloaderowi i on używając IAP powinien to wpisać do flasha.



    Ok, wszystko się zgadza, ale ja chciałem wgrać to bez użycia bootloadera - z wgraniem już sobie poradziłem. Pojawił się jednak inny problem.
    Kiedy wykonuje skok z bootloadera do aplikacji, program wskakuje do Hard Fault Handler (kiedy w aplikacji chce użyć przerwań).
    Kiedy napisałem prostą aplikację która nie używa przerwań wszystko działało dobrze i skok z bootloadera do aplikacji wykonywał się poprawnie. Na tą chwilę w bootloaderze nie wykorzystuje przerwań - chociaż docelowo będzie użyte przerwanie od USARTA. Skok do aplikacji wykonuje z użyciem funkcji z aplikacji ST.
    Code:
      JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
    

      /* Jump to user application */
      Jump_To_Application = (pFunction) JumpAddress;
      /* Initialize user application's Stack Pointer */
      __set_MSP(*(__IO uint32_t*) ApplicationAddress);
                  __asm volatile (" CPSID F       \n");
      Jump_To_Application();


    Co może być przyczyną takiej sytuacji? co jeszcze należy wykonać przed skokiem do aplikacji docelowej - lub co należy wykonać w aplikacji na samym początku (przerwania aktywowałem).

    Dzięki za pomoc.
    Pozdrawiam
  • Poziom 17  
    Normalnie ARM startuje z adresu 0x0 i tam powinien być cały wektor przerwań do 0x20. Ty jednak skaczesz do aplikacji z ofsetem więc twój wektor przerwać powinien być odpowiednio przesunięty, a ARM o tym poinformowany. Jeżeli nie poradzisz to poszperam powinienem mieć przykład.
    Lektura
  • Poziom 9  
    Jasne, rozumiem wszystko, ale czy przypadkiem instrukcja :
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000); nie ustawia odpowiednio wektora przerwan i nie informuje o tym procesora?

    Dzięki za zainteresowanie tematem, będe wdzięczny za kolejne sugestie.
    Pozdrawiam
  • Poziom 14  
    Czy autor wątku poradził sobie z przerwaniami??
    Pytam bo zamierzam napisać bootloader do programowania kulku uC po RS485 i planuje wykorzystywać w booltoaderze przerwania od UARTa oraz Timera.