Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv. copyright. To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby ètenáø vidìl, jakým zpùsobem je titul zpracován a mohl se také podle tohoto, jako jednoho z parametrù, rozhodnout, zda titul koupí èi ne). Z toho vyplývá, že není dovoleno tuto ukázku jakýmkoliv zpùsobem dále šíøit, veøejnì èi neveøejnì napø. umis ováním na datová média, na jiné internetové stránky (ani prostøednictvím odkazù) apod. redakce nakladatelství BEN technická literatura redakce@ben.cz
Mùj startkit ještì obsahuje stabilizátor 7805. Pøevodník MAX232 IC1 je používán pøi ISP programování. K P0.24 až P0.31 se pøes propojky JP5 dá pøipojit 8 diod LED, k P0.16 až P0.23 se pøes JP6 dají pøipojit odpory pøivádìjící na tyto piny log.1 a dále 8 tlaèítek po jejichž stisknutí se na odpovídající pin pøivede log.0 (na obr. 3.13 nejsou tato tlaèítka zakreslena obrázek by již nebyl tak pøehledný). Druhý MAX232 spolu s X2 je urèen pro pøípadnou komunikaci uživatelským programem s dalším sériovým portem poèítaèe PC. 3.3 Ukázka konkrétní práce s LPC2106 Pøi práci s 8bitovými jednoèipy bývá prvním programem, který si odzkoušíme, program, který napø. støídavì rozsvìcuje a zhasíná liché a sudé diody LED pøipojené k paralelnímu portu o 8 pinech (jde o 8bitový poèítaè). Pokusíme se napsat obdobný program, který bude pøedpokládat 8 LED diod pøipojených k P0.24 až P0.31 (obr. 3.13). Mj. musíme pamatovat na to, že délka slova je nyní 32 bitù. Dále si musíme zjistit, jak k paralelnímu portu budeme pøistupovat. Zatím jsme se zabývali jen jádrem ARM. U LPC210x se k periferiím pøistupuje pøes registry. Pøístup k periferii na obr. 3.1 oznaèené jako 32 General Purpose I/O (vlastnì paralelní port) je v uživatelské pøíruèce k LP2104/2105/2106 popsán v kap. 8 GPIO. Než se pustíme do programování, musíme si zjistit další podrobnosti k LPC2106. Nejprve zjistíme, jak vypadá jeho pamì ový prostor obr. 3.14. Je vidìt, že k periferiím (viz obr. 3.1) se pøistupuje pomocí instrukcí pøístupu k pamìti. Jenom místo pamìti SRAM jsou na odpovídajících adresách umístìny registry periferií. Podrobnosti najdeme v již zmiòované uživatelské pøíruèce. Konkrétnì pro GPIO je použito: $GUHVD -PpQR 3RSLV 3 tvwxs [(,23,1 6ORXåtNHþWHQtDNWXiOQtKRVWDYX*3,2SLQ -HQþWHQt [(,26(7 *3,2YêVWXSQtELWRYêUHJLVWUSURQDVWDYHQt ýwhqtqdvwdyhqt KRGQRWQDRGSRYtGDMtFtFKSLQHFKSHULIHULH -HGQLþND]DSVDQiGRWRKRWRUHJLVWUXVHSURMHYt MDNRQDRGSRYtGDMtFtPYêVWXSXQXOD]DSVDQi GRWRKRWRUHJLVWUXVHQLMDNQHSURMHYt [(,2',5 *3,2 tglft UHJLVWU SUR XUþHQt VP UX,2 SUR ýwhqt]islv NDåGê ] ELW *3,2 SHULIHULH 7M XUþXMH NWHUp ELW\EXGRXYVWXSQtDNWHUpYêVWXSQt [(&,2&/5 *3,2YêVWXSQtELWRYêUHJLVWUSURQDVWDYHQt 3RX]HQXORYiQt KRGQRW QD RGSRYtGDMtFtFK SLQHFK SHULIHULH -HGQLþND ]DSVDQi GR WRKRWR UHJLVWUX VH SURMHYt MDNRQDRGSRYtGDMtFtPYêVWXSXQXOD]DSVDQi GRWRKRWRUHJLVWUXVHQLMDNQHSURMHYt POZNÁMKA: Všimnìme si, že pro zápis 0 a pro zápis 1 máme dva rùzné registry. U 8bitových jednoèipù vìtšinou byl k dispozici spoleèný 8bitový registr, do nìhož jsme zapisovali slovo, jehož obsah se pak projevil na pinech paralelního portu. 34 Vladimír Váòa: ARM pro zaèáteèníky A
Obr. 3.14 Nyní je již zøejmé, že pro naše zapojení z obr. 3.13 budeme muset do IODIR zapsat hodnotu 0xFF000000, aby piny, k nimž mám pøipojeny LED diody byly výstupními. Aby LED svítila, musí být na pøíslušném pinu 1, aby nesvítila, musí na pinu být 0. Aby svítily liché LED diody musíme do IOSET zapsat 0x55000000 a do IOCLR 0xAA000000. Pro rozsvícení sudých LED diod do IOSET zapíšeme 0xAA000000 a do IOCLR 0x55000000. Pro vytvoøení blikaèe pak umístíme výše zmínìné zápisy do IOSET a IOCLR do nekoneèné smyèky. Dále musíme použít nìjaký podprogram pro vytvoøení èasové prodlevy a volání tohoto podprogramu umístíme v nekoneèné smyèce vždy za dvojici zápisù do IOSET a IOCLR. Parametry podprogramu èasového zpoždìní pak urèují rychlost blikání LED diod. Nyní si vše prakticky pøedvedeme. Nejjednodušší bude asi napsat program v jazyce C. Pro pøeklad z jazyka C do kódu ARM existuje øada pøekladaèù jazyka C, spolu s knihovnami a popø. i s vývojovým prostøedím IDE. Pro pøedvedení použijeme uvision3 firmy Keil Software [2]. Tato firma je podporovaná firmou ARM a má proto jistì nejlepší informace pro tvorbu vývojového software. Po registraci na jejich stránkách mùžeme zdarma používat evaluation verzi jejich vývojových nástrojù. Nainstalujeme je do PC s OS Win- A Vladimír Váòa: ARM pro zaèáteèníky 35
dows. Pokud použijeme pøednastavené volby, nainstaluje se do C:\Keil. Souèástí instalace je i podsložka Examples obsahující nìkolik ukázkových projektù. Mezi nimi je i projekt blinky používaný jako ukázkový program u øady startkitù i vývojových programù. Jeho výsledkem je bìžící LED dioda. Práci si usnadníme tím, že ho po úpravì použijeme. Pro náš první project jsme vytvoøili podsložku program01 (kdekoli na disku, umístili jsme tuto složku do složky data na disku D. Do této složky zkopírujeme obsah složky blinky z složky examples z C:\Keil\ARM\Examples. Poté spustíme vývojové prostøedí obr. 3.15. Obr. 3.15 V menu vybereme Project Open Project obr. 3.16. Použijeme totiž již hotový project blinky zkopírovaný do nové složky. Na obr. 3.15 je také vidìt, jak budeme postupovat, budeme-li vytváøet skuteènì nový project vybereme položku New project. Tento výbìr bude pozdìji asi èastìjší. 36 Vladimír Váòa: ARM pro zaèáteèníky A
Obr. 3.16 Po výbìru Project Open Project se objeví okno Select Program File s jehož pomocí ve windows bìžným zpùsobem nastavíme umístìní našeho upravovaného projektu blinky. Dále oznaèíme soubor blinky.uv2 a klikneme na tlaèítko Otevøít obr. 3.17. Obr. 3.17 Nyní již mùžeme pracovat se zdrojovým kódem v jazyce C, obr. 3.17. A Vladimír Váòa: ARM pro zaèáteèníky 37
Obr. 3.18 Pøedevším nastavíme piny GPIO, ke kterým máme pøipojeny diody LED a dale zcela zmìníme obsah tìla nekoneèné smyèky while (1) { }. Výsledkem je kód: #include <LPC21xx.H> /* LPC21xx definitions */ #include Timer.h extern long volatile timeval; void wait (void) { /* wait function */ unsigned long i; i = timeval; while ((i + 10)!= timeval); /* wait 100ms */ } int main (void) { IODIR1 = 0xFF000000; /* P1.16..23 definovány jako výstupy */ init_timer(); while (1) { /* Loop forever */ IOSET1 = 0x55000000; IOCLR1 = 0xAA000000; wait (); /* call wait function */ IOSET1 = 0xAA000000; IOCLR1 = 0x55000000; wait (); } } 38 Vladimír Váòa: ARM pro zaèáteèníky A
Zbývá kód pøeložit. V menu vybereme Project Rebild all target files obr. 3.19. Obr. 3.19 V dolním oknì Build uvidíme informaci o prùbìhu kompilace a linkování. V pøípadì chyb udìláme opravu. Bezchybný výsledek je na obr. 3.20. Obr. 3.20 A Vladimír Váòa: ARM pro zaèáteèníky 39
V podsložce obj se objevil nový soubor blinky.hex. Je to požadovaný výsledek naší èinnosti, obr. 3.21. Obr. 3.21 Jeho obsah umístíme do programové pamìti Flast LPC2106 pomocí LPC210x FLA- SH ISP Utility, kterou proto spustíme, obr. 3.22. Obr. 3.22 Konektor X1 startkitu z obr. 3.13 spojíme kabelem se sériovým portem PC. Na startkitu pomocí propojky pøipojíme odpor R1 k P0.14 a tím na tento pin pøivedeme log.0. Dále v listboxu Connected To Port nastavíme pojmenování sériového portu PC, ke kterému máme pøipojen kabel a poté klikneme na tlaèítko Read Device ID. Objeví se okno LPC210x Reset Message obr. 3.23. V našem pøípadì jsme jako sériový port nastavili COM3, nebo na mém PC mám pouze USB a proto jsem použil pøevodník USB/sériový port. Po nainstalování tohoto pøevodníku se objeví virtuální sériový port COM3. 40 Vladimír Váòa: ARM pro zaèáteèníky A
Obr. 3.23 Stiskneme tlaèítko RESET na startkitu a poté tlaèítko OK okna LPC210x Reset Message. Úspìšná komunikace utility s LPC2106 se projeví oknem obr. 3.24. Obr. 3.24 Kliknutím na tlaèítko se tøemi teèkami napravo od okénka Filename se objeví okno Otevøít, pomocí kterého nastavíme cestu k souboru blinky.hex obr. 3.25. A Vladimír Váòa: ARM pro zaèáteèníky 41