Tag Archives: ARM

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.

ARM:0002 versija B, TXT LCD

Kol kas visiškai neapsisprendžiau kokia “baze” remtis programuojant STM32 mikroschemą. Dabar tik eksperimentuoju ir paprasčiausiai pakartojau senesnį ARM projektą su tekstiniu LCD ekranėliu. Kol kas nebraidžiojau optimizacijos pinklėse ir naudojausi kažkieno sukurtais primityvais, kurie gana griozdiški viduje. Tačiau šaip – ne taip pavyko paleisti.

STM32 LCD tXT
(dešinėje skaičiukas kur neaiškus tai fotikas pagavo momentą kai keičiasi reikšmė)

Kokios iškilo bėdos? Pagrindinė bėda buvo suvokti kaip galima duomenų pinus operatyviai perprogramuoti iš OUTPUT į INPUT. Pas mano naudojamas bibliotekas ten naudojamos griozdiškos struktūros. Ir aišku tingėjau skaityti instrukcijas.
Pradinė užduotis buvo, kad LCD gali būti prijungtas prie bet kurios kojos, bet poto teko supaprastinti, kad visdėlto jungiasi prie to pačio banko. Čia išlindo pirmas skirtumas tarp atmelio SAM7 ir STM32. Pas atmelį PIO kojos bent jau 32, priklauso vienam bankui. Gana logiška- CPU tai 32 bitų ir vienu smūgiu galima pakeisti 32 kojas. Pas STM32 kojos suskirstytos po 16 kiekvienam bankui. Kas baisiau, rodos viduje ten dar suskirstyta po 8 bitus ir išmaukyti tie bitai kažkokia tvarka. Aišku, gal galima skirtingus bankus valdyti skirtingais laikrodukais, o gal taupyti elektrą ir gal juos išjunginėti? Tačiau dingsta paprastumas… Kodėl taip padaryta aš nežinau. Bet man nepatiko.

A! dar kažkaip užmiršau, kad mano LCD tai 5V technologija, o STM32 tai 3V. Tai vieną vakarą prasikankinau be reikalo. Kažkaip galvojau, kad mano testinis ekranėlis veikia su 3V maitinimu.

ARM STM32F103 TXT LCD source code.

ARM:0001 versija B arba STM32

Kažkada gavau Atmelio ARM šroto. O dabar gavau ST produkcijos beveik šroto. Tiksliau pamačiau, kai metė į šiukšlyną “paletėlę”* su STM32 čipais. Dalis čipų nukrito neatgaunamai, o keliasdešimt buvo sugauta ir parkeliavo namo. Tai buvo STM32F103RET6 – 512kB flash ROM, 64kB RAM ir 64 plonos kojos (gana daug kojų palinko gelbėjimo operacijos metu) … LEDų mirkčiojimui pats tas čipukas. 🙂

STM32F103RE
Gryni čipai neveikia, todėl sukurpiau savo PCB. Ji gavosi kraupiai raudona. Dar pakeliui nupirkau kinišką dev boarduką su mažesniu čipuku. Bet PCB iš kinijos atėjo greičiau. Į tą UNIBUS dalį nereikia kreipti dėmesio, čia eksperimentai- ten nebesiekia Eagle free softas ir ta dalis PCB kaip ir nesinaudojasi. Ten “menas” gerberiuose.
Aišku padariau kaip minimum dvi klaidas. Abi gana lengvai pataisomos- užmiršau RESET liniją patempti į pliusą. Ir panašus patempimas reikalingas prie USB jei jį naudoti. Ten reikėtu statyti gal net tranzu valdomą pull-up.

Apie softą kita šneka. Kažkaip seniokiškai piktybiškai nenorėjau jokio IDE. Man užteko tų “user friendly” nesamonių. Tik oldskūlas, tik hardkoras. Žodžiu dabar kompiliuojasi iš to pačio notepado- ir AVR ir STM ir atmelio ARMas. Ir iš ten pat ir programuojasi.

Kad ir ką nešnekėtu vartotojai- nėra labai patogaus softo. Kažkaip eina tendencija, kad jei reikia pamirksėti LEDą, tai reikia į čipuką supusti visa operacinę sistemą ir krūvas pričindalų… Aišku periferiją reikia suprogramuoti ir kuo toliau, ji sudėtingesnė. Bet dėti šimtus eilučių chaotiško kodo? ST išleido gerą įdėją- grafinį periferijos konfiguratorių STM Cube, ten aš jo sugeneruoto kodo nesugebėjau netik suprasti, bet ir sukompiliuoti su gcc. Poto skaičiau nemūsiškus forumus ir atsiliepimai buvo ne kokie… Matyt tokie oldfagai rašė.

Todėl teko pažaisti kokius trys vakarus ir pavyko visdėlto paleisti MCU kojas taip, kad jos duotu kažkokius signalus.
Deja, nepavyko svetimų bibliotekų privesti tiek, kad nerodytu nei vieno warning. Man nepatinka warningai…


gcc version 5.4.1 20160919 (release) [ARM/embedded-5-branch revision 240496] (GNU Tools for ARM Embedded Processors)
Building file: stm32f10x_vector.o
Invoking: MCU C Compiler
arm-none-eabi-gcc -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc -MF objs/stm32f10x_vector.d -MT objs/stm32f10x_vector.d -c ../src/includes/stm32f10x_vector.c -o objs/stm32f10x_vector.o
../src/includes/stm32f10x_vector.c:114:4: warning: taking address of expression of type 'void'
&_estack, // The initial stack pointer
^
Finished building: stm32f10x_vector.o

Building target: blinky_stm32f103.elf
Invoking: MCU Linker
arm-none-eabi-gcc -Wl,--gc-sections,-Map=blinky_stm32f103.map -Os -Wall -fno-strict-aliasing -fmessage-length=0 -fno-builtin -mthumb -mcpu=cortex-m3 -MMD -MP -ffunction-sections -fdata-sections -L ../ -T ../loaders/stm32.ld -I ../src -I ../src/includes -I ../libSTM32F103 -I ../libSTM32F103/inc objs/main.o objs/stm32f10x_it.o objs/stm32f10x_vector.o ../libSTM32F103/Release/libstm32f103.a -oblinky_stm32f103.elf
Finished building target: blinky_stm32f103.elf

Visas source kodas čia, su visom bibliotekom.

*) jei kas nesuprato, “paletelė” tai toks plastikinis laikiklis mikroschemom. Kaip šitas iš to pačio šaltinio:
STM32F205ZGT6
Tik čia daugiau kojų turinti mikroschema STM32F205ZGT6 (1M flash, 132kb RAM ir 144 kojos…) biški per daug.

ARM:0002 arba Hello World aka mirksiukas

Pirmas darbas programuojant bet kokia programavimo kalba kompiuteryje yra parašyti “Hello World” programą. Visokiuose mikrokontroleriuose tai mirksiukas. T.y. kažkokia koja turi mirksėti kažkokiu priimtinu ir detektuojamu dažniu. Nu koja nemirksi, bet koks nors šviesos diodas tai tikrai. Labiau “advanced mirksiukas” tai mirksiukas kuris reaguoja į kokį nors išorinį vaiksmą. Šiuo atveju į kitos kojos būklę.

SAM7 mikrokontroleris turi gana daug kojų. Kai kurios turi ne vieną paskirtį. Tačiau męs čia giliai nekapstysim- PA1 koją panaudosim kaip išėjimą, o PA2 kaip įėjimą. Mano PCB visos kojos išestos į standartinio (0.1″) žingsnio skylutes. Pačios skylutės kiek didesnio diametro, tai ten puikiausiai laikosi oscilografo čiupiklis.
Kol kas nesinagrinėjau aš to MCU hardwarės, tai nieko protingo nepadariau- tik užprogramavau vieną koją išėjimui. Kitos tikriausiai pagal nutylėjima pasidaro kaip įėjimai. Kaip ten organizuojami pull-up aš nežinau, bet po standartinės inicializacijos viskas veikia.

Kuo šitas skiriasi nuo paprastos ATMEGOS iš softo pusės? Dar nežinau daug, bet pirmas bugas kuris man pasirodė nesuprantamas, tai kad reikia paprogrames daryti STATIC. Jei neparašai, viskas susikompiliuojasi, bet kažkaip neveikia. Čia jau aš dar nesupratau. Dar klaustukas dėl VOLATILE kintamųjų. Bet kadangi viskas nudrožta nuo oficialaus Atmelio pavyzduko, tai matyt taip turi būti.

