Category Archives: MCU

ARM:0016 STM32CubeMX – RTC problema

Tai labai trumpa žinutė, nes ST gudručiai ir kubiko programeriai pasistengė, kad gautusi sudėtingiau. O aš poto užmiršiu jei neužrašysiu.
Kad RTC (realaus laiko laikrodis) veiktu su STM32CubeMX paketu reikia daryti taip:

Susirandam “MX_RTC_Init(void)“, skrolinam iki komentaro “USER CODE BEGIN Check_RTC_BKUP“. Ten nuskaitom vieną iš vartotojui prieinamu “backup” reikšmių ir atidarom “IF”:

/* USER CODE BEGIN Check_RTC_BKUP */
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
{
/* USER CODE END Check_RTC_BKUP */

Skaičius “0x5051” gali būtu bet koks, svarbu kad jis nesigautu atsitiktinai sutampantis su tikrai pilno MCU starto skaičium.
Poto paskrolinam daug kodo su RTC inicializacija…

/* USER CODE BEGIN RTC_Init 2 */
} // Kitame user code virsuje yra IF komanda. Čia ji užsidaro.
else
{
// LAIKAS BUVO ISSAUGOTAS, NES USER REGISTRAS TURI MAGIC skaiciu 0x5051
// Čia galima ką nors padaryti iš tos laimės arba pagalvoti apie kalendoriaus atstatymą. Sako kad jis nelabai
}

//Čia įrašom tą MAGIC skaičių. Jis po pilno reseto ir RTC mirties turi neišlikti.
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//Write data to the specified backing area register
/* USER CODE END RTC_Init 2 */

Taip padaryta, kad useris aklai nepasitikėtu RTC veikimu ir tikrintu RAM išlikimą. Kai kuriuose forumuose rekomenduoja paprasčiausiai nutraukti RTC inicializacija su return komanda. Tačiau reikia daryti taip, kaip parašiau- pasitikrinam ar RAM išlaikė realius skaičius ir tik tada sakom, kad RTC korektiškai veikė kol procesorius stovėjo išjungtas. Jei RTC mirė, mirė ir jo RAM. Tada starto metu, žinom, kad laikrodis rodo nesamones.

P.S. Jei norim sekundinio pertraukimo, tai reikia paleisti kur nors RTC init gale šitą makrosą:

__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC);

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 →

ZX LCD

Besitvarkant daiktus (čia retas reiškinys), radau savo seną eksperimentą su FPGA/CPLD ir LCD (tik ekranas jau buvo kitas). Tas eksperimentas buvo nedabaigtas dėl žinių, noro ir kantrybės stokos. Dabar visko kiek daugiau, tai nudraskiau nereikalingas detales ir pridėjau naujų:
ZX Spectrum in CPLD LCD mode
Tai labai panaši sistema kaip ir paprastam ZX Spectrum CPLD/VGA. Tik pasikeitė keletas esminių koncepcijų:
Senesnėje versijoje atmintis buvo bendra- procesorius ir VGA buferis naudojosi ta pačia atminties mikroschemą, todėl CPLD stengėsi atlikti atminties arbitro (MMU) darbą ir laiko rėžiais (time slot) prileisdavo tai CPU tai VGA prie tos pačios atminties. Ši schema kiek kitokia- pirmiausia, naudojama atskira atmintis procesoriui- Toshiba TC551001BPL-85. Tai žymiai lėtesnė atmintis, tačiau ji skirta tik procesoriui. VGA ar LCD kontroleris visiškai nesikreipia į ją. LCD/VGA kontroleris tik sėdi ant duomenų ir adreso linijų ir stebi jam reikiamas kombinacijas- jei pastebimas rašymas į video atminties plotą, duomenys dubliuojami ir LCD/VGA atmintyje. Taip pat stebim Z80 IN/OUT veiksmus, nes mums reikia vaizduoti pajungta klavietūrą, magnetofoną ir garsiakalbį.

ZX Spectrum in CPLD LCD mode
Tačiau tai vienspalvis LCD monitorius, 320 x 240 taškelių. Duomenys pumpuojami po 4 bitus iš karto, todėl sistemos dažnis netgi kiek lėtesnis. Tačiau labai lėtinti negalima, nes kažkur prie 40Hz kadrų dažnio labai matosi vaizdo mirgėjimas. Dabar LCD veikia virš 60Hz dažniu. Deja, jis labai inertiškas- “border” efektai susilieja…

ZX Spectrum in CPLD LCD mode
O judantys objektai beveik nesimato.

Aišku šiame variante visiškai ignoruojami spalvų atributai (“flash” veikia), todėl žaidimų vaizdeliai keistoki. O borderį padariau dryžuota, kad kiek nors skirtusi “spalvos”.

Šis antras maketas buvo surinktas ne dėl ZX spectrum. Aš galvoju čia sudėti kokį nors kitą retro kompiuterį, bet ZX yra vienas iš paprasčiausių, tai testavimui suėjo.
Schemotechnika visiškai paprasta- adresų šyna po stiprintuvo 2x SN74HCT541N (nelabai jis reikalingas) eina į CPLD, ROM, RAM. Tas pats, tik be buferio, padaryta su duomenų šyna. Viskas “sumontuota” CPLD mikroschemoje. Ten aišku tebeliko keletas klaidų, tačiau sistema veikia.

Ir aišku visi failai:
Intel-Altera Quartus CPLD source code for ZX Spectrum LCD version.

Jei jums nepasileido, tai atminkite, kad kai kurie Z80 CPU reikalauja, kad jų clock būtų 5Vpp, o ne TTL lygio.

LCD ekranas iš senoviško dauginimo aparato: EDMMPU3BDF, jo pinout:


1. ON/OFF
2. n.c.
3. VS
4. HS
5. pix CLK
6. Vcc, +5V
7. GND
8. Vee, -25V
9. D3, pixel data
10. D2
11. D1
12. D0
13. Vee, same as 8.
14. contrast.