Avtor: Brian Millier
Arduino zdaj prodaja svojo najnovejšo Arduino ploščo – Uno Q. Kot namiguje ime, uporablja velikost in format starejše plošče Uno, vključno z originalnima dvema ženskima I/O konektorjema, ki sta na plošči Uno.
Slika 1 prikazuje fotografijo te plošče. Razpored priključkov teh konektorjev je v bistvu enak kot pri originalni Uno plošči, zato je mogoče na to ploščo priključiti in na njej uporabljati veliko različnih Arduino ščitov. Vendar pa se tu podobnosti med ploščama končajo. Morda vas bo zanimalo, da se shema originalne plošče Uno udobno prilega na eno A4 stran. Shema Uno Q pa se razteza na 24 straneh! V tem članku bom predstavil stvari, ki sem jih odkril med pregledovanjem te nove plošče, od katerih mnoge niso omenjene v prvotni dokumentaciji Arduina.
Ta vsebina je samo za naročnike
Medtem ko je originalni Uno vseboval 8-bitni mikrokontroler Atmel AVR Mega328, ta nova plošča vsebuje srednje zmogljiv 32-bitni mikrokontroler STM ARM ter Qualcomm QRB2210 SOC. 32-bitni mikrokontroler STM32U585 krmili vrata za GPIO, SPI, I2C in UART, ki so priključena na dva starejša 0,1-palčna konektorja na plošči. Čeprav mikrokontroler STM32U585 deluje na 3,3 V, so njegove digitalne I/O linije tolerantne do 5 V, kar je za ARM mikrokontrolerje nekoliko nenavadno.



Qualcomm QRB2210 je štirijedrni sistem na čipu Arm Cortex-A53. Dopolnjuje ga 16 GB eMMC Flash pomnilnik in 2 GB LPDDR4x SDRAM. Arduino je na ta SOC vnaprej naložil Debian Linux, priljubljeno distribucijo Linuxa. V uporabniškem priročniku je priporočeno, da kupite različico 32 GB eMMC + 4 GB SDRAM, če nameravate razvijati programsko opremo v načinu eno-ploščnega računalnika z operacijskim sistemom Linux na plošči. Vendar pa te različice z razširjenim pomnilnikom v spletni trgovini Arduino še nisem videl. Osnovna različica, ki je na voljo, stane 47,58 € v trgovini Arduino in 44 USD v trgovini Digikey.
Morda se sprašujete, zakaj ne bi kupili Raspberry Pi namesto Uno Q. Najbližji model bi bil Raspberry Pi 4 Model B z 2 GB RAM-a, ki je približno enako drag, vsaj tukaj v Kanadi. Vendar je primerjava med tema dvema modeloma kot primerjava jabolk in pomaranč. Razlikujeta se precej, razen v tem, da oba vsebujeta SOC in delujeta na operacijskem sistemu Linux. Tabela 1 prikazuje primerjavo značilnosti med tema dvema ploščama.
Tako plošča Raspberry Pi kot plošča Uno Q uporabljata štirijedrni Arm Cortex procesor – plošča Uno Q deluje z višjo takratno frekvenco, vendar ima Raspberry Pi 4 nekoliko močnejša A-72 Arm jedra. Uno Q uporablja eMMC Flash pomnilnik, ki je boljši od uSD kartice Pi 4. Vendar pa Flash pomnilnika ni mogoče razširiti, ko ste se odločili, kateri model plošče Uno Q boste kupili. Za prikaz videa je Pi 4 boljša izbira, saj ima dvojno 4K HDMI zmogljivost prek mikro-HDMI vtičnic. Da bi dobili HDMI video iz Uno Q, morate uporabiti USB-C dock, ki omogoča HDMI izhod. Če nameravate ploščo uporabljati kot samostojni enoploščni računalnik (SBC), ima Pi 4 tako HDMI video kot 4 USB vrata za miško, tipkovnico itd. Za delovanje v SBC načinu bo Uno Q potreboval USB-C hub za naprave uporabniškega vmesnika in za HDMI video izhod.
Uno Q se odlikuje po svojem ST32U585 Arm MCU. Ta pomožni MCU deluje s frekvenco 160 MHz in je zasnovan za obdelavo različnih I/O perifernih naprav v realnem času. Njegova razvojna platforma je Arduino C++, ki deluje na Zephyr RTOS. V zadnjem letu je Arduino prenesel pakete podpore za svoje Arm MCU-je iz zdaj že zastarele platforme Mbed na Zephyr RTOS. Torej, to je le najnovejša Arduino plošča z Arm MCU, ki je sprejela Zephyr RTOS. Večina I/O funkcionalnih blokov plošče Uno Q je vsebovana v STM32U585, tj. SPI, I2C (2), UART, CAN, kot tudi standardna skupina GPIO priključkov, ki so bili prisotni na prejšnjih Uno ploščah. Uno Q ponuja 14-bitni ADC s 6 multipleksiranimi kanali, ki so na voljo na 14-pinskem JANALOG priključku. Na 14-pinskem JANALOG priključku sta na voljo tudi dva 12-bitna DAC-a.