ARM mirksiukas
Softas veikia taip- amžinam cikle sėdi kitas ciklas kuris skaičiuoja pauzės dydį. Nuo minimalios iki kiek didesnės. Nuo PIN2 reikšmės priklauso pauzė vienokia ar didesnė 10 kartų.
T.y. kai nenuspaustas (kaip foto) pauzė keičiasi nuo 0 iki 9*5 tuščių ciklų. Pauzė ir mygtuko tikrinimas daromas prieš kiekvieną signalo pokytį.

Per nuotraukoje apibrėžtas 800ns įvyksta: signalo pakeitimas iš 0 iki 1, mygtuko reikšmės nuskaitymas per paprogramę, pauzės skaičiavimas =0*5*1, pačios pauzės paprogramės iškvietimas ir nepavykęs for ciklas, važiavimas atgal iš paprogramės ir signalo pakeitimas iš 1 į 0.

Taktinis procesoriuko dažnis kažkoks defaultinis skirtas USB. Kažkur apie 48MHz. Bent jau toks turi būti. Čia jau labiau patyrę turi pakomentuoti ar gerai man gavosi.

Ir aišku: Source code ir hex.

Mygtukai analoginiam įėjime

Viskas prasidėjo nuo to, kad asmuo kodiniu vardu “Miltukų Meistras” sudaužė vieną Kinietišką prietaisiuką, o aš ji norėjau dar panagrinėti… Čia aišku nepalyginamas dalykas su žmogaus kodiniu vardu “Taupytis” poelgiu, kai norėdamas pažiūrėti kokios spalvos stiklas, jis atsipjovė su kampiniu šlifuokliu plazminio teliko ekrano gabalą… Dar veikiančio teliko…

O dabar esmė- daugelyje prietaisu yra grupės mygtukų. Dažnai mygtukai būna ir megėjiškuose prietaisuose su mikrokontroleriais (MCU). Tam tikslui naudojamos vertingos mikroprocesoriuko kojos. Jei grupė mygtukų, jie jungiami į matricą ir naudojamas dinaminis klavietūros skanavimas. Tuo tarpu, kieme jau 21 amžius ir daugelis MCU turi analoginius įėjimus. Ir daugelyje pramoninių prietaisų (magnetolos, CD grotuvai, radiojos, MP3 grotuvėliai, LCD monitoriai, elektroniniai laikrodžiai) jau seniai naudoja analoginį mygtukų valdyma. Minėtas sudaužytas prietaisas turėjo štai tokį mygtukų pajungimą:


(čia realaus prietaiso schema. Kodėl parinkti tokie rezistoriai aš nežinau)

Kaip matome, šeši mygtukai pajungti prie vienos MCU kojos. Šiaip prietaisiukas turi 3 analoginius valdymo įėjimus. 3 duomenų laidais pajungta 16 mygtukų. Naudojant grynai skaitmeninį pajungimą reikėtu žymiai daugiau MCU laidelių ir daryti ganėtinai sudėtingą ir resursų naudojantį algoritmą.

Pabandom suvesti skaitmeninio ir analoginio valdymo pliusus ir minusus (šios konkrečios schemos):

Analoginis valdymas:
(+) vienas MCU laidas
(+) lengva pajungti kiek toliau išneštą klavietūrą (rezistorius lengva prilituoti prie mygtukų)
(+) lengvas softas- analoginis signalas gali generuoti pertraukimą arba galima viena komandą nuskaityti klavietūros būklę.
(+)nėra kontaktų “kibirkščiavimo”
(-) reikia ADC
(-) reikia skirtingų rezistorių 🙂
(-) negalima daryti akordų (tiesa galima panaudoti binarinį kodavima su 2^n kodavimu)
(-) reikalingas Vref (tiesa jis gi pas MCU būna)
(-) galbūt jautrus trukdžiams? Ar blogiems mygtukams?

Skaitmeninis valdymas:
(+) yprastas
(+) daug softo
(+) galima akordai (nevisada)
(-) reikia daugiau MCU kojyčių
(-) reikia kovoti su kontaktų drebėjimu
(-) daug laidų iki klavietūros
(-) softas ėda daug MCU laiko, jei reikia dinaminio skanavimo

Malonu būtų išgirsti mintis ir komentarus.