Avtor: dr. Simon Vavpotič
2020_281_50
ARMove 32-bitne mikroarhitekture prinašajo v svet mikrokontrolerjev veliko zmogljivost in nešteto novih možnosti uporabe. Kaj so pametni mikrokontrolerji, kaj zmorejo in kako jih uporabljamo? V prejšnjem nadaljevanju smo podrobneje analizirali delovanje USB COM vmesnikov po protokolu CDC in spoznali implementacijo UART protokolov za serijsko komunikacijo, med katerimi je tudi RS-232 protokol. SAMV71 smo povezali s cenenim komunikacijskim vezjem, ESP8266-13, ki omogoča komunikacijo prek omrežij WiFi. Zanimale so nas tudi zmogljivosti U(S)ART funkcijskih enot, predstavil pa smo tudi način delovanja U(S)ART za prenos podatkov s protokoloma SPI in IrDA.
Tokrat se bomo lotili kompleksnejših primerov uporabe, pri katerih bomo programirali tudi krmilnik XDMAC za DMA prenose podatkov in ethernetni krmilnik, izdelali spletni strežnik, pri katerem bomo uporabili operacijski sistem za delo v realnem času (RTOS) ter zvočnim kodekom WM8904 iz razvojne plošče izvabili zvok. Ker bo osrednja tema zadnjega nadaljevanja spletni strežnik, bomo najprej iz interneta prenesli zadnjo različico TCPIP sklada, posodobljeno z novimi primeri uporabe…
Ta vsebina je samo za naročnike
Posodobljen TCP/IP sklad iz GitHuba
Od kar je razvoj Harmony 3 pristal na GitHubu (www.github.com), lahko iz tega spletnega strežnika z nešteto javno objavljenimi programskimi knjižnicami vsakodnevno prenesemo posodobitve. V zadnji različici je v primerjavi s tisto izpred nekaj mesecev dodanih precej koristnih primerov, ki ne le skrajšajo prirejanje obstoječih primerov za ATSAMV71Q21B razvojno ploščo, ampak prinašajo tudi vsebinsko nove primere, od katerih nekateri odpirajo nova poglavja, drugi pa prikažejo nove načine združevanja različnih funkcionalnosti, kot sta spletni strežnik in strežnik FTP. Dobra lastnost GitHuba je možnost hkratnega prenosa vseh datotek posameznega projekta, ki jih lahko prenesemo v obliki ZIP datoteke, ali pa s posebnim orodjem, npr. SVN.
Za tokratno nadaljevanje sem iz GitHuba prenesel zadnjo različico TCP/IP sklada oz. NET sklada, ki ga GitHub zapakira v strnjeno datoteko net-master.zip, ki je bila dolga okoli 414 MB. Ob ne najhitrejših čezatlantskih internetnih povezavah je bilo za njen prenos potrebno počakati dobrih 10 minut. Namesto tega bi lahko uporabil tudi katero od sinhronizacijskih orodij za vzdrževanje verzij, kot je SVN, ki iz GitHuba prenesejo le manjkajoče datoteke in posodobijo obstoječe.
Spletni strežnik
Upravljanje mikrokontrolerja prek spletnega brskalnika, je gotovo s stališča razvoja aplikacijske programske opreme najenostavnejše. Tako sorazmerno enostavno zagotovimo dostopnost vseh njegovih funkcionalnosti iz vseh računalnikov v lokalnem omrežju. Poleg tega, lahko v lokalni Ethernet vključeni mikrokontroler tudi veliko hitreje izmenjuje podatke s strežniki in osebnimi računalniki, kot preko USB povezave.
Primera spletnega strežnika, web_net_server_sdcard_fatfs in web_server_sdcard_fatfs, sta od tistih, ki so v programski knjižnici Harmony 3.0 na voljo za ATSAMV71 Xplained Ultra razvojno ploščo, gotovo najkompleksnejša. Zahtevata vhodno-izhodno vezje, preko katerega se mikrokontroler neposredno poveže v Ethernet pa tudi vrata za priklop SD pomnilniških kartic. K sreči je podpora za Ethernetne komunikacije že v celoti vgrajena v omenjeno razvojno ploščo. Hitrost Ethernetne povezave znaša 10 Mb/s ali 100 Mb/s in dovoljšna hiter prenos podatkov med mikrokontrolerjevim krmilnikom Ethernetne povezave, GMAC, in 512 kB RAMom, ki ga omogoča v GMAC vgrajeni 6-kanalni DMA krmilnik. V mikrokontroler vgrajena enota AES zmore podatke tudi sproti varnostno šifrirati in dešifrirati; oziroma zagotavlja podporo protokolom, kot je HTTPS z varnostnimi kodirani SSL in TLS. Za šifriranje in dešifriranje podatkov je odgovorna programska knjižnica WolfSSL, ki lahko uporablja 2048 bitne šifrirne ključe in asimetrično kriptografijo z javnim in zasebnim ključem. Šifrirana komunikacija poteka preko vrat 443, ki so prednastavljena v datoteki configuration.h z definicijo:
#define TCPIP_HTTP_NET_LISTEN_PORT 443
Motijo le sorazmerno dolgi odzivni časi mikrokontrolerskega spletnega strežnika, ko uporabljamo šifriranje. Slednjega lahko izklopimo, če namesto vrat 443 izberemo vrata 80. Opozorimo še na to, da moramo za pravilno delovanje spletnega strežnika predhodno v nastavitve vnesti tudi pravilen naslov strežnika DNS in strežnika prehod v internet, kar storimo z ustreznimi definicijami, na primer:
#define TCPIP_NETWORK_DEFAULT_IP_ADDRESS_IDX0 "192.168.0.3" #define TCPIP_NETWORK_DEFAULT_IP_MASK_IDX0 "255.255.255.0" #define TCPIP_NETWORK_DEFAULT_GATEWAY_IDX0 "192.168.0.1" #define TCPIP_NETWORK_DEFAULT_DNS_IDX0 "192.168.0.2" #define TCPIP_NETWORK_DEFAULT_SECOND_DNS_IDX0 "192.168.0.4"
Vsekakor moramo vsaj za silo pravilne nastavitve v datoteki configuration.h izbrati pred prevajanjem programske kode, na spletni strani jih lahko nato tudi ponovno spremenimo. Do spletne strani lahko naenkrat dostopa več odjemalcev, vendar moramo v nastavitvah HTTP_NET strežnika določiti največje število odjemalcev (prednastavljena vrednost je 4).
S pomočjo tehnologije AJAX lahko spletni strežnik sproti osvežuje spletno stran na enem ali več odjemalskih računalnikih. Za uporabo AJAX moramo izbrati tudi ustrezne nastavitve v spletnem brskalniku, oziroma spletno stran mikrokontrolerja uvrstiti med zaupanja vredne spletne strani.
HTTP_NET in JavaScript
Spletni strežnik ne omogoča zadnjih različic programskega jezika JavaScript, vseeno pa lahko za sproten prikaz podatkov uporabimo že nekoliko zastareli AJAX. Denimo, če spletno stran izdelamo v Google Sites in jo, denimo z orodjem HTTrack, prenesemo v Flash RAM mikrokontrolerja ali na (Micro)SD kartico, spletna stran z vzorčnim HTTP strežnikom iz primera web_net_server_sdcard_fatfs ali primera web_server_sdcard_fatfs ne bo delovala. Vendar lahko nove spletna strani uspešno zasnujemo, deimo v Microsoft Wordu, v katerem lahko dokument shranimo v HTM ali HTML obliki.
Možnost hrambe podatkov spletne strani na SD kartici zelo olajša njeno izgradnjo, urejanje in posodabljanje, saj lahko s pridom izkoristimo nekaj 10 GB velik Flash RAM, hkrati pa lahko vsebino kartice spremenimo v osebnem računalniku in jo nato ponovno priklopimo na mikrokontroler, brez posodobitve njegove vgrajene programske opreme. Posodobitev vgrajene programske je potrebna le pri spreminjanju vgrajenega programja, ki poganja spletno stran. Vsekakor lahko za enostavnejše projekte izkoristimo tudi v mikrokontroler vgrajeni Flash RAM, ki obsega 2 MB, kar omogočata primera: web_net_server_nvm_mpfs in web_server_nvm_mpfs. Vendar tu ne gre brez vsakokratne posodobitve vgrajene programske kode.
Opozorimo še na to, da sta primera web_server_sdcard_fatfs in web_server_nvm_mpfsv Microchip Harmony 3 dodana le zaradi združljivosti za nazaj, saj uporabljata zastareli programski sklad, HTTP, ki ga namerava Microchip v prihajajočih različicah Harmonyja 3 umakniti. Razvoj nove programske opreme je zato priporočljivo zasnovati na primerih: web_net_server_sdcard_fatfs, web_net_server_nvm_mpfs in drugih z vstavljeno besedico »net«, ki temeljijo na novejšem programskem skladu, HTTP_NET.
Osnovne (pre)nastavitve
Medtem, ko grafično podobo spletne strani sestavimo z različnimi urejevalniki, moramo pri dinamičnih elementih izdelati tudi ustrezno programsko kodo. Svoje znanje najhitreje preverimo s prižiganjem LED0 in LED1, saj moramo preleteti kar nekaj kode, da pravilno nastavimo njuno delovanje. V osnovnem primeru deluje le LED1 pod pogojem, da predhodno prestavimo mostiček (JP02, oz. USB VBUS) na pozicijo LED1. Če želimo uporabiti obe v ATSAMV71 Xplained Ultra vgrajeni LED, lahko kot LED2 v aplikaciji definiramo še LED0 na razvojni plošči, ki je fiksno povezana z vrati PA23. V ta namer moramo spremeniti kodo v datoteki app.h. Pri tem upoštevamo še posebnost ATSAMV71 Xplained Ultra razvojne plošče: stanje 0 (LED sveti) in stanje 1 (LED ne sveti):
#define APP_LED_1StateSet() LED1_Clear() #define APP_LED_1StateGet() LED1_Get() #define APP_LED_1StateClear() LED1_Set() #define APP_LED_1StateToggle() LED1_Toggle()
Omenjeno naredimo tudi za LED2. Zdaj se lotimo datoteke plib_pio.c, v kateri nastavimo priključek A23 kot izhodni:
((pio_registers_t*)PIO_PORT_A)->PIO_OER = 0x800000; ((pio_registers_t*)PIO_PORT_A)->PIO_ODR = ~0x800000;
V programski datoteki plib_pio.h pa za LED1 in LED2 spremenimo še naslednje definicije, glej program 1.
Zdaj je mogoče obe LED koristno uporabiti tudi v aplikaciji kot LED1 in LED2, pri čemer pravilno deluje tudi podstran Processing Forms, v kateri lahko poljubno nastavljamo stanje obeh; le da LED1 neprestano utripa, zaradi česar se njeno novo stanje ne ohrani.
Prikaz, vnos in shranjevanje podatkov
Vnos podatkov v spletne obrazce in njihovo shranjevanje na spletni strežnik sta eni izmed najpomembnejših nalog. Zato sta prikazana z več primeri. Podstran Dynamic Variables prikazuje način, kako uporabniku predstaviti trenutne statusne podatke, v našem primeru katere LED svetijo, lahko pa bi prikazali tudi druge podatke. Spletni strežnik si pri prikazu vrednosti spremenljivk pomaga s standardiziramo funkcijo TCPIP_HTTP_Print_<ime spremenljivke>(TCPIP_HTTP_NET_CONN_HANDLE connHandle, const TCPIP_HTTP_DYN_VAR_DCPT *vDcpt), ki jo moramo posebej določiti za vsako od spremenljivk, ki jih želimo sproti osveževati na spletni strani. Pri tem vektor vDcpt kaže na strukturo, preko katere vrednost posredujemo spletni strani.
Primeri spletnih strežnikov v Microchip Harmony 3 shranjujejo vnesene vrednosti tekstovne datoteke v datotečnem sistemu spletne strani, vendar si moramo za resnejše delo omisliti tako ali drugačno podatkovno zbirko, ki jo lahko implementiramo sami, ali pa v spletu poiščemo ustrezno (zastonjsko) odprtokodno programsko opremo za gradnjo podatkovnih zbirk.
Varnost spletne strani in datotek
Dostop do spletne strani, njenih podstrani, ali do posameznih datotek in datotečnih imenikov, v katerih je shranjena spletna stran, lahko po potrebi zaščitimo z uporabniškim imenom in geslom. Primeri spletnega strežnika omogočajo osnovno identifikacijo z uporabniškim imenom in geslom, vendar ne tudi ustrezno varovanje le teh. Za resno uporabo bi morali primere spletnih strežnikov iz Microchip Harmony 3 še precej predelati. Vseeno lahko trdimo, da osnovno varnost zagotavlja že varnostno šifriranje SSL ali TLS, s pomočjo katerega varno potujejo podatki med odjemalci in spletnim strežnikom v mikrokontrolerju.
K večji varnosti lahko prispeva tudi generator pravih naključnih števil v SAMV71Q21B, ki preprečuje, da bi lahko s katerimkoli algoritmom pri pogoju sinhronizacije ur odkrili, katera bo naslednje »naključno« število, ko ga bo mikrokontroler uporabil za varno šifriranje podatkov. Je pa res, da lahko varnost podatkov zagotavljamo tudi z njihovim pravilnim usmerjanjem po lokalnem omrežju, kar lahko zagotavljamo z ustreznimi spojniki in usmerjevalniki. Bistveno je, da promet podatkov med odjemalcem in strežnikom (v tem primeru mikrokontrolerjem) ne morejo spremljati tudi drugi računalniki v krajevnem omrežju (npr. če bi v usmerjevalniki uporabili širjenje spektra ali podobne metode razpošiljanja paketov, ki so namenjene predvsem diagnostiki delovanja omrežij). S tem že v osnovi preprečimo možnosti zlorab.
Poglejmo, kako spletni strežnik preverja uporabniška imena in pristopna gesla. Odgovor na to, ali je uporabnik vnesel pravilno uporabniško ime in pristopno geslo podaja funkcija TCPIP_HTTP_NET_ConnectionUserAuthenticate, katere izvorna koda je v datoteki custom_http_net_app.c. Vsekakor bi pri resni uporabi morali dodati bazo uporabnikov in njihovih pravic, s katero bi zagotavljali dostope do različnih zaščitenih funkcionalnosti.
Varnost podatkov lahko zagotavljamo tudi na ravni datotek in datotečnih imenikov, do katerih lahko dostopamo preko HTTP(S) protokola. Varovanje dostopa na ravni datotečnega imenika je v primerih spletnih strežnikov zagotovljeno za vse datoteke v mapi protect in za vse datoteke, katerih ime se začne z zaporedjem črk snmp. S spremembo programske kode funkcije TCPIP_HTTP_NET_ConnectionFileAuthenticate lahko spremenimo obseg in način varovanja datotek.
Vsekakor velja poudariti, da omenjeni funkcij delujeta kot filtra, ki sta uporabljena pri vsakem dostopu do mikrokontrolerjevih spletnih strani ali datotek. V primerih, ko je potrebno podati uporabniško ime in geslo, sprožita prikaz pojavnega okna, v katerega mora uporabnik vnesti svoje poverilnice.
Pomožna orodja
Pri uporabi spletnega strežnika si lahko pomagamo tudi z java programskima orodjema Microchip TCPIP Discoverer in MPFS(2) Utility. Prvo je uporabno v lokalnih omrežjih s strežnikom DHCP, ki samodejno podeljuje naslove IP računalnikom v omrežju, saj prikaže naslove MAC in IP za vse Microchipove spletne strežnike tipa NETPRESS.
MPFS Utility in MPFS2 Utility sta java programčka, s katerima lahko običajno imeniško strukturo splete strani pretvorimo v eno izmed datotek različnih tipov, ki jih je mogoče naložiti neposredno v mikrokontroler. MPFS Utility je namenjen starejšim primerom spletnega strežnika, kot sta: web_server_sdcard_fatfs in web_server_nvm_mpfs, MPFS2 Utility pa novejšim, kot sta: web_net_server_sdcard_fatfs in web_net_server_nvm_mpfs.
Datotečno strukturo spletne strani lahko obenem preko C datoteke mpfs_net_img.c, ki jo ustvarimo MPFS(2) Utility (podprt je le datotečni sistem MPFS), neposredno vnesemo v vgrajeno programsko kodo, ki jo nato s programatorjem prenesemo v mikrokontroler, skupaj s programsko kodo. Denimo, v primeru web_net_server_nvm_mpfs na ta način spletno stran shranimo v programski pomnilnik mikrokontrolerja, vendar je kasneje brez spremembeugnezdene programske opreme ne moremo spreminjati. Za uporabo klasičnega FAT16 datotečnega sistema moramo datotečno strukturi spletne strani namestiti na kartico (micro)SD.
MPFS(2) Utility omogoča tudi nalaganje nove vsebine spletne strani med delovanjem mikrokontrolerja, vendar mora biti spletna stran naložena na podatkovni pogon z datotečnim sistemom MSFS, hkrati pa mora spletni strežnik podpirati funkcionalnost mpfsupload, ki je dostopna preko istoimenske spletne podstrani.
Vrsto datotečnega sistema podatkovnega pogona lahko sicer nastavimo tudi v datoteki app.h, kjer sta naslednji definiciji:
#define APP_SYS_FS_TYPE FAT #define APP_SYS_FS_TYPE_STRING "FATFS"
Namesto FAT lahko izberemo tudi MPFS, pri čemer lahko za tekstovni opis datotečnega sistema izberemo poljuben znakovni niz.
FTP strežnik
FTP protokol predstavlja enega izmed najlažjih načinov dostopa do podatkov na podatkovnem pogonu s pomočjo spletnih storitev. Primer web_ftp_server_mpfs_fatfs, ki združuje spletni strežnik in strežnik FTP, temelji na datotečnih sistemih MPFS, ki ga uporablja spletni strežnik, in FAT16 na (micro)SD kartici, do katerega dostopamo preko FTP strežnika. Mikrokontroler sicer nima težav s hkratno podporo strežniku spletnih strani in strežniku FTP. Res pa je, da ima vsak od strežnikov zagotovljen izključen dostop do svojega podatkovnega pogona.
Vendar je omenjeni primer prirejen samo za ATSAME70 Xplained razvojno ploščo. Čeprav za razvojno ploščo ATSAMV71 Xplained Ultra za primer web_ftp_server_mpfs_fatfs še ni ustreznih nastavitev, se lahko z malo truda do njih dokopljemo sami, saj sta razvojni plošči podobni. Pri iskanju potrebnih sprememb v datotekah z izvorno kodo si lahko pomagamo tudi s programskimi orodji, kot je WinMerge, s katerim lahko hitro poiščemo vse bistvene razlike med dvema izvornima kodama, ki imata podobno strukturo datotečnih map.
Merjenje zmogljivosti z IPERF
Mikrokontrolerji se spreminjajo v prave male računalnike, zato ne preseneča, da je v zadnji različici sklada TCP/IP tudi orodje za preverjanje pravilnosti delovanja in merjenje zmogljivosti prenosa podatkov po lokalnem omrežju. Iperf upravljamo preko terminalske povezave, oziroma navideznega COM vmesnika, katerega delovanje podpira v razvojno ploščo vgrajeni programator, EDBG. Na voljo imamo nabora ukazov tcpip in iperf. S prvimi nastavimo IP naslove in IP maske strežnikov DNS in DHCP ter preverimo pravilnost delovanja, z ukazi iperf pa prenašamo testne pakete podatkov in merimo zmogljivost.
Operacijski sistemi za delo v realnem času
FreeRTOS ali podoben operacijski sistem za delo v realnem prinaša v svet mikrokontrolerjev povsem novo dimenzijo, saj v zameno za nekaj malega zmogljivosti, nudi celo paleto storitev, ki olajšajo pripravo programske kode za vzporedne procese. Čeprav njegova uporaba zaenkrat ni nujna in ga večina primerov ne uporablja, lahko v prihodnje pričakujemo ravno nasprotno. Le zakaj bi odkrivali »toplo vodo« in vzporednost implicitno vgrajevali v svojo vgrajeno programsko opremo, ko pa lahko za vse to poskrbi jedro operacijskega sistema?
Vendar je treba priznati, da veliko primerov iz Microchip Harmony 3, ki uporabljajo FreeRTOS, deluje približno enako hitro kot tisti brez njega. Denimo, v omenjenih primerih spletnih strežnikov ni izkoriščena možnost izvajanja večopravilnosti preko operacijskega sistema. Večopravilnost je izvedena eksplicitno s pomočjo programske implementacije avtomata stanj; kar je skoraj gotovo vzrok, da je delovanje vgrajene programske opreme uporabo operacijskega sistema in brez njega približno enako hitro. Kljub temu je v primerih z FreeRTOS vse pripravljeno za zagon prave večopravilnosti, saj lahko vzporedno z osnovno aplikacijo sorazmerno enostavno vgradimo in zaženemo še poljubno lastno aplikacijo. O podrobnostih delovanja operacijskega sistema FreeRTOS se lahko veliko več naučimo iz primera task_notification_freertos.
XDMAC krmilnik
Hitre funkcijske enote SAMV71Q21B, kot sta Ethernet in USB krmilnik, imajo vgrajene lastne DMA krmilnike, medtem ko se morajo počasnejše funkcijske enote, kot je USART, zanašati na zmogljiv skupni DMA krmilnik, XDMAC. Z njim lahko izvajamo tudi prenose podatkov med posameznimi deli pomnilnika mikrokontrolerja; kar nazorno prikaže primer xdmac_memory_transfer, v katerem najprej v XDMAC prenesemo naslova pomnilniških področij in izvedemo nastavitve (v našem primeru prenašamo podatke v blokih po 16 bajtov), nakar sprožimo DMA prenos, ki poteka neodvisno od delovanja ARMovega procesorskega jedra v SAMV71Q21B:
channelSettings = XDMAC_ChannelSettingsGet(XDMAC_CHANNEL_0); channelSettings = (channelSettings & ~XDMAC_CC_MBSIZE_Msk) | XDMAC_CC_MBSIZE_SIXTEEN; XDMAC_ChannelSettingsSet(XDMAC_CHANNEL_0, channelSettings); XDMAC_ChannelTransfer(XDMAC_CHANNEL_0, &srcBuffer, &dstBuffer2, TRANSFER_SIZE);
V omenjenem primeru nato sledi še primerjanje originalnih in prenesenih podatkov, ki pride prav pri preverjanju pravilnosti nastavitev in delovanja XDMAC.
24-kanalni XDMAC lahko uporabimo tudi v kombinaciji s prekinitvenimi vhodi, s katerimi prožimo DMA prenose podatkov tudi iz perifernih naprav, denimo kot je USART iz preteklega nadaljevanja. Pri konfiguraciji XDMAC za delovanje z USART moramo upoštevati, da lahko slednji naenkrat prebere le en bajt podatkov, medtem ko XDMAC prenaša vsaj 4-bajtne besede. Kljub temu lahko podatke bolj strnemo, če uporabljamo mikrobloke.
Zvok
Razvojni plošči ATSAME70 Xplained in ATSAMV71 Xplained Ultra omogočata tudi uporabo avdio kodeka WM8904, ki je v ATSAMV71 Xplained Ultra že vgrajen, za enostavnejšo razvojno ploščo, ATSAME70 Xplained, pa ga moramo dokupiti na vtičnem modulu. Vendar je zanimivo, da so v avdio skladu MPLAB Harmony 3 večinoma le programski primeri za ATSAME70 Xplained. Za ATSAMV71 Xplained Ultra razvojno ploščo sta prirejena le primera audio_tone in microphone_loopback, ostale lahko priredimo sami.
Za uporabo primera us_hi_res_basic_sam_e70_xult_wm8904_i2sc_usb v ATSAMV71 Xplained Ultra, moramo spremeniti nastavitve, tako da ustrezajo drugače razporejenim priključkom in drugačnim izvedbam časovnikov. Denimo, omenjeni primer za USB komunikacijo uporablja signal USB VBUS sense, za katerega je pri ATSAME70 Xplained uporabljen priključek PB8, pri ATSAMV71 pa PC9.
Pri delu si lahko pomagamo tudi z MPLAB Harmony 3 Configuratorjem. Vendar pozor! V programski kodi med izvajanjem njenih sprememb s programskim generatorjem kar nekajkrat opazimo zapis »KEEP THIS« (slov. »ohrani to«) s pojasnilom, da programski generator ne predlaga pravih popravkov, kar moramo upoštevati. Obenem ne smemo brisati niti delov programske kode, posebej prirejenih za mikrokontroler ATSAME70Q21B, saj veljajo tudi za njegovega mlajšega bratranca, ATSAMV71Q21B.
Še veliko možnosti…
ATSAMV71 Xplained Ultra razvojna plošča omogoča še veliko zanimivih možnosti uporabe, a vseh v osmih delih članka ni bilo mogoče predstaviti; več na sites.google.com/site/pcusbprojects. Je zmogljivo in zanimivo razvojno orodje, s katerim lahko prototipiramo najsodobnejša elektronska krmilna vezja. Hitra ARMova procesorska jedra omogočajo tudi vgradnjo najsodobnejših metod umetne inteligence in veliko prilagodljivost željam uporabnikov… Prihodnjič začnemo z novo serijo o programiranju modulov za brezžično WiFi komunikacijo, ESP8266.program 1
#define LED1_Set() (PIOC_REGS->PIO_SODR = (1<<9)) #define LED1_Clear() (PIOC_REGS->PIO_CODR = (1<<9)) #define LED1_Toggle() (PIOC_REGS->PIO_ODSR ^= (1<<9)) #define LED1_Get() ((PIOC_REGS->PIO_PDSR >> 9) & 0x1) #define LED1_OutputEnable() (PIOC_REGS->PIO_OER = (1<<9)) #define LED1_InputEnable() (PIOC_REGS->PIO_ODR = (1<<9)) #define LED1_PIN PIO_PIN_PC9 #define LED2_Set() (PIOA_REGS->PIO_SODR = (1<<23)) #define LED2_Clear() (PIOA_REGS->PIO_CODR = (1<<23)) #define LED2_Toggle() (PIOA_REGS->PIO_ODSR ^= (1<<23)) #define LED2_Get() ((PIOA_REGS->PIO_PDSR >> 23) & 0x1) #define LED2_OutputEnable() (PIOA_REGS->PIO_OER = (1<<23)) #define LED2_InputEnable() (PIOA_REGS->PIO_ODR = (1<<23)) #define LED2_PIN PIO_PIN_PA23