Če ste podobni meni, nimate veliko izkušenj z uporabo plošč, ki vsebujejo tako Linux SOC kot pomožni MCU. Najbližje, kar sem prišel, je razvojna plošča BeagleY-AI, ki sem jo prejel za pregled. Vsebuje zelo zmogljiv Texas Instruments AM67A SOC, ki vsebuje štiri procesorje Arm Cortex-A53, tri enojedrne procesorje Arm R5F in dva matrična pospeševalnika, vsak z DSP C7x @ 1 GHz. Pripravljen sem priznati, da nisem imel pojma, kako uporabljati katerega koli od drugih zmogljivih procesorjev, vsebovanih v AM67A SOC. BeagleY-AI bi lahko bil tudi Raspberry Pi z operacijskim sistemom Linux, kar zadeva mene.
Ko sem izvedel, da Arduino Uno Q vsebuje Linux SOC in pomožni MCU STM32U585, sem bil nekoliko skeptičen, ali bom lahko uporabil oba procesorja. Prvo, kar mi je prišlo na misel je bilo, kako bosta komunicirala med seboj. Oblikoval sem nekaj projektov, ki so vsebovali dva ločena MCU, in uskladitev komunikacije med tema dvema napravama je bila pravi izziv.
Arduino je zagotovil več orodij, ki olajšujejo vključitev Linux SOC in ST MCU v zasnovo. Na najosnovnejši ravni, da bi omogočili komunikacijo med obema procesorjema, potrebujete nekaj, kar Arduino imenuje Bridge. Bridge je v bistvu kombinacija vrat na vsakem procesorju, ki so med seboj povezana. Vsaj ena od teh vrat morajo biti sposobna prenašati podatke v obe smeri in to po možnosti zelo hitro.
Slika 2 je blok diagram Uno Q. Upoštevajte, da je večina perifernih blokov, kot so GPIO, SPI itd., povezanih na STM32U585. Vsi bloki v zeleni barvi so povezani na STM32U585 in delujejo na 3,3 V.
Digitalne linije STM32U585 so tolerantne do 5 V. Roza bloki so povezani na QRB2210 SOC in delujejo na 1,8 V. Periferne SOC naprave delujejo na 1,8 V in so priključene prek JMEDIA in JMISC vtičnic na dnu plošče. Te linije niso združljive s 3,3 ali 5 V. JMEDIA konektor vsebuje signale SOC MIPI CSI in DSI za kamere in LCD zaslone. Predvidevam, da bo Arduino v prihodnosti ponudil nosilno ploščo, ki omogoča uporabo dveh glav z visoko gostoto na dnu Uno Q.
Most, omenjen zgoraj, je sestavljen iz SPI in UART vrat na vsakem procesorju. Čeprav to na sliki 2 ni prikazano, so na SPI in UART vratih nujno potrebni pretvorniki nivoja. Način izmenjave podatkov med mikrokontrolerjem STM32U585 in SOC ni opisan v dokumentaciji uporabniškega priročnika. Namesto tega obstaja API na visokem nivoju, imenovan Remote Procedure Call (RPC), ki upravlja pretok podatkov in ukazov med obema procesorjema. Ta RPC zmogljivost je prisotna v programski opremi obeh procesorjev in deluje enako v obeh domenah.
STM32U585 deluje kot podrejeni procesor pod nadzorom SOC QRB2210. Na sliki 2 so pod povezovalnimi vodili mostu prikazana SW Debug vodila. Programiranje mikrokontrolerjev Arm se običajno izvaja s pomočjo SW debug (tj. Swd) – pogosto s pomočjo namestitve ločenega mikrokontrolerja na razvojno ploščo, programirano za izvajanje tega protokola za utripanje/debug. Ta programski mikrokontroler se običajno poveže z računalnikom prek USB.



Uno Q uporablja SW debug za programiranje Flash pomnilnika STM32U585, vendar se to izvaja drugače kot pri drugih MCU razvojnih ploščah. V primeru Uno Q SOC QRB2210 prejme programirne ukaze/podatke iz vašega računalnika (prek USB-C) in jih nato preprosto posreduje mikrokontrolerju STM32U585 prek SW Debug linij, ki povezujejo oba procesorja. To se zgodi, ko izvajate programsko opremo Arduino App Lab PC v načinu USB ali omrežnem načinu (pojasnjeno kasneje). Vendar pa lahko programsko opremo Arduino App Lab zaženete tudi neposredno na samem SOC QRB2210, če uporabljate Uno Q v načinu SBC. V tem primeru programsko orodje Linux Swd za programiranje še vedno uporablja SW debug linije med dvema procesorjema.
Upoštevajte prisotnost linije Reset, ki izvira iz SOC in se povezuje s STM32U585. Za razliko od drugih MCU razvojnih plošč, ki ste jih morda že uporabljali, Uno Q deluje drugače. Ko se plošča Uno Q vklopi, traja vsaj 30 sekund, da SOC QRB2210 naloži Linux. V tem času bo LED matrični zaslon, ki ga nadzira STM32U585, prikazoval dinamični logotip Arduino, kot je prikazano na sliki 3. Ko se to ustavi in se nadomesti z ikono srca, to pomeni, da je SOC končal z nalaganjem Linuxa in mora nato poslati signal STM32U585, da lahko začne izvajati program vaše skice. To mi je bilo nekaj časa nekoliko nejasno – navajen sem, da MCU začne izvajati mojo skico skoraj takoj, ko se plošča vklopi.
Če pogledamo shemo plošče Uno Q vidimo, da je linija GPIO_38 SOC povezana z linijo NRST STM32U585 prek TXS0104 nivojskega premika. Tako SOC resetira mikrokontroler STM32U585, kar mu omogoča, da začne prikazovati zgoraj omenjeni dinamični logotip Arduino. Upoštevajte, da bo STM32U585, razen v primeru vklopa, ko ponovno programirate STM32U585 (na primer po urejanju kode), začel izvajati takoj, ko bo programiranje končano. V tem primeru dinamični prikaz LED matrike ne bo na voljo.
Na drugih MCU ploščah, če ste v MCU naložili spremenjen program in ta ne deluje kot pričakovano, lahko preprosto pritisnete gumb za ponastavitev plošče in ponovno opazujete izvajanje programa. Na Uno Q to ni mogoče. Plošča Uno Q ima tipko z oznako Power. Ta tipka ne deluje tako, kot bi pričakoval. Namesto tega deluje na naslednji način:
Ko priključite napajalno napetost na Uno Q, se samodejno zažene. Zagon sistema Linux SOC traja 30 sekund, po tem času pa STM32U585 lahko začne izvajati svoj program (pred tem LED matrika prikaže zgoraj omenjeni logotip).
Medtem ko je napajanje vklopljeno, bo pritisk na tipko za vklop ponovno zagnal Linux SOC, vendar to ne vpliva na delovanje STM32U585 – ta bo nadaljeval z izvajanjem programa, ki je bil naložen.
Eden od načinov za ponovni zagon skice na mikrokontrolerju STM32U585 Uno Q je ponovno nalaganje skice s ponovnim programiranjem skice. To velja, če za razvoj uporabljate Arduino IDE različico 2.x.x. Za programsko opremo Arduino App Lab se postopek programiranja izvede s pritiskom na tipko Run. S tem se ponovno programira mikrokontroler STM32U585 in (ponovno) programira python program, ki teče na SOC-u.
Na konektorju JANALOG je priključek z oznako RESET. Ta je neposredno povezan z linijo NRST mikrokontrolerja STM32U585 in izvede trdo ponastavitev STM32U585 mikrokontrolerja, ko je priključek NRST priključen na maso. Dinamični prikaz logotipa na LED matrici se ne pojavi, ko je ta linija RESET aktivna – morda obstaja linija GPIO do SOC, ki določa, ali se ta rutina izvede ob zagonu – to mi ni jasno.
Še vedno se sklicujemo na sliko 2, opazite, da WiFi in Bluetooth povezljivost krmili ločen modul, ki je povezan na SOC. Najprej morate v operacijskem sistemu Linux vnesti poverilnice za WiFi dostopno točko. Nato se ta poverilnica shrani nekje v eMMC Flash pomnilniku. Čeprav ne morete dostopati do WiFi/Bluetooth modula neposredno iz STM32U585, obstaja knjižnica z naslovom »Arduino RouterBridge«, ki jo lahko vključite v svojo STM32U585 skico. To vam omogoča dostop do WiFi povezave na podoben način, kot bi ga imeli, če bi uporabljali MCU z WiFi v Arduino IDE (na primer ESP32). Razlika je v tem, da vam ni treba vključiti poverilnic za WiFi dostopno točko v skico, saj so že shranjene v Linux SOC eMMC Flash pomnilniku.
Nekaj, kar mi je bilo nekoliko nejasno, je bil način, na katerega se Uno Q prepozna kot USB-naprava na vašem računalniku. Ko Uno Q priključite na USB vrata računalnika, se v upravitelju naprav Windows pod COM-vrati približno 30 sekund ne prikaže nič. To je približno čas, ki ga Uno Q potrebuje za zagon sistema Linux. Nato se bo prikazal v upravitelju naprav brez drugega opisa kot „USB Serial Device (COMx)“. Enaka zamuda se pojavi, če uporabljate Arduino IDE 2.x.x. V tem primeru se bo v seznamu vrat prikazala kot »COMx (Arduino Uno Q)«. Če ste malo nestrpni, lahko pride do tega, da boste mislili, da vaš računalnik ne prepozna vaše plošče, če ji ne daste dovolj časa.
Arduino App Lab programska oprema
Ko na računalniku zaženete Arduino App Lab, se prikaže zaslon, kot je prikazan na sliki 4. Ta zaslon bo prikazan vsaj 30 sekund, če ste Uno Q pravkar priključili na USB-vrata računalnika, saj Uno Q še vedno zaganja Linux.
Približno v istem trenutku, ko Windows z zvočnim signalom opozori na novo USB-napravo, se zaslon spremeni v zaslon, prikazan na sliki 5. Prikazana bo samo možnost USB na levi strani. Možnost Network se ne bo prikazala, dokler ne zaključite postopka nastavitve Linux sistema, opisanega v uporabniškem priročniku, in vnesete svoje podatke za WiFi. Tudi takrat se možnost Mreža prikaže šele približno 30 sekund po prikazu USB možnosti. Četudi je bil vaš Uno Q že priključen na USB vrata računalnika in popolnoma zagnan, bo še vedno trajalo približno 10 sekund, preden ga bo programska oprema Arduino App Lab prepoznala in prikazala možnosti povezave, prikazane na sliki 5.
Upoštevajte, da obe možnosti prikazujeta »brian«, ime plošče, ki sem ga dodelil med začetno nastavitvijo.
Malo me je motilo, da programske opreme Arduino App Lab ni mogoče zagnati, dokler nimaš na voljo plošče Uno Q, ki jo je mogoče priključiti prek USB-ja ali omrežja. Preden sem naročil/prejel Uno Q sem upal, da bom lahko preizkusil programsko opremo App Lab. Zelo me je zanimalo tudi število primerov, ki so bili na voljo, saj se ta plošča zelo razlikuje od drugih MCU plošč, ki jih redno uporabljam. Upoštevajte, da čeprav program App Lab deluje na računalniku (v načinu USB in omrežnem načinu), podjetje navaja, da so primeri na voljo v datotečnem sistemu Linux plošče (tj. eMMC).
Ko prvič prejmete Uno Q, vas bo App Lab večkrat pozval, da posodobite firmware plošče. Prva posodobitev, s katero sem se srečal, je vključevala zamenjavo več datotek, ki so bile očitno posodobitve Zephyr RTOS za STM32U585. To je trajalo približno 2 minuti in ni zahtevalo nobenega truda s strani uporabnika, razen čakanja.
Kasneje pa me je med delovanjem Uno Q v načinu eno-ploščnega računalnika pozval, naj opravim posodobitev, za katero je bilo treba posodobiti celotno sliko sistema. To od uporabnika zahteva nekaj truda. Datoteko Flasher je treba naložiti na računalnik z operacijskim sistemom Windows, razpakirati in zagnati. Arduino ponuja dokaj dobro dokumentacijo o tem, vendar sem opazil napako. V skladu z njihovimi navodili morate zagnati »arduino-flasher-cli« iz ukazne vrstice, nato pa naj bi Windows zaprosil za dovoljenje za namestitev gonilnika. Pri meni se to ni zgodilo – edino, kar se je zgodilo, je bilo, da je ta pripomoček flasher prikazal meni za pomoč. Na koncu sem iz ukazne vrstice zagnal »arduino-flasher-cli flash latest«. Šele takrat me je prosil za namestitev gonilnika za Windows, kar sem tudi storil (glej sliko 6).
Čeprav je to navedeno v dokumentaciji Arduina, bom to poudaril tudi tukaj, saj sem sam zgrešil naslednji korak! Da bi izvedli ponovno nalaganje slike, morate namestiti mostiček med dva priključka 10-pinskega konektorja JCTL. Ti dva priključka sta najbližja čipu LPDDR4 RAM (in najbolj oddaljena od vrat USB-C). Ti dva priključka sta in GND. Če ta korak pozabite, bo postopek ponovnega nalaganja slike porabil precej časa za prenos 2,3 GB datoteke iz interneta, vendar bo nato spodletel, ko bo poskušal dejansko ponovno naložiti datoteko slike. Ko je mostiček nameščen, boste morali začeti od začetka in ponovno prenesti to veliko datoteko.
Po ponovnem ustvarjanju slike boste morali ponovno vnesti podatke za WiFi in ime plošče, ki ste jih vnesli prej, skupaj z vsemi drugimi nastavitvami, ki ste jih spremenili/dodali.
Tudi po ponovni namestitvi sistema me je Linux OS ob ponovnem zagonu ponovno pozval k dodatnim posodobitvam, ki so bile izvedene brez posredovanja uporabnika. Poleg tega se zdi, da je programska oprema Arduino App Lab na računalniku zaznala ponovno namestitev sistema in me pozvala k posodobitvi same programske opreme App Lab na računalniku. Skratka, veliko posodobitev!
Ko sem dobil Uno Q, sem se odločil, da ga najprej preizkusim v načinu eno-ploščnega računalnika (SBC). Za priklop miške, tipkovnice in HDMI monitorja morate uporabiti USB-C hub. Jaz uporabljam Anker 332 USB-C hub, kot je prikazano na sliki 7.
Ta vsebuje 2 USB-A vtičnici, USB-C vtičnico in HDMI vtičnico. Ima tudi USB-C PD vtičnico, ki je nujno potrebna, saj morate v to vtičnico priključiti USB-C napajalnik, da napajate hub, ploščo Uno Q, tipkovnico, miško itd. Uporabil sem rezervni 15-vatni USB-C napajalnik, ki je zagotovil dovolj moči.
Ko Uno Q prvič vklopite v tem SBC načinu, vas bo hitro pozval, da vnesete uporabniško ime in geslo. Privzetega uporabniškega imena „Arduino“ nisem mogel spremeniti, vendar sem lahko vnesel geslo po lastni izbiri. Kasneje v postopku nastavitve vas pozove, da vnesete podatke za prijavo v Linux račun. Ne vem, kakšna je razlika, vendar sem uporabil enake podatke kot prijavne podatke – „arduino“ in svoje geslo.
Pred ponovnim ustvarjanjem slike je Linux ob zagonu samodejno zagnal program App Lab. Na namizju je bila tudi ikona App Lab. Po ponovnem ustvarjanju slike je namizje izgledalo enako, vendar ikona App Lab ni bila več prisotna in App Lab se ob zagonu ni samodejno zagnal. Če želite ikono Arduino app lab ponovno prikazati na namizju, odprite aplikacijo Application Finder, poiščite »app lab« in jo povlecite na namizje. V meniju Settings je vnos za AutoStart/sessions. Tukaj lahko dodate/odstranite Arduino lab AutoStart, odvisno od vaših preferenc. Pri kasnejših posodobitvah to morda ne bo potrebno.
Tako kot tipka Power na Uno Q ne izklopi napajanja plošče, tudi ukaz Linux Shutdown samo ponovno zažene Linux. Ta ukaz Shutdown se nahaja v meniju, ki se prikaže, ko izberete ikono „arduino“ v zgornjem desnem kotu namizja Linux.
Med preizkušanjem operacijskega sistema Linux na Uno Q sem opazil nekaj stvari. Mislil sem, da bi bil najlažji način za prenos Arduino skic iz mojega računalnika z uporabo USB-ključa. Pred ponovno namestitvijo operacijskega sistema se USB-ključ ni prikazal v aplikaciji File Manager. Po ponovni namestitvi pa se je v File Managerju prikazal. Nisem se mogel povezati z domačim NAS, ki uporablja protokol SMB, z uporabo možnosti Go > Browse Network (Pojdi > Brskaj po omrežju) v upravitelju datotek. Ta možnost še ni implementirana.
Pisanje programa za STM32U585 MCU
Za razvoj programske kode za STM32U585 na Uno Q Arduino plošči ponuja dve razvojni okolji (brez upoštevanja njihovega IDE v oblaku). Lahko nadaljujete z uporabo Arduino IDE v2.x.x ali pa zaženete Arduino App Lab in razvijete svojo skico za STM32U585 s pomočjo tega programa.
Če vas ta plošča zanima, boste verjetno uporabljali tudi Linux SOC. V tem primeru je smiselno uporabiti Arduino App Lab tudi za razvoj Linux aplikacije (v Pythonu) in za integracijo skice in Python kode.
Vendar pa boste za kodo skice morda lažje uporabljali priljubljeno Arduino IDE v2.x.x. Tabela 2 prikazuje nekatere značilnosti in razlike med tema dvema razvojnima IDE-jema. V naslednjem delu članka sem uporabil Arduino IDE v2.3.6, da sem preveril številne I/O funkcije STM32U585.
V tej zgodnji fazi se mi je to zdelo bolj priročno. App Lab vzdržuje mapo za skice, ki ste jih napisali z uporabo App Lab. Ne prikaže nobenih skic, ki ste jih prej napisali z uporabo Arduino IDE v2.x.x. Po mojih dosedanjih izkušnjah morate za uvoz obstoječe skice v App Lab iz Arduino IDE v2.x.x:
Ustvariti novo aplikacijo z ikono »Create New App«. Ta se nahaja v skrajnem desnem zgornjem kotu okna App Lab (na mojem ultraširokem zaslonu ni tako opazna).
Izbrišite kratko skico „predloge“, ki je priložena.
Kopirajte/prilepite svojo skico iz Arduino IDE v2.x.x.
OPOMBA: ukaz Prilepi (z desnim klikom miške) tukaj ne deluje. Kombinacija tipk CTRL-V deluje.
Skica, napisana z Arduino IDE v2.x.x, bo sestavljena iz mape, v kateri bo samo datoteka .ino (razen če posebej ne vključite drugih datotek s kodo). V App Lab bo tudi najpreprostejša mapa projekta samodejno vsebovala več datotek: sketch.ino, sketch.yaml app.yaml, main.py, README.md, pa tudi vse potrebne knjižnice.
Preverjanje vhodno-izhodnih funkcij Uno Q
Osebno bi, če bi potreboval SBC na podlagi Linuxa, verjetno uporabil enega od Raspberry Pi SBC-jev, ki jih imam na voljo. Uno Q bi bil bolj uporaben za projekte, ki vključujejo veliko zbiranja/nadzora podatkov, kjer je pomemben čas. V tem primeru bi pričakoval, da bi bila vključitev hitrega STM32U585 Arm MCU v Uno Q najbolj uporabna. Zato je bila ena od stvari, ki sem jo najprej preučil, preverjanje, kako dobro delujejo periferni bloki mikrokontrolerja STM32U585 in njihove knjižnice gonilnikov. Najprej moram omeniti nekaj stvari:
Programska oprema, ki jo Arduino ponuja za STM32U585 in QRB2210 SOC, je v zgodnji različici in vsebuje nekaj napak/manjkajočih funkcij. Predvidevam, da bo to pravočasno odpravljeno.
Arduino je firmware Zephyr RTOS, ki teče na STM32U585, uporabil na nekaterih drugih ploščah z Arm mikrokontrolerji. Čeprav uporabljam Arduino IDE za številne različne mikrokontrolerje, trenutno uporabljam družino ESP32, plošče Teensy (NXP mikrokontroler) in plošče Nano Matter. Orodje Arduino za te plošče ne uporablja Zephyr RTOS. Zato nimam dovolj izkušenj z Zephyr, da bi lahko ocenil, kako učinkovito obdeluje I/O funkcije, kot so SPI, I2C, časovniki itd.
Standardni Arduino I/O konektorji (18-pin in 14-pin) so označeni s primarno funkcijo priključkov na strani obeh konektorjev. Ne vem, ali je to standard na drugih trenutnih Arduino ploščah, vendar je zelo koristno.
V naslednjem poglavju bom opisal svoje izkušnje s testiranjem različnih funkcij I/O na perifernih napravah STM32U585 Uno Q.
I2C – To je verjetno najpogosteje uporabljen protokol za periferno opremo in najlažji za testiranje. Privzeti I2C-priključek je priključen na standardni 18-pin priključek Arduino (JDIGITAL) na priključkih D20, D2. To sta ista priključka, ki se uporabljata za I2C-priključek na originalni plošči Uno. Pri dostopu do tega priključka v programski opremi bi uporabili ukaz Wire.begin() skupaj z drugimi funkcijami razreda Wire.
Obstaja še drugi I2C-priključek, ki je priključen na QWIIC vtičnico. V mikrokontrolerju STM32U585 so štirje I2C-priključki, priključek I2C4 pa se uporablja za QWIIC priključek. Za dostop do njega iz programske opreme uporabite ukaz Wire1.begin() in z njim povezane funkcije razreda.
Preizkusil sem oba vhoda in delovala sta pravilno. Oba I2C vhoda imata na plošči nameščena 2,2k pullup upora. Privzeto je hitrost I2C ure nastavljena s strani Zephyr firmware-a na 400 kHz. Preizkusil sem ukaz Wire.setClock(), za katerega vem, da je definiran v firmware Zephyr, saj v IDE prevzame barvo legitimnih ukazov in se identificira, ko z desnim klikom kliknete na sam ukaz. Vendar pa prenos vrednosti 1000000 (1 MHz) na ta ukaz ni deloval. V firmware Zephyr so definicije za različne hitrosti I2C, do 5 MHz. Opredelitev I2C_SPEED_FAST_PLUS naj bi nastavila hitrost I2C-ure na 1 MHz. Vendar uporaba Wire.setClock(I2C_SPEED_FAST_PLUS) ni privedla do 1 MHz-ure – pravzaprav menim, da jo je upočasnila na 100 kHz.
Na Arduino forumu sem opazil nekaj objav v zvezi z I2C, ki so jih napisali programerji, ki imajo veliko več izkušenj z Zephyr kot jaz. Tudi oni pa niso ugotovili, kako povečati hitrost I2C takta.
Če uporabljate I2C napravo, boste verjetno uporabljali knjižnico za to napravo, ki jo je napisal nekdo drug in je na voljo v Arduino IDE prek upravitelja knjižnic. Na splošno te knjižnice delujejo s privzetimi I2C vrati, za katere je napisana knjižnica Wire. Pri nekaterih mikrokontrolerjih lahko izberete, katere priključke želite uporabiti za privzeta I2C vrata. V tem primeru te definicije priključkov običajno vključite v ukaz Wire.begin(), tako da kot parametre v oklepajih prenesete priključke SCL in SDA.
Vendar pa morate pri Uno Q, če želite uporabljati QWIIC vrata, uporabiti funkcije Wire1. Odvisno od knjižnice lahko spremenite, katera I2C vrata knjižnica uporablja. Na primer, preizkusil sem senzor SGP40 (CO2) s konektorjem QWICC in spremenil naslednje v razdelku setup(), da je knjižnica Adafruit SGP40 delovala:
Replace sgp(begin(); with sgp.begin(&Wire1);
Simbol „&“ je kazalec naslova za rutine Wire1. Nisem prepričan, vendar menim, da sem Wire1 brez tega simbola „&“ uporabil z drugimi knjižnicami, ko sem knjižnico preusmeril na neprivzeto fizično vrata.
SPI- Privzeti SPI-vmesnik je na voljo na 18-pin konektorju JDIGITAL na naslednjih priključkih:
SS- D10
MOSI- D11
MISO- D12
SCK- D13
V uporabniškem priročniku Uno Q je naveden primer skice, ki prikazuje, kako uporabljati SPI vrata. Pri izvajanju tega primera sem na svojem osciloskopu pravilno videl signale SCK in SS. Vendar pa je bil MOSI priključek neaktiven. V firmware Zephyr je priključek D11 opredeljen kot PWM priključek, kar je ena od njegovih alternativnih funkcij. To pa onemogoča njegovo uporabo kot SPI MOSI funkcijo. Arduino je prejel zahtevek za popravek (#242), ki je bil po navedbah Arduina že izveden. Do objave tega članka ta težava ne bi smela več obstajati. Če pa SPI vmesnik pri vas ne deluje, lahko to težavo odpravite tako, da v delu setup() dodate naslednjo vrstico:
GPIOB->AFR[1] = (GPIOB->AFR[1] & 0x0FFFFFFF)
| 0x50000000;
Poleg te napake v firmware-u Zephyr je napaka tudi v SPI primeru v uporabniškem priročniku Uno Q. Da bi SPI vrata delovala, morate v delu loop() tega primera uporabiti naslednjo spremenjeno kodo:
SPI.beginTransaction(SPISettings(20000000,MSBFIRST,SPI_MODE0));
SPI.transfer(address);
// Send the value
SPI.transfer(value);
SPI.endTransaction();
Upoštevajte, da so parametri, posredovani v ukazu beginTransaction, neobvezni. V zgornji kodi sem nastavil frekvenco SPI na 20 MHz in definiral način SPI. Ugotovil sem, da nisem mogel doseči višje frekvence od 20 MHz, čeprav podatkovni list STM32U585 kaže, da je MCU sposoben doseči 80 MHz (pri napajanju s 3V3). Z zgornjo kodo sem izmeril časovni interval med dvema zaporednima 8-bitnima prenosoma SPI na 8,6 µs, kar bi postavilo zgornjo mejo za 8-bitne prenose SPI na približno 117 kHz. Tudi brez tega merjenja sem opazil, da je bila hitrost osveževanja na majhnem TFT zaslonu, ki sem ga priključil, veliko počasnejša, kot sem bil navajen pri drugih mikrokontrolerjih. Da bom pošten, ko sem opravil ta test, so SPI vrata uporabljala le taktno frekvenco 5,6 MHz, kar je trenutno očitno privzeta vrednost.
Uno Q vsebuje 6-pin priključek, ki se nahaja na mestu, kjer je bil na originalni Uno plošči priključek za ISP programiranje. Na originalni Uno plošči je bilo ta vmesnik mogoče uporabiti tudi kot SPI vmesnik (čeprav je delil isti vmesnik SPI, ki je uporabljal SPI priključke na 18-pin konektorju). Pri Uno Q 6-pin SPI priključek uporablja drugačne I/O priključke kot SPI priključek na 18-pin konektorju. Vendar pa oboje vrat uporabljata priključke, ki jih je mogoče priključiti (prek notranjega multiplekserja STM32U585) samo na vrata spi2 strojne opreme MCU. Če želite uporabiti ta 6-pin konektor za SPI (z uporabo privzete knjižnice SPI), morate izdati nekaj ukazov, da spremenite multipleksiranje priključkov za spi2, ki ga želite uporabiti:
MISO – PC2
MOSI- PC3
SCK-PD1
Upoštevajte, da so to dejanske oznake STM32U585 priključkov, ne pa oznake digitalnih Arduino priključkov. V vsakem primeru je, tako kot pri originalni Uno plošči, v Zephyr RTOS je opredeljen le en fizični SPI vmesnik, ki si ga delita 6-pin konektor in JDIGITAL SPI vmesnik.
ADC – Mikrokontroler STM32U585 vsebuje 14-bitni ADC in 12-bitni ADC. Vendar pa firmware Zephyr RTOS omogoča uporabo le 14-bitnega ADC, skupaj z multipleksiranjem za 6 kanalov. Ti so na voljo na A0-A5 priključkih 14-pin JANALOG konektorja. Napetostno referenco, ki se uporablja za 2 ADC, je možno nastaviti med 1V5, 1V8, 2V048, 2V5 in EXTERNAL.
Ločljivost ADC je mogoče določiti med 8 in 14 biti z uporabo ukaza analogReadResolution(). Medtem ko lahko 14-bitni ADC deluje s hitrostjo do 2,5 Msps, sem pri uporabi standardnega ukaza analogRead() izmeril hitrost vzorčenja le 29 Ksps. To se ni pospešilo, ko sem ločljivost zmanjšal s 14 bitov na 8 bitov. Domnevam, da je za to precej nizko hitrost vzorčenja kriv RTOS firmware Zephyr.
DAC – STM32U585 vsebuje dva 12-bitna DAC-a, ki sta oba priključena na 14-pin JANALOG konektor. Ta DAC-a privzeto generirata signale v območju 0-3V3. DAC-a delujeta s pomočjo funkcije analogWrite(DACx), ločljivost DAC-a pa se lahko spremeni med 8 in 12 biti s pomočjo funkcije analogWriteResolution(). Z uporabo ukaza analogWrite() in sinusnim valom, generiranim s tabelo z 256 vnosi, sem dosegel največjo frekvenco 2,83 kHz. To se mi zdi nizko in lahko le ugibam, da je to posledica Zephyr RTOS.
PWM – STM32U585 vsebuje 17 časovnikov, od katerih nekateri lahko izvajajo PWM funkcije. Čeprav JDIGITAL konektor vsebuje 14 priključkov, ki jih je mogoče izmenično nastaviti kot TIMERx kanale, je v trenutnem Zephyr RTOS mogoče le 6 od teh priključkov uporabiti kot PWM kanale (D3, D5, D6, D9, D10 in D11). Privzeta ločljivost je 8 bitov, vendar jo je mogoče povečati na 10 bitov z ukazom analogWriteresolution(). Frekvenca je fiksna na 500 Hz.
Glede na podatkovni list STM32U585 so na voljo različni tipi časovnikov in prepričan sem, da so možnosti izbire ločljivosti in frekvence PWM veliko bolj obsežne kot tiste, ki so trenutno na voljo v sistemu Zephyr RTOS.
GPIO – Ukazi pinMode, digitalRead in digitalWrite delujejo enako kot v skicah Arduino IDE v2.x.x.
Vsakič, ko v Arduinovem upravitelju plošč naložite paket podpore za ploščo, bo vključeval nekaj primerov skic. Za Uno Q boste te primere našli v razdelku »Primeri za Uno Q«. Medtem ko je primer »LED Matrix Basic« deloval brez težav z LED matriko Uno Q, sem ugotovil, da večina drugih primerov, ki sem jih preizkusil, ni delovala – običajno je prevajalnik prikazal sporočilo, da koda ni veljavna za Uno Q/Zephyr.
Opazil sem, da se to dogaja tudi z drugimi ploščami. Sprašujem se, zakaj Arduino vključuje razdelek s primeri, namenjenim določeni plošči/MCU, če ti primeri v mnogih primerih ne delujejo.
Zaključki
Ker je bil Uno Q zame popolnoma nov, sem se v 1. delu tega članka odločil, da bom igral na varno in se osredotočil na STM32U585 mikrokontroler in njegove periferne naprave. Iz podatkovnega lista STM32U585 je razvidno, da gre za zelo zmogljiv procesor, ki vsebuje veliko sofisticiranih perifernih funkcionalnih blokov.
Pričakujem, da bo Arduino (in uporabniška skupnost) sčasoma dodal podporo za firmware Zephyr RTOS, da bo mogoče bolje izkoristiti številne od teh funkcionalnih blokov.
V drugem delu bom podrobneje obravnaval App Lab in Linux SOC. Zanima me, kako hitro deluje Remote Procedure Call (RPC) – tj. mehanizem Bridge, ki povezuje dva procesorja.
Na koncu bi rad poudaril, da je bil Uno Q šele predstavljen, zato bo programska oprema, ki je na voljo zanj, še popravljena in izboljšana. Nekatere težave, na katere sem naletel v tem članku, se bodo morda spremenile do objave članka.
https://svet-el.si