ARM: pradžia

Posted: 2014-01-04 in Pezalai
Žymos:, ,

Vieną kartą paverkiau, kad norėčiau pažindintis su ARM procesoriais. Konkrečiai mikrovaldiklių lygmenyje, nes pažintį su Raspberry Pi vargiai pavadinčiau pažintimi su ARM architektūra… Taip, kompiuteriukas arminis, bet ten viskas tokiame abstrakcijų lygmenyje, kad to ARM visiškai nesimato. Viską, ką ten dariau, lengvai galiu atkartoti tiesiog su bet kokiu kompiuteriu, kuriame sukasi Debian pagrindo Linux.

Tai va, guli ant stalo keli nauji žaislai:

Kiniškas Segger J-Link padirbinys ir devboard'as su STM32F103C8T6 procesoriumi | Darau, blė

Aš, suprantate, nerimstu. Ypač, kai pasižiūrėjau, kad gerokai galingesnis procesoriukas kainuoja pigiau, nei mano mylimas Atmega328P-PU. Truputėlį įsižeidžiau, galima sakyti. Ir sugalvojau, kad pradėsiu pažintį su vienu Cortex-M3 šeimos procesoriuku (nors ir pačiu paprasčiausiu, STM32103C8T6).

Rinkinys, kaip matote, savotiškas. Kiniškas J-Link programatorius/debugeris ir kiniškas devboardas. Ilgokai galvojau, gal, pavyzdžiui, pasiimt kokį nors gamintojo devboardą. Yra gi jų visokių: LCPXpresso, STM32xx Discovery,  Stellaris Launchpad ir t.t. Olimex dar daro krūvas visokių plokščių. MBED iš viso yra pilnai webinis reikalas: viską gali kurti naršyklės „IDE“. Mdia. Bet visgi ARM — tai ne AVR. AVR yra vienos firmos procesoriai, patys kuria, patys ir gamina. O ARM yra vienos kompanijos architektūra, kuri pati nieko negamina, tik kalnus dokumentų ir licencijų. Kitos firmos ima tuos dokumentus ir pagal juos daro procesorius. Tai gaunasi taip, kad, pvz. nėra tokios „bendruomenės“, kuri domėtųsi Cortex-M3 pošeime, o yra pagal procesorių gamintojus: NXP, ST, Freescale, Atmel (taip, šitie ir ARM’us daro) ir pan. Todėl gaunasi toks kaip ir atsiskyrimas tarp visokių „armininkų“. Dar kažkaip durnai yra su visokiais įrankiais programavimo ir kitom nesąmonėm.

Aš tai nusprendžiau pasiglimždyti biškį. Doin’ it the hard way. Arba поябаться по настоящему. Nusipirkau kinišką programatorių, kuris per JTAG teoriškai tinka bet kokiai šį dalyką palaikančiai elektronikai: nebūtinai ARM ir nebūtinai… procesoriams. O gal pravers. O gal sugalvosiu architektūrą keist. O gal gausiu kokio arminio šroto. Nu maža, ką. Be to, taip kur kas įdomiau, nei pasiimti gatavą devboardą su gatavu programatorium ir likti pririštam prie kažkokio tai gamintojo. Tiesa, čia dar ne pats sudėtingiausias dalykas. Pirmam pabandymui nusipirkau ir kinišką papigiašką plokštę su procesoriumi ir keliomis jungtimis bei JTAG lizdu. Hardcore variantas būtų buvęs dar ir susiprojektuoti pirmąją plokštę. Tiek to, dar bus tų plokščių, nes ir pora procesoriukų atkeliavo, nuogutėlių.

Pirmą kartą įjungęs tą J-Link sugebėjau jį nulaužti, tai teko ir remontuoti.

Dabar dėl STM32 pasirinkimo. Šiaip aš ilgokai svarsčiau, kad norėčiau kažką galingesnio už AVR’us pabandyt. Na, galvojau ir apie Xmega seriją, kur daug kojų ir truputį daugiau „proto“. Bet tai vis tiek aštuonių bitų procesoriukas ir tiesiog truputį patiunintas. Na, dar nenormaliai pabrangintas. O ARM čia yra 32 bitų, atminties kaip pas tą Xmega, o kaina tai kaip čia pasakius… Sakau, kad dūšią skauda palyginus. Tiesa, buvo užplaukus pradžioj tokia durna mintis: o gal mokytis AVR32 architektūrą? Yra toks daiktas, atseit, konkurentas ARM. Regis, biškį pavėluotas. O ir į AVR nelabai panašus. Kita architektūra visai. Skaičiau ir labai gerų atsiliepimų apie šiuos procesorius. Bet kad kaina tai jų nemėgėjiška ir nehumaniška, apie devboard’us, o juo labiau kiniškus, net nėra ką kalbėt, o ir jų tikslas truputį kitoks. Ne papimpintiems kontroleriukams daryti. Aš juk noriu kažko panašaus, bet tik truputuką galingesnio. Nereikia man integruoto Ethernet, SD card ir dar bile ko. Gal ir gerai būtų, bet procesoriai su visokiom integruotom gėrybėm kainuoja brangiau, o viską išnaudoti yra ne visada tiesiog įmanoma. Aš ir tų pačių AVR procesoriukų galimybių neišnaudoju toli gražu, bet prie didesnių apkrovų su jais jau darosi sunkoka kartais.

Na, prie pasirinkimo. Šiaip galvojau savo pažintį pradėti nuo LPC1114 procesoriaus, kuris vienintelis visoje ARM krūvoje leidžiamas DIP28 korpuse. Ale va, ebay tokių nėr. Aš apakęs. Na, ok, nėr. Siuntimas iš Amerikos brangus, kokio nors ten Mouser ar Avnet. OK, yr draugų Amerikoj, persiųstų, bet vis tiek — kaip pasižaidimui, tai kaina didoka… LPC maloniai programuojasi, jiems paprasto UART užtenka. Turi ROM atminty įkelties programėlę, panašią į Arduino. Amerikonai šitais procesoriukais daug žaidžia, kiek mačiau visokių projektų. Bet europiečiams tai bėda su jų gavyba. Apskritai NXP procesorių ne kažkas ir ebay, ir šiaip ant Europos. Tad atkrito ši mintis. Galvojau paskui apie Freescale, nes radau atseit ARM plokštelė namams už $5… tik vėl — man tokia kaina nesigautų, jei detales bandyčiau gauti. Visgi gerai tie amerikonai gyvena, kartais pagalvoju. Toliau… Texas Instruments nebrangių devboardų siūlo, bet man kažkoks nepasitikėjimas jais. Aš, žinote, kartais galvoju, kad geriau rinktis tuos, kurie daro daugiausia, o neužsiimti visokia egzotika. Su egzotika paskui pisnios krūvos. Ir taip jos bus, jaučiu. Atmel ARM kažkaip niekuo nesužavėjo (ypač kainomis), gal išskyrus būdą įkelti programulkes su SAM-BA, bet ai… gi ARM architektūroje numatytas debuginimas ir programavimas per SWD — du laidus iš viso JTAG. Tai turint JTAG aparatą galima jį šiam reikalui priderinti, nes JTAG jungtis didelė, o projektuojantis savo plokštę geriau nedidelę daryti. Taip ir apsistojau ties pažintimi su STM32 procesoriais. Jų pilnas ybėjus, nebrangūs, pasirinkimas visokių procesoriukų yra didelis. TQFP įpakavimai manęs negąsdina. Be to, STM32F3 procesoriukas su 64 kB flash atminties ir 20 kB RAM yra pigesnis už mano pamėgtą Atmega328P — o šiame flash nors ir 32 kB, bet RAM — tik 2 kB. Skirtumas ženklus. Be to, ARM procesoriukas gali suktis 72 MHz greičiu: tai kur kas daugiau už maksimalius 20 MHz Atmegai.

Šiaip nepagalvokit, aš AVR tikrai nesiruošiu mesti. Savo vietoje labai geri procesoriukai, o ir programuoti juos lengva — net ir be Arduino bibliotekų. Ir patirties jau sukaupiau krūvelę padorią.

Tai tiek blevyzgų, o dabar reikia pasileisti kokio Fintroll, Korpiklaani… o gal Heidevolk ar netgi Lacuna Coil… o gal Tristania… ai, kažką fonui iš savo 100+ GB liaudiško, gotikinio ir simfoninio metalo ką nors tikrai rasiu… ir bandyti su šitais žaisliukais kažką nuveikti.

Taigi pradžia. Kadangi J-Link gadinimas su Segger GDB serveriu „nusisekė“, nusprendžiau imtis OpenOCD. Atsiliepimai apie šitą debuginimo serverį pusėtini, su J-Link klonais veikia, tai pagalvojau, kad kaip nors. Galų gale, daiktas yra atvirojo kodo, o man tai natūraliai prie dūšios.

Pradėjau skaitalą nuo šitos nuorodėlės: http://www.tincantools.com/wiki/Compiling_OpenOCD_v07_Linux

Tačiau sėkmingas variantas buvo kitas. Parsitempiau su git visą šviežiausią OpenOCD kodą:

$ git clone git://git.code.sf.net/p/openocd/code openocd-code

Tuomet užėjęs į partįstą openocd-code katalogėlį paleidau programulkę ./bootstrap, kuri priinstaliavo visokių priklausomybių. Po to susikompiliavau patį OpenOCD su J-Link palaikymu:

$ ./configure --enable-maintainer-mode --enable-jlink
$ sudo make install

Viskas, OpenOCD debugeris sukompiliuotas.

Kad J-Link’as veiktų, reikia dar jam udev failiuką sutvarkyti. Segger serverio diegimas tą sutvarko, bet aš to serverio atsikračiau, nesinori užteršti savo kompiuterio nereikalingu šlamštu. Tad sukūriau failiuką /etc/udev/rules.d/45-jlink.rules, o jo turinys štai toks:

# SEGGER JLINK USB DEVICE 1366:0101
 BUS!="usb", ACTION!="add", SUBSYSTEM!=="usb_device", GOTO="kcontrol_rules_end"
 SYSFS{idProduct}=="0101", SYSFS{idVendor}=="1366", MODE="664", GROUP="plugdev"
 LABEL="kcontrol_rules_end"

Nepamenu, kokiuose internetuose šitą informaciją radau, bet kažkur užtikau.

Dar reikia savo Linux vartotoją pridėti į plugdev grupelę (jei to netyčia kažkaip nėra įvykę).

Kas gi toliau… prijungiau J-Link prie mažosios kiniškos plokštelės su STM32F103C8T6 procesoriumi ir pasižiūrėjau, ar USB aparatų sąraše yra ir J-Link adapteris:

$ lsusb
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
 Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
 Bus 003 Device 012: ID 1366:0101 SEGGER J-Link ARM
 Bus 003 Device 002: ID 05ac:1006 Apple, Inc. Hub in Aluminum Keyboard</pre>
Yr! Toliau intensyviai skaitau <a href="http://gnuarmeclipse.livius.net/wiki/How_to_use_the_J-Link_probe_with_OpenOCD" target="_blank">kitą nuorodėlę</a> ir bandau šį tą atkartoti. Tik pasirinkau kitokią „plokštę“, tiksliau, bendrinę STM32F1x:
<pre>$ openocd -f interface/jlink.cfg -c 'gdb_memory_map enable' -c 'gdb_flash_program enable' -f target/stm32f1x.cfg 
Open On-Chip Debugger 0.8.0-dev-00294-gbc256b1 (2014-01-03-23:18)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m reset_config sysresetreq
Info : J-Link initialization started / target CPU reset initiated
Error: J-Link command 0xde failed (-1)
Error: J-Link command 0xdc failed (-1)
Error: J-Link command 0x01 failed (-1)
Error: J-Link command EMU_CMD_VERSION failed (-1)
Info : J-Link JTAG Interface ready
Error: J-Link command 0xdd failed (-1)
Error: J-Link command 0xdf failed (-1)
Error: usb_bulk_write failed (requested=6, result=-1)
Error: jlink_tap_execute failed USB io (-107)
Error: J-Link setting speed failed (-1)
in procedure 'init'

Šūdžiuks kažkoks tai. Einu skaityti internetų. Nepatikėsite, radau informacijos viename kiniškame puslapyje. Idėja idiotiškai paprasta: jei niekas neveikia, leidžiam OpenOCD su root teisėmis… joptvairogės, ką gi, bandom:

$ sudo openocd -f interface/jlink.cfg -c 'gdb_memory_map enable' -c 'gdb_flash_program enable' -f target/stm32f1x.cfg
 Open On-Chip Debugger 0.8.0-dev-00294-gbc256b1 (2014-01-03-23:18)
 Licensed under GNU GPL v2
 For bug reports, read
 http://openocd.sourceforge.net/doc/doxygen/bugs.html
 Info : only one transport option; autoselect 'jtag'
 adapter speed: 1000 kHz
 adapter_nsrst_delay: 100
 jtag_ntrst_delay: 100
 cortex_m reset_config sysresetreq
 Info : J-Link initialization started / target CPU reset initiated
 Info : J-Link ARM V8 compiled May 27 2009 17:31:22
 Info : J-Link caps 0xb9ff7bbf
 Info : J-Link hw version 80000
 Info : J-Link hw type J-Link
 Info : J-Link max mem block 9752
 Info : J-Link configuration
 Info : USB-Address: 0xff
 Info : Kickstart power on JTAG-pin 19: 0xffffffff
 Info : Vref = 0.0 TCK = 1 TDI = 0 TDO = 1 TMS = 0 SRST = 1 TRST = 1
 Error: Vref too low. Check Target Power
 Info : J-Link JTAG Interface ready
 Error: jlink_tap_execute failed, result 5
 Info : clock speed 1000 kHz
 Error: jlink_tap_execute failed, result 5
 Error: jlink_tap_execute failed, result 5
 in procedure 'transport'
 in procedure 'init'

Vėl kažkoks raibas organas… Ko dabar tas Vref per žemas? Paskaičius internetus ir pakrapščius galą* niekas neaiškėja.

Krapštymas, matyt, visgi padėjo. Toptelėjo išganinga mintis. Kaip čia gi taip yra, kad prijungus plokštikę prie J-Link ant plokštikės neužsidega jokia lempelė? Juk ten jų keletas yra, kažkur turėtų rodyti, kad daiktas įjungtas. Škia, reikia pabandyti ir tą plokštikę prijungti prie USB.

Akurat, lempikė užsidegė:

Kiniškas Segger J-Link padirbinys ir devboard'as su STM32F103C8T6 procesoriumi | Darau, blė

Bandom dar kartą:

$ sudo openocd -f interface/jlink.cfg -c 'gdb_memory_map enable' -c 'gdb_flash_program enable' -f target/stm32f1x.cfg 
Open On-Chip Debugger 0.8.0-dev-00294-gbc256b1 (2014-01-03-23:18)
Licensed under GNU GPL v2
For bug reports, read
 http://openocd.sourceforge.net/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
adapter speed: 1000 kHz
adapter_nsrst_delay: 100
jtag_ntrst_delay: 100
cortex_m reset_config sysresetreq
Info : J-Link initialization started / target CPU reset initiated
Info : J-Link ARM V8 compiled May 27 2009 17:31:22
Info : J-Link caps 0xb9ff7bbf
Info : J-Link hw version 80000
Info : J-Link hw type J-Link
Info : J-Link max mem block 9752
Info : J-Link configuration
Info : USB-Address: 0xff
Info : Kickstart power on JTAG-pin 19: 0xffffffff
Info : Vref = 3.339 TCK = 1 TDI = 0 TDO = 1 TMS = 0 SRST = 0 TRST = 0
Info : J-Link JTAG Interface ready
Info : clock speed 1000 kHz
Info : JTAG tap: stm32f1x.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3)
Info : JTAG tap: stm32f1x.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1)
Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints

