STM32 - Skakakanje med aplikacijami (bootloader)

Vse kar je v povezavi z ARM-Cotrex-M procesorji. Sem spada tako HW kot SW.

Moderator: tilz0R

STM32 - Skakakanje med aplikacijami (bootloader)

OdgovorNapisal/-a zoc » 08 Maj 2020, 01:00

Zivijo!

Imam aplikacijo na stm32l476rg, ki ji posiljam ukaze preko USB. Isto aplikacijo sem za test shranil na 0x08000000 in 0x08080000 (vsako v svoj bank). Razlika v kodi med obemi aplikacijami je samo, da je naslov za skok naslov druge aplikacije in ena priziga modro, druga pa zeleno LED. Z ukazom preko USB zazenem skok iz ene na drugo aplikacijo in to dela OK.
Ker je bil cilj da naredim bootloader in sem v kodo z CubeMX dodal se podporo za CRC, da bi preverjal prenesene pakete(z zunanjo python aplikacijo preko usb) v flash. To tudi dela ok.

Problem se je pojavil, ko sem dodal podporo za CRC. Takrat je nehal delat skok med aplikacijami.
Ce zakomentiram MX_CRC_Init(); skoki med aplikacijami delajo.
Poskusal sem z raznimi deiniti in izklapljanem irq, pa ne pomaga...
Po debuggiranju(ki ga se ne obvladam najbolje oz ne razumem najbolje delovanje usb driverja) bi rekel, da se po skoku na drugo aplikacijo USB v drugi aplikaciji ne inicializira pravilno: MX_USB_DEVICE_Init();
Any ideas? Kako bi lahko samo inicializacija CRC (ni v uporabi za test) vplivala na skok oz init USB v aplikaciji na drugem naslovu?


Koda za skakanje zgleda takole:
Koda: Izberi vse
void JumpToApplication(void)
{
//   __HAL_RCC_CRC_CLK_DISABLE();
//   HAL_RCC_DeInit();
//   HAL_DeInit();
//    __disable_irq();
     
   uint32_t  JumpAddress = *(__IO uint32_t*)(APP_ADDRESS + 4);
   pFunction Jump        = (pFunction) JumpAddress;

   __set_MSP(*(__IO uint32_t*)APP_ADDRESS);

   Jump();
}
Uporabniški avatar
zoc
 
Prispevkov: 14
Pridružen: 18 Jan 2015, 01:42
Zahvalil se je: 7 krat
Prejel zahvalo: 2 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 3

Re: STM32 - Skakakanje med aplikacijami (bootloader)

OdgovorNapisal/-a tilz0R » 08 Maj 2020, 08:53

Sta aplikaciji identični, le naslov na katero si zapisal je drugi? Kako veš, da se skok ne zgodi? Po tem, da aplikacije ne dela? Kako je SCB->VTOR register nastavljen pri aplikaciji, ki se začne na 0x08080000?
Inicializiran CRC ni problem za to, da skok dela, ali ne.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1817
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 229 krat
Prejel zahvalo: 511 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: STM32 - Skakakanje med aplikacijami (bootloader)

OdgovorNapisal/-a dejko1 » 08 Maj 2020, 12:14

VTOR moraš verjetno nastavit v startup proceduri aplikacije. Če VTOR ni pravilno nastavljen se ti bodo interrupti izvajali v drugi aplikaciji, doker sta enaki to deluje.

Pred skokom na aplikacijo je najbolje izklopit inicializirano periferijo in izklopit vse interrupte ter počistit njihove flage (v bootloaderju). V nasprotnem primeru se ti lahko zatakne kje v aplikaciji ob inicializaciji posameznega dela periferije, ali pa pride do proženja interruptov med startupom nove aplikacije ali proženja interruptov za nazaj takoj po inicializaciji.

Nisem siguren kako se obnaša USB pri reinicializaciji s strani računalnika (če se mcu predstavi najprej kot ena naprava in potem kot druga).
dejko1
 
Prispevkov: 171
Pridružen: 12 Feb 2015, 13:47
Kraj: Ljubljana
Zahvalil se je: 25 krat
Prejel zahvalo: 65 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 65

Re: STM32 - Skakakanje med aplikacijami (bootloader)

OdgovorNapisal/-a zoc » 08 Maj 2020, 23:30

Aplikaciji sta različni v tem da imata, razlicne utripajoce LED (hartbeat) iz glavne while zanke. Tudi z debuggerjem (v uVision) sem preveril, da ko imam eno aplikacijo v debuggerju in v drugi naredim skok prek usb ukaza na prvo, se ustavi na HAL_Init ali na breaking pointu...(vse do nekam v driver od USB) in lucke spremenijo barvo kot je v doloceni aplikaciji narejeno.
Nato sem popravil obe aplikaciji tako, da sta (spet) bolj podobni in zadeva sedaj dela tudi s CRC, tako da to ni bil problem.
Aplikaciji sem nalagal direkt preko uVision z nastavitvijo naslova (R/O base ) v Linker tabu, naslova IROM v Target tabu in naslova v Debug/Settings/Flash download. Za testiranje mi je zelo prav prisel tudi novi STM32CubeProgrammer.
Kako je z VTOR, pa bom zdaj prestudiral in preveril :)

Torej zaenkrat zgleda, da je skok delal, ker sta aplikaciji zelo podobni oz. morda kak od USB interruptov ostane iz prve aplikacije in ne dela, kot je bilo receno.

A bi bilo mogoce uporabiti tudi HAL_NVIC_SystemReset() pred/po skoku na drugo aplikacijo (na 0x08080000), brez da bi me to spet vrglo na 0x08000000 (ce bi se dalo uporabiti za izklop periferije, ciscenje flagov...)?
Uporabniški avatar
zoc
 
Prispevkov: 14
Pridružen: 18 Jan 2015, 01:42
Zahvalil se je: 7 krat
Prejel zahvalo: 2 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 3

Re: STM32 - Skakakanje med aplikacijami (bootloader)

OdgovorNapisal/-a zoc » 09 Maj 2020, 00:04

UPDATE:
Spodnja vrstica je resila vse probleme!
Dogujem pivo :)

SCB->VTOR = 0x08080000;
Uporabniški avatar
zoc
 
Prispevkov: 14
Pridružen: 18 Jan 2015, 01:42
Zahvalil se je: 7 krat
Prejel zahvalo: 2 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 3


Vrni se na ARM-Cortex-M

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost