Tag Archives: ARM

ARM:0015 STM32CubeMX ekraniukų bibliotekos 2 dalis

Pratesimas- grafinių ekraniukų bibliotekos gcc C kalbos puristams. Kiek paoptimizuotos, pataisytos kelios ardruinistų ir adafruitistų klaidos. Ir aišku pridėta savų klaidų. Vienas ekraniukas I2C, visi kiti SPI. Ekraniukai naudoja tuos pačius SPI, D/C ir RESET signalus, ekraniukai pasirenka su CS signalu. Tai svabu, nes pats naujausias ekraniukas (240 x 240) neturi CS kojos išvestos į jungtį. Jungiant prie dedikuoto SPI tai nėra problema. Deja šiame projekte teko palituoti.

SPI and I2C graphic LCD OLED modules with STM32 stm32cubemx gcc
Ekraniukai (iš kairės į dešinę): ILI9341 (320 x 240), ST7789W (240 x 240), seniausias ST7735R (160 x 128, galimos kitos konfiguracijos), SSD1306 (128 x 64), SSD1306 (128 x 32, I2C).

Mažiesiems ekranams neparašytos grafinės bibliotekos, kaip matosi iš nuotraukos, naudojamas (vogtas) šriftas turi klaidas. Manau, vėliau pabaigsiu Windows softą šriftų redagavimui ir ekskportui, nes užkniso tie šriftai.
Bibliotekos kiek kitų versijų nei pirmame straipsnelyje, nes teko kiek unifikuoti ir optimizuoti. Pvz- jei reikia perduoti kelis baitus iš eilės, tai ir siunčiam kelis baitus, o ne kelis kartus siunčiam po baitą. Arba va:


//buvo:
for (pixels = 0; pixels < x1 - x0 ; pixels++) { ili9341_send_word(color); }
//tapo:
for(x0=x0;x0<x1;x0++){ILI9341_send_word(color);}

Pirma eilute originali, antra mano. Sutaupom kintamąjį ir bereikalingą skaičiavimą.

Dar vienas:


//buvo:
for(i=0;i < (w * h);i++)
{
c1 = *buffer++;
c2 = *buffer++;
ili9341_send_byte(c1);
ili9341_send_byte(c2);
}

//tapo:
ILI9341_write_buffer(buffer, w*h*2);

Kiek teko pamakaluoti kodą, nes kažkodėl ne visur suveikė “static”, o bibliotekos taigi kartojasi. Gi niekas negamina tokio kvailo projekto su tiek skirtingų ekraniukų.

Visas source kodas ir sukompiliuoti binarai:
LCD OLED screens SPI and I2C libraries for STM32CubeMX with demo program.
Konfiguracijos pagrinde vienoje vietoje ir darosi su #define. OLED ekraniukai naudoja harwarinį skrolinimą, galima diminti, kad pamažinti burn-out.

ARM:0014 STM32CubeMX jutiklių ir ekraniukų bibliotekos

Bet kokios naujos programos kurimas kontroleriukui tai iš esmės senesnių failų dėlionė iš bibliotekos. Todėl kiek labiau panaudojus STM32 serijos kontrolerius teko persirašyti kelias savo naudojamas bibliotekas iš AVR į STM32Cube versijas. Buvo sukurtas USB-COM projektas ir prie jo prikabinta visa serija bibiliotekų. Jos tikrai veikia ir kiek “normalizuotos”- senosios buvo istoriškai chaotiškos. Konversija praėjo keistokai lengvai. Vienas tik reikalas kuris suėdė kiek nervų- pačio STM32F čipuko jautrumas I2C šynos terminatoriams.

STM32F103 blue pill with OLED, I2c LM75 BM180 MAX44007 PCF8574
Visi jutikliai ir moduliukai iš Kinijos. Tik FM75 nuluptas nuo televizoriaus, o MAX44007 dovanotas žmogaus.
Veikiantys moduliai:

  • LM75 temperatūros jutiklis, I2C (FM75 tai rimtesnis, bet suderinamas su LM75)
  • MAX44007, I2C, apšvietimo jutiklis.
  • PCF8574, I2C, 8bit I/O extenderis.
  • Tekstinis LCD ekraniukas ant PCF8574 extenderio. Kartu gaunasi ir 5V atskirimas nuo 3V.
  • SSD1306 kontrolerio OLED ekraniukas ant I2C šynos.
  • Analoginiai signalai- nu čia ne moduliukas, bet pačio STM dalis.
  • RTC (laikrodis)- čia irgi ne moduliukas, o STM dalis.
  • BMP180 atmosferos slėgio jutiklis su temperatūros jutimu.

Pastabos: OLED ekraniukas naudoja Commodore 64 šriftą. Jį galima pakeisti kitu. Tekstinis ekraniukas- tai klasikinis LCD ekraniukas su ar be pašvietimo, paprastai jungiamas prie 7 ar daugiau GPIO pinų. Tie ekranai paprastai būna 5v technologijos ir su 3V technologija dažnai nerodo vaizdo. I2C I/O ekstenderis leidžia suderinti su 5V maitinimu- patį LCD ir IO modulį maitinam nuo 5V (tiesiai iš USB), o procesoriukas nuo 3V.
Visas kodas pilnai suderinamas su STM32CubeMX ir HAL. Kompiliuojasi su gcc be jokių warningų.

Nusikrauti source code, kubiko projektą ir sukompiliuotus failus:
STM32CubeMX project, I2C LM75 PCF8574 MAX44007 BMP180 text lcd screen

Per virtualų COM portą matosi visi jutiklių rodymai. Dalis informacijos išmetama per ekraniukus.

ARM:0013 STM32CubeMX – USB HID klavietura

O dabar pasinersim į USB klavietūros gamybą. Pasinaudosim STM32CubeMX konservais, HID mouse pavyzdžiu, bet perdarysim savaip, kad gautusi klavietūra. Viską darom kaip USB-Peles pavyzdyje. Visiskai viską. Tačiau pakeisime įrenginio aprašymą (descriptor). Labai negudrausim, bet iš www.usb.org nusikrausim HID descriptorių generatorių ir jame pasirinksime klavietūra. Tai universalus ir perteklinis descriptorius, bet kol kas, paprastumo labui, naudosim taip kaip yra.

USB HID descriptor generator
Programos sugeneruotą descriptorių eksportuojam į “h” tipo failą: keybrd.h (jis bus įdėtas į source code archyvą).
Continue reading →

ARM:0012 STM32CubeMX – USB HID pele

Sekantis projektas iš konservų dėžutės vardu STM32CubeMX- pelė. Tai bus USB HID (human interface device) pelė. Pradedam nuo pelės, nes ji sugeneruojama automatiškai ir nereikia vargti su įrenginio aprašymų košmaru (device descriptor). Viską darom kai su virtualiu COM portu, tik pasirenkam kitą įrenginį:

STM32CubeMx HID mouse
HID klasė, daugiau pas kubika nieko nepakeisi (o gaila, nes norėturi didesnės klasių bibliotekos. O ir čia niekur neparašyta, kad čia ne paprastas HID, kas gali būti bet kas, o paprasčiausia pelė).
Continue reading →

ARM:0011 STM32CubeMX – pertraukimas per kojas

“Pertraukimai per kojas” :).

Iš vienos nesamonės liko tokia mažytė klavietūra su keturiais laidais. Maniau kad USB, deja ne- PS/2 standarto. Kaip tik proga parašyti ką nors apie programavimą. Todėl pirma, tarpinė užduotis: pajungti PS/2 klavietūra prie virtualaus COM porto (USB).

Amstrad mailboard
Kadangi jau męs mokam STM32CubeMX pradmenis iš senesnių postų: Pradinis ir USB COM portas, bus mažiau rašymo.
Taigis pradedam…
Continue reading →

ARM:0010 STM32CubeMX- USB 2 COM dongle

Taigis. Karantinas ir po gana daug dienų degradacijos nutariau dar kiek pasinagrinėti tą MX kubą ir pagaminti USB į serial adapterį. Taip jau gavosi, kad prigriebiau kažkada tokių PCB su STM32F102 procesoriuku. Kas tai buvo originaliai aš nežinau. Tačiau čia yra “košerinis” USB ir RS485/422 išvadas. Todėl eksperimentams kaip tik:

STM32F102 as USB to UART/COM dongle
Prigriebiau tik tiek. O buvo dešimtim. Tokiom nesulaužytom plokštėm. Per vidurį išvesti programavimo ir kitokie signalai. Ant popieriaus parašytas pinoutas. Todėl ten pajungiam STLink programatorių. O su raudonu ir žaliu laideliu uždarom serial porto kilpą. Ten diferencialinis signalas, todėl du laidai- pliusinis ir minusinis.

Taigis pradedam…
Continue reading →

ARM:0009 STM32CubeMX ir kaip jis valgosi

Yra tokia kiniška plokštelė Bluepill, su STM32F103C8 procesoriuku. Ji kogero pigiausia iš visų. Procesorius ten gana galingas ir šiuolaikinis, todėl kad pamirksėti LEDu, tenka pripumpuoti kalną softo. Mikroschemos gamintojas pats irgi suprato, kad su mikroschemos (ir kitų serijų taip pat) konfiguravimu galima susipainioti galutinai. Todėl sukūrė savo “duino”- STM32CubeMX. Pirmosios programos versijos buvo bugavotos ir labai žalios. Bet laikas bėga ir programa jau daug maž veikianti ir suprantama paprastam vartotojui. Netgi man. Kad veiktu pilnai, mums reikia, kad kompiuteryje veiktu gcc skirtas arm procesoriams. Tai irgi žiaura bėda. Mano didžiajam kompiuteryje (stacionariam) tų gcc gyvas velnias ir vieną dieną jie taip susipainiojo, kad kažkodėl ARM gcc nebeveikia. Gerai, kad yra atsarginis kompiuteris ir ten viskas veikia.

Kaip sakoma, geriau vieną kartą pamatyti, todėl žiūrom:
SM32CubeMX blue pill stm32f103c8
Pasileidžiam programą ir pasirenkam procesoriuką (STM32F103C8). Du kartus baGstelim ant dešinėje esančio procesoriaus kodo. Galima netgi pasirinkti pagal turimą devboardą, bet man atrodo, kad bluepill ten nėra.
Continue reading →

ARM:0007 versija B, I2C ir OLED

Pratesiant ARM seriją su pačia pigiausia plokštele iš kinijos. Plokštelėje tik STM32F103C8 ir keli papildomi elementai. Sekantis reikalas kurį reikia įvaldyti tai I2C. Kol kas tik rašymas ir tik po kelis baitus ir be jokių DMA ir IRQ. Visiškai taip pat, kaip ir su AVR. Tačiau šį kartą naudojam patį pigiausią ekraniuką iš kinijos su SSD1306 kontroleriu, aštriai mėlynos spalvos:

STM32 OLED 0.91 inch
Dalis softo mano, dalis vogto ir supaprastinto. Vienintelis pastebėjimas dėl hardwarės- gal dėl sujungimo (per laidelius), o gal dėl kiniškos kilmės, pastebėta, kad kelis kartus ekraniukas nepasileido.

Ir aišku visas source code, bei sukompiliuotas hex hardvarės testavimui. Kompiliavosi ir su 6 ir su 7 gcc.
SSD1306 OLED on ARM STM32F103C.

ARM:0006 versija B, SPI ir waveshare e-Paper

Čia miksas tarp kiniško e-Paper straipsnio, ARM su pamažintu procesoriuku ir ST-Link programeriu. Ir aišku biški nostalgijos apie 8 bitus ir mano pirmus bandymus programuoti C. Gavosi toks kaip ir mini straipsniukas.

Kai tik buvo laisvo laiko nuo statybų, pasinagrinėjau apie STM32 procesoriuko kinišką moduliuką už kelis eurus. Čia jau gal net 64kb atminties, ir jau be vargo galima ką nors vizuališkesnio suprogramuoti nei su aštunta atmega. Užduotis buvo SPI ir ekraniukas. O kad nebūtu labai tuščias ekraniukas, sudėjau seno 8 bitų žaidimo “game engine” dalį. Daugiau programuoti aš jau patingėjau, bet vistiek bent jau matosi kas gaunasi jei nenaudojamas pilnas ekrano atnaujinimas.

STM32 ir waveshare e-paper
Hardwarė be modifikacijų- tiesiai iš kino. Šiaip, vienas pastebėjimas- arba kažkokia klaida softe (bibliotekose), bet sukonfiguravus MCU dirbti ant 48MHz, softas rodo 72MHz. Dabar softas rodo 96MHz, bet ant tokio greičio šis MCU negali dirbti. Gal čia koks kiniškas fuflo MCU?
Continue reading →

Biški vėl apie ARM ir STM32

Kažkaip nusipirkau pas kinus porelę ST-Link adapterių ir panorėjau juos išbandyti. Deja pirmiausia po ranka nebuvo mano pagrindinio kompiuterio, o tik nešiojamas vasarinis. Jame nieko nebuvo susijusio su ARM programavimu. Tai nutariau atburti kaip tai daroma ir tik tada paaiškėjo, kad niekur neužrašiau, kaip visdėlto nuo nulio paruošti kompiuterį (windows) darbui su STM32 čipukų programinimui.
Dar priedo, mano darbinis kompas jau turėjo dalinai suinstaliuotus softus, ir perėjimas iš Atmelio į ST buvo labai kažkaip paprastas.
Gaila, bet nieko vėl neužsirašiau, bet parašysiu maždaug iš akies, kaip tai buvo. Kaip ir minėjau anskčiau, aš kaip heiteris ir oldskūlinis hardcoras nemėgstu visokių IDE ir eklipsniu, tik command line, tik hardcore, tik make. Todėl viskas gavosi keistai.

ST-Link STM32F103

Darom taip- iš ARM pagrindinio puslapio nusikraunam gcc windozei. Ten kažkur yra installas. Vadinasi maždaug “GNU Tools ARM Embedded” ir versija kažkokia pagal datą. Nusikrovus šitą reikalą, nuėjau į savo puslapius (nugi šituos) ir nusikroviau pirmą source. Kažkodėl suveikė komanda “make”, bet neteisingai. Pasirodo, šitam kompe yra kažkas kuris vadinasi make, tik labai senoviškas. Tai buvo WinAVR paketas kurį kažkada suinstaliavau. Gal net instaliavau tam, kad kompe būtu “programmers notepad 2”. Bandžiau gadinti makefile, kad priversti veikti, bet nieko nesigavo, net paprasčiausia komanda “rm” veikė su klaidom ir net netrynė failų.
Netgi pradėjau krauti paskirai failiukus “make”, “rm” iš internetų ir GNUwin, bet ten viskas senai nenaudojama. Kol netyčia kažkur radau make sukompiliuota kažkokių geriečių. Nes kartais užknisa tas linuxinis bajeris- reikia kokios utelės, tai tipo susikompiliuok pats. O kad tą padaryti reikia prisiinstaliuoti visą kalną kitokio softo. Sunku jiems ir binarius padėti? Arba sukompiliuoja 30kb programą, kurį reikalauja kokio nors suknisto dll. Bet jo neprideda. O statinė tos pačios programos versija gal 100kb ilgesnė.

Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.

C:\Users\User>make -v
GNU Make 4.2
This program is built by Equation Solution.
Copyright (C) 1988-2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http ://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

C:\Users\User>

O poto prisiminiau, kad yra toks reikalas kaip CygWin. Po jo instaliavimo ir path prioritetų nustatymo (kad windows žinotu kur guli cygwin visokie failiukai) sistema pradėjo veikti.

Nueini į archyvo folderį, kur yra failas “makefile” ir ten rašai “make all”, o jei reikia viską perkompiliuoti iš naujo, tai “make clean” ir viskas.

Dėl hardwarinio programino, prie kiniško ST-Link puikiausiai tiko originalus ST softas kuris atpažino kiniškus donglus ir net pasiūlė atnaujinti firmware.

Pačios kiniškos plokštelės LED diodo (kabančio ant C13 kojos) pamirksėjimo softas čia:
STM32F103C8T6 blinky source ir sukompiliuotas failas.
O patiems nekantriausiams kurie nori patikrinti kiniška PCB dedu ir hex failą atskirai.
HEX failas testavimui.

Beja kiniškas plokšteles reikia vizualiai apžiūrėti ir ištaisyti defektus. Vienoje plokštelėje reikėjo per naudo prilituoti kvarcą, kitoje padėti teisingą rezistorių.

Kaip ne keista, va ant linuxu to pačio padaryti nepavyko. Nu neveikia man make. Jaučiu problemos su failų lokacijos nurodymu makefile faile. Beja, visokie IDE kuria baisias failu nuorodas. Nors pavyzdžiui viename eclipse tutorial saite pilna nesmonių kaip šita:
failo nuoroda.

Nu ir kas per nesamonė su tais ../..//././.././/././. !? Suprantu, kad galima vieną sluoksnį ar du palipti į viršų, bet tiek privaryti? Šitos nesamonės tikriausiai sugeneruotos pačios eklipsės, kai vartotojas išmėto projekto failus visur. Bet kai reikia tai atsiburti… ojojoj.

Poto gaunasi maždaug taip ir taip. 🙂. Paskutinė klaida tikriausiai dėl to, kad yra komandinės eilutės ilgio ribojimas.