Afigienybė, gi viskas veikia!

Toliau imsiuos Eclipse derinimo. Šiaip Eclipse su ARM įnagėliais jau susikonfigūravau laukdamas to devborduko — jis iki manęs keliavo gerus du su puse mėnesio… užstrigęs mirtinai kažkur buvo, jau nesitikėjau sulaukti. Net pinigus atsiėmiau.

Pirmam vakarui pakaks, o ir vėlu jau. Galiu pasidžiaugti, kad OpenOCD ir J-Link veikia, panašu, kad pastarasis ir prie devborduko prisijungė. Taigi pradžia visai nebloga, nors ir su visokiais užkliuvimais: absoliučiai normalus pirmas kartas.

Visas nuorodėlių rinkinys, kurias labai smarkiai nagrindėjau:

* — čia vabolis.lt atsitiktinis mistaipas (turėtų būti „galvą“), tad tokio išsireiškimo autorinės priklauso minėtojo tinklaraščio savininkui.

Advertisements
Komentarai
  1. darius parašė:

    O tu pirmiausia viska issibandai, ir po to bloga rasai, ar lygiagreciai bloga rasai darydamas savo eksperimentus?

    • Darau, Blė parašė:

      Visaip būna. Kartais įrašas praguli porą mėnesių. Kartais rašau lygiagrečiai. Kartais iliustracijos guli laukdamos aprašymo. Kartais straipsnį parašau galvoje vairuodamas, tada prisėdus prie kompiuterio lieka tik atbarškinti. Vieno metodo neturiu.

  2. ecka333 parašė:

    Siaip tikrai idomus straipsnelis visiems, kas mikrokontroleriais domisi. Tik butu labai gerai kad rasydamas apie juos konkreciai surasytum kainas, jei jau jas lygini, butu aiskiau apie kokias sumas eina kalba.

    • Darau, Blė parašė:

      Yra gi ybėjus tam 😀 Na, bet jei norisi…

      Straipsnyje minėti niekučiai:

      • Atmega328P-PU: $3.15
      • STM32F103C8T8: $3
      • STM32F103C8T8 devbordukas: $7.49
      • LPC1114: $6.30+$4.92 ir dar namuose kažin kaip įlituojamas

      Daugiau biškį tingiu ieškot. O čia J-Link zondukas su galimybe užsisakyti registruotu paštu: $13.68+$3.

  3. Romas parašė:

    Tokiems bandymams kažkur prieš 2 gal 3 metus buvau parsisiuntęs Keil Ulink 2, bet… kažkur pradingo jis pas mane, taip ir neberadau, ARM tiesiogiai nebekliudžiau… nebent biškį su MBED

  4. ignas parašė:

    Labai įdomi kodėl esi tokios blogos nuomonės apie texas instruments? 🙂 Galvoju pradėti su ARM bet tokios gausos yra, kad nežinau kas naudingiausia būtų… Cortex, ATmel NXP ar koks nors Texas instruments.

    • Darau, Blė parašė:

      Nesu aš blogos nuomonės, rinkausi tai, kas kainuoja mažai ir apie ką radau daugiausiai informacijos. Na, ir toolkitą pavyko lengvai pasiruošti.

  5. ignas parašė:

    Na jaučiu rinksiuosi tai ką ir tu pasirinkai. 🙂 https://www.youtube.com/watch?v=3V9eqvkMzHA&list=PLPW8O6W-1chwyTzI3BHwBLbGQoPFxPAPM
    Bet ir šitas visai atrodo neblogas.

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