STM32 bootloader

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

Moderator: tilz0R

STM32 bootloader

OdgovorNapisal/-a zanka » 06 Jun 2018, 20:55

Rad bi iz svojega programa ob določenih pogojih takoj na začetku programa (potem ko prekopiram DATA in zradiram BSS) skočil na DFU bootloader vgrajen v F042, kolikor gledam AN2606 se ta prične pri 0x1FFFC400 ampak v Note piše: „User can jump to the System Memory Bootloader from his application code using the following entry point:0x1FFFC519“

Pod to opombo si predstavljam preskok VT direktno na njegov main. Vprašanje pa je, ali bo bootloader nastavil svoje ISR, da bo deloval z USB? Si bootloader nastavi stack pointer? Slednje ni neka velika težava, ker takoj na začetku sklada toliko ne koristim.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 15:10

Skušam
Koda: Izberi vse
void jump_to_bootloader(void)
{
  void (*bootloader)(void);
  volatile uint32_t addr = 0x1FFFC400;

  __disable_irq();

  /* System flash memory map */
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
  SYSCFG->CFGR1 &= SYSCFG_CFGR1_MEM_MODE;
  SYSCFG->CFGR1 |= SYSCFG_CFGR1_MEM_MODE_0;

  __set_MSP(*(uint32_t *)addr);
  bootloader = (void (*)(void))(*(uint32_t *)(addr + 4));
  //bootloader = (void (*)(void))(0x1FFFC519);
  bootloader();
}


ampak brez uspeha.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 15:13

Obstaja kakšen trik, da nastavim registre, potem resetiram in da je efekt enak tistemu, kot da bi BOOT0 nastavil na VCC?
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a tilz0R » 07 Jun 2018, 15:29

Bootloader je "Klasičen program". Stack pointer je pa prvi word programa, ki ga user nastavi z uporabo __set_MSP funkcijo in potem skoči na lokacijo, kjer se nahaja reset vector. Od tam naprej se program izvaja.

Obstaja kakšen trik, da nastavim registre, potem resetiram in da je efekt enak tistemu, kot da bi BOOT0 nastavil na VCC?

Direktno ni mogoče to narediti da bi bil efekt isti.

Kaj se zgodi, če skočiš na 0x1FFFC404 naslov?
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1369
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 180 krat
Prejel zahvalo: 340 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 15:40

tilz0R je napisal/-a:Kaj se zgodi, če skočiš na 0x1FFFC404 naslov?

Kako naj to dobro vem? Bootloader uporabi UART na SWD pinih. :_dunno
Debugger se vrti v tej funkciji, itak je SP defekten ...
MCU imam vštekan v USB in čakam, če se DFU pojavi, drugače ne znam.

Sem poskusil tudi s tistim user mode jump pa sem na koncu brickal MCU (debugger ga kljub reset žici ni prepoznal po nekem ID). Na koncu sem ga postavil tako, da sem BOOT0 dal na VCC in ga spravil v bootloader tar nasnel s starim delujočim programom. En poskus pred tem sem po skoku na 0x1FFFC519 prejemal HardFault.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a tilz0R » 07 Jun 2018, 15:53

zanka je napisal/-a:Kako naj to dobro vem? Bootloader uporabi UART na SWD pinih. :_dunno


To veš tako, da ti ga PC prepozna, recimo na USB. Samo za info, ali uporabljaš F072? Vsak MCU namreč nima na istem naslovu bootloader.
Da imaš hardfault pri skoku na non-4-bytes-aligned-memory je logično. To je napaka v application note-u. Sporočim interno.
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1369
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 180 krat
Prejel zahvalo: 340 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 15:55

Ne, ga ne prepozna.

Ne, STM32F042K4T6 ali kaj je že TSSOP 20. Lota se super. :D

Koda: Izberi vse
__attribute__((section(".startup"), optimize("-O2"))) void __startup(void)
{
  uint32_t *bss = &__bss_begin;
  uint32_t *data = &__data_begin;
  uint32_t *datai = &__datai_begin;

  while (datai < &__datai_end)
  {
    *data = *datai;
    data++;
    datai++;
  }

  while (bss < &__bss_end)
  {
    *bss = 0;
    bss++;
  }

  _main();
}

void _main(void)
{
  RCC->CR &= ~RCC_CR_HSEON;

  /* Bootloader */
  jump_to_bootloader();

....


To se izvede pred mojo kodo. Še ta ~RCC_CR_HSEON ne naredi ničesar, ker je HSE itak izključen po resetu.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 17:07

Koda: Izberi vse
void (*bootloader)(void);

  __disable_irq();

  /* System flash memory map */
  RCC->APB2ENR |= RCC_APB2ENR_SYSCFGCOMPEN;
  SYSCFG->CFGR1 &= SYSCFG_CFGR1_MEM_MODE;
  SYSCFG->CFGR1 |= SYSCFG_CFGR1_MEM_MODE_0;

  __set_MSP(*(uint32_t *)0);
  bootloader = (void (*)(void))(*(uint32_t *)4);
  bootloader();


Memory map deluje, ker so vrednosti na mestih 0x0 in 0x4 pravilne. Ta trik naj bi deloval na vseh, ki podpirajo bootloader, torej ni potrebno več shranjevati točnega naslova.

Problem je ta, da se po klicu bootloader(); ne naredi ničesar oziroma backtrack pokaže, da je v neki funkciji, ampak USB pa ni zaznati.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 18:15

Izgleda, da se MCU po vstopu v bootloader resetira.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28

Re: STM32 bootloader

OdgovorNapisal/-a tilz0R » 07 Jun 2018, 18:20

zanka je napisal/-a:Izgleda, da se MCU po vstopu v bootloader resetira.


Ko dobim odgovor nasih razvojnikov odgovorim v temi. Na vprasanje zakaj je reset value vedno liha stevilka (bit0=1) je pa naslednji. S tem bitom poves procesorju da bo thumb inštrukcija upirabljena in on potem to pred jumpom na reset vektor upošteva in resetira bit. Tako cpu skoci na sodi naslov, 4bytes aligned.

Lp
Knowledge sharing is people' caring., T. MAJERLE
Uporabniški avatar
tilz0R
 
Prispevkov: 1369
Pridružen: 18 Jan 2015, 00:12
Kraj: Črnomelj
Zahvalil se je: 180 krat
Prejel zahvalo: 340 krat
Uporabnika povabil: s56rga
Število neizkoriščenih povabil: 255

Re: STM32 bootloader

OdgovorNapisal/-a zanka » 07 Jun 2018, 18:25

Da, o tem bitu sem nekaj govoril v Postojni (omenil sem lihost). Tudi original VT ima najprej top_stack, potem pa lih reset vektor. To ni neka težava. Morda bi moral skok na bootloader entry biti samo BL brez X, ampak prevajalnik mi uturi X. Tudi __ASM se ne prevede brez napake, če nimam vsaj BX. Kolikor sem ugotovil je ta X zahtevan, kadar je naslov skoka v registru. Če bi imel številsko, potem X ne bi bilo.

Škoda, da je na spletu tako malo primerov.
Uporabniški avatar
zanka
 
Prispevkov: 1764
Pridružen: 17 Mar 2016, 01:16
Kraj: Krško
Zahvalil se je: 92 krat
Prejel zahvalo: 149 krat
Uporabnika povabil: DusanK
Število neizkoriščenih povabil: 28


Vrni se na ARM-Cortex-M

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost