ARM: Serial bootloader

Posted: 2015-01-03 in Darbeliai
Žymos:,

Kažkada seniai, pačioje pradžioje, žadėjau pabandyti ir pademonstruoti STM32 procesoriaus flashinimą per nuosekliąją jungtį (USART). Tai padaroma visai lengvai, nes STM32 procesoriai iš gamyklos iškeliauja turėdami specializuotą bootloader’į. Tiesa, nėra viskas su tuo nuosekliuoju bootloaderiu taip gerai, kaip norėtųsi, bet jis iš bėdos tinka projektuojant smulkias plokštes, kuriose tiesiog negalime sau leisti tokios prabangos, kaip JTAG prijungimo kaladė. Labai pasistengus net ir be nuosekliosios jungties turėtų būti įmanoma prasisukti ir padaryti programos įkėlimą per USB. Bet su USB yra kito vargo: reikia keisti bootloaderį ir keisti sukurtą dvejetainį programos failą. Trumpai tariant, su USB įkėlimu galima netyčia prisidirbti. Aš USB įkėlimu iki galo domėtis tingėjau, nes USART pasirodė labai gražu ir paprasta.

Įkėlimui reikalinga programėlė stm32flash. Aš ją parsitįsiau ir susikompiliavau be jokių problemų. Gautą stm32flash programulkę galima pasidėti kur nors, iš kur ją galėsite laisvai iškviesti, kad ir kokį /usr/local/bin ar panašiai.

Mano bandomosios STM32F103C8T6 plokštės turi atskirai iškeltus USART1 elektrodus, nors tai paprasčiausiai PORTA 9 ir 10 kojytės. Šitas procesoriukas iš viso turi tris USART. Tad prie tų iškeltų kojų prijungiau ir USART keitiklį:

STM32F103C8T6 ARM procesoriaus bandomoji plokštė su USART keitikliu (adapteriu) | Darau, blė

Toliau. Jei dabar iškviesite stm32flash programą su atitinkamu įrenginiu/prievadu, tai nieko nebus:

s@x:~$ stm32flash /dev/ttyUSB0
 stm32flash 0.4
http://stm32flash.googlecode.com/
Interface serial_posix: 57600 8E1
 Failed to init device.

Reikia procesoriuką perkrauti į bootloaderio režimą. Pagal nutylėjimą procesoriukas įkrauna programuotojo įkeltą programą, bootloaderį praleisdamas.

Kad procesoriukas pereitų į bootloaderio režimą, reikia sukeisti vietomis vieną trumpiklį. Procesoriukas turi dvi specialias kojas, vadinamas BOOT0 ir BOOT1. BOOT1 dar gali dirbti ir už GPIO išvadą, o BOOT0 yra visiškai specializuotas tik įkrovai. Jei BOOT0 yra įjungtas į „žemę“, tai procesoriukas visada įkraus vartotojo programą. Jei BOOT0 įjungsim į 3,3 V (loginį vienetą), o BOOT1 įjungsim į „žemę“, tai perkrovus procesorių (su RESET mygtuku arba užtrumpinus NRESET koją į „žemę“) jis įkraus gamyklinį bootloaderį.

Štai tie trumpikliai ant mano plokštės:

BOOT0 ir BOOT1 trumpikliai ant STM32F103 procesoriaus bandomosios plokštės | Darau, blė

Jie abu dabar nustatyti į loginį nulį (užtrumpinti į „žemę“). Matyti ir mažutėlaitis RESET mygtukas.

Ką gi, perstatom BOOT1 į kitą poziciją:

STM32F103 procesoriaus BOOT0 išvadas nustatytas į bootloader režimą | Darau, blė

Tada spaudžiam RESET ir pabandom vėl pašnekinti procesoriuką su stm32flash:

s@x:~$ stm32flash /dev/ttyUSB0
 stm32flash 0.4
http://stm32flash.googlecode.com/
Interface serial_posix: 57600 8E1
 Version : 0x22
 Option 1 : 0x00
 Option 2 : 0x00
 Device ID : 0x0410 (Medium-density)
 - RAM : 20KiB (512b reserved by bootloader)
 - Flash : 128KiB (sector size: 4x1024)
 - Option RAM : 16b
 - System RAM : 2KiB

Na va, kažkas įdomesnio jau. Tik nesuprantu, kodėl Flash rašo 128 KiB. Pagal specifikaciją C8 turėtų būti 64 KiB. Nebent yra dviguba atmintinė su atsargine kopija… bet kad lyg ir ne. O gal stm32flash klaida kokia.

Na, dabar jau turint bin ar hex failą jį galima bandyti įkelti per nuoseklųjį keitiklį:

s@x:~$ stm32flash -w ARM_SERIAL.hex /dev/ttyUSB0
 stm32flash 0.4
http://stm32flash.googlecode.com/
Using Parser : Intel HEX
 Interface serial_posix: 57600 8E1
 Version : 0x22
 Option 1 : 0x00
 Option 2 : 0x00
 Device ID : 0x0410 (Medium-density)
 - RAM : 20KiB (512b reserved by bootloader)
 - Flash : 128KiB (sector size: 4x1024)
 - Option RAM : 16b
 - System RAM : 2KiB
 Write to memory
 Erasing memory
 Wrote address 0x08005e6c (100.00%) Done.

Viskas sėkmingai, hex failas suvažiavo. Dabar vėl reikia BOOT0 atstatyti atgal į loginį nulį ir vėl perkrauti procesoriuką. Turėtų pasileisti ką tik įkelta programa.

Taigi čia viskas yzy. Vienintelis trūkumas – nepatogu tuos trumpiklius kaitaliot. Tačiau suprojektavus kokią smulkią plokštę turėti nuoseklųjį išvadą gali būti kur kas patogiau.

Tiesa, šie procesoriukai palaiko ir SWD, tokį apipjaustytą JTAG pakaitalą, kuriam reikia tik trijų laidelių. Na, tiek pat, kiek nuosekliajam prievadui. Šiuo dalyku kol kas dar nesidomėjau.

Tai tiek. Jei norite pradėti eksperimentus su ARM (konkrečiai STM32) procesoriais ir nenorite įsigyti JTAG zondo, tai galite pradėti ir šitaip. Tiesa, pilna ir visokių bandomųjų plokščių, kaip STM32 Discovery serija, kur viskas per USB daroma. Kiti ARM procesoriai irgi dažnai turi panašų bootloaderį, sakykim, Atmel ARM, kuriems per USB išvadą galima įkelti programas su Atmel pateikiama SAMBA programine įranga. LPC procesoriai irgi šituo reikalu giriasi.

Reklama
Komentarai
  1. Vytautas Valaitis parašė:

    Discovery plokštės visos per SWD pajungtos. Dabar kažkaip pilnas JTAG niekur ir nenaudojamas. Iš bootloader’io tai tik toks privalumas, kad nesunku palikt useriui pačiam persiflashint (ant USB bootloaderį pakabint), arba pasidaryt, kad papildomas procas per nuotolį galėtų savo kolegą perflashint (kad ir per USART). 🙂

    • Darau, Blė parašė:

      Tai gal, gerbiamasai, turite kokią nuorodėlę su padoresniu aprašymu, kaip ant USB pakabint? Nes man tai kažkaip nieko tokio sąlyginai paprasto rasti nepavyko. Radau tik Maple bootloaderį, kurį dar įkišt reikia ir dar ne bile kaip binarnikus paruošt.

      • Vytautas Valaitis parašė:

        Tik dabar komentarą pamačiau:). Buvo kolega STM32 M0 berods padaręs, jei labai reiks paieškosiu kodo, dabar taip iškart neradau. Ten per standartinį ST softą flashindavosi, bet paskui nebenaudojom, tai pasimiršo.

Parašykite komentarą

Įveskite savo duomenis žemiau arba prisijunkite per socialinį tinklą:

WordPress.com Logo

Jūs komentuojate naudodamiesi savo WordPress.com paskyra. Atsijungti / Keisti )

Twitter picture

Jūs komentuojate naudodamiesi savo Twitter paskyra. Atsijungti / Keisti )

Facebook photo

Jūs komentuojate naudodamiesi savo Facebook paskyra. Atsijungti / Keisti )

Google+ photo

Jūs komentuojate naudodamiesi savo Google+ paskyra. Atsijungti / Keisti )

Connecting to %s