Neki experimenti sa WS2812B smart LED pixel trakom i STM32F407 kontrolerom.
Sam digitalni protokol zahteva vrlo precizan tajming za prenos RGB informacija i ovde je uradjena implmentacija preko PWM modula sa DMA transferom.
PWM se moduliše od ciklusa do ciklusa sa dve diskretne verdnosti za 0 i 1 tj upiše se 60 ili 120 u brojače pa se dobije tačan tajming
za 24bit stream po pixelu i tako redom koliko ima pixela u nizu.
Postotji buffer u RAM koji se pripremi sa informacijama tj intenzitetom i bojama za sve pixele i startuje se DMA transfer iz memorije ka PWM modulu bez intervencije CPU oko prenos tih informacija samo se javi interupt kada je završen transfer da bi mogla da se pusti sledeće sekvenca.
Prenos informacija za ovih 14 LED traje oko 500us, 0.5ms što bi efektivno bilo oko 2000 FPS brzina osvežavanja mada sam terao na 1000 FPS jer nije imao majji delay od 1ms
Naravno može i sporije.
Ova postavka sa DMA/PWM radi predobro, probao sam neke animacije i terao sam GPT da mi napravi 20 različitih efekata i animacija sa tom postavkom, radi kao sat, svetli ko blesavo i na 3V3 i 5V još jače.
Moguće je privezati po jednoj digitalnoj linij više desetina ili stotina LED u niz i da se osvežavaju sa 50+ FPS, za VU metre sa Peak-hold ili spektralne anlizatore sa više redova ili druge vizuelne indikatore ...
Ovaj experiment je više tehničke prirode da ustanovim šta mi je interno potrebno u MCU da bi gurao te LED.
Zahtevan je tajming i teško je realizovati to bez pomoći HW modula.
Treba da postavim te LED tri komada na neku Linux mašinu (Sitara AM62x) ali koja nema sve te lepe interne module i tajmere, ako budem uspeo samo HW tajmer da rezervišem biće dobro, za DMA već sumljam da imam na raspolaganju ...
Zadnjih 10godina sam vise puta radio sa neopixel trakama i atmega328 ih bez problema drajvuje sa cistom softverskom bitbang metodom. Pomenuti 328p nema DMA pa i pored toga ima x projekata vumetara i analizatora spektra i sve to sa neopixel tako da se ne bih slozio da ne moze da se realizuje bez HW modula.
Spomenuno sam da je Linux u igri i kod njega nije tako prosto kao sa MCU rešiti sve programski, kompletan tajming je veoma klizav i nepredvidljiv, ne mogu da računam na tačna vremena ...
Pokažite mi primer za Linux sa GPIO i Ioctl iz user-space!?
03-05-2026, 02:38 PM (This post was last modified: 03-05-2026, 02:40 PM by ddanijel.)
Da te ne citiram, iznad si pomenuo STM32F407 , nigde posle nisi explicitno rekao da planiras direktno na linux masinu bez STM32F407, a i ne znam sto bi to radio kao da je STM32F407 100 dukata sto bi rekli ?
A i iznad si napisao da si zeleo da vidis sta ti sve treba u MCU pa shodno tome ocekivao sam da ce mcu biti i dalje u igri zar ne?
Linux is like a wigwam NO Windows NO Gates and an Apache inside
Sitara AM62x je target platforma (STM32 je referetni primer), AM62x tehnički ima i Linux i MCU unutra pa se mešaju malo konteksti kada je ta platforma u pitanju stim što zavisi od SoC postavke ima jedno M4F jezgro samo i to vrlo skromno koje recimo nema DMA kontroler i to jedno jezgro ako se bude koristilo biće opterećeno drugim prioritetnim HW I/O stvarima i gomilom interapta, tehnički ne mogu da računam na njega po pitanju WS2812B.
Treba da iskoristim neki drugi dostupan mehanizam ili interni HW modul na tom SoC da bi gurao 3xRGB LED, ako je to tolika komplikacija da treba MCU nije mi to onda dobro rešenje, ima drugih povoljnih i elegantnijih I2C periferija specifično za LED i generalno sa I2C nemam problema oko kontrole iz LInuxa.
Eh, ovo je AM64x mašina, imam i AM62x i iste su po ovom gore pitanju, tako da za probe se vrtim na AM64x i ignorišem ostala MCU jezgra i probam samo ove dodatne periferije konkretno TTY serisku vezu.
Taj port je konkretno rutiran na RS-485, manje više nebitno koji je interfejs jer mi je bitno da je fizički dostupan i povezan sa sistemom dok se HW logika za sad prati osciloskopom.
Na target platformi imam slobodne te TTY portove.
Vidi se da je prihvatio 2500000 tj 2.5Mbaud (ostale nije) što je vrlo blizu u okviru tolerancije idealnom slučaju koji treba za WS LED a to je 2.4Mbaud pa se sa tim onda radi Bit-banging tipa 001=0 i 111=1, u buffer se dalje prave strukture i ptretvaraju u stream koji se prosledi na WS LED.
Slično bi bilo i sa SPI portom, on bi mogao 100% da završi posao i to posebno lepo optimizovano specifično za taj jedan bukvalno Chip-select koji prebaci MOSI liniju na LED liniju i to vrlo lepo podržano kroz MULTY-MODE SPI kontroler koji može da ima različite brzine komunikacije po CS/selektovanoj periferiji kao što treba za WS i tu bi se lepo uklopio isto SPI-bit-banging!
Za sad probam sa TTY, velike su šanse da proradi ...
stty -F /dev/ttyS4 2500000 cs8 -parenb -cstopb; while true; do printf "\x92\x49\x24\x92\x49\x24"; done > /dev/ttyS4
Evo paralelno plavi kanal sa STM32 koji radi tačno sa 1.25us bit time i žuti je sa seriske linije gde sam dobio 1.2us bit-time što je u okviru od 4% tolerancije, bez (dodatnog) hardwera i bez (dodatnog) softwera, direkt iz linux terminala
Uz odredjene probleme oko enkodiranja i reseta jer me mrzi da stavim jedan tranzistor da invertujem logiku ili da menjam Device Tree jer bi trebao UART modul da ima tu opciju za invertovanje izlaza, to bi mi popravilo probleme oko reset signala.
Ostalo oko bit-bang enkidinga je izvodljivo, reaguje na neke instrukcije ali brljavi trenutno, trebam da skockam ispravan frame, generalno reaguje ...
Uzgred ovaj gore AM64x je brutalan kontroler, mnogo ozbiljan i kompleksan, pogledajte STM32F407 sa početka teme, single-core Cortex-M4F na 180MHz.
Ovaj Sitara SoC ima u sebi izmedju ostalog baš to jedno M4F jezgro ali je rezervisan recimo samo za Safety-features, za nadzor sistema, izolovan memoriski i hardwerski čak sa svojim posebnim napajanjem!
Jezgra za real-time su Cortex-R5F, tehnički nadogradjen M4F, sa 800MHz clock i to u konfiguraciji kao 4x nezavistna jezgra ili 2x2 jezgra u lock-step konfiguraciji za safety-specific potrebe, sa ECC memorijom.
Ima još jedno R5F jezgro koje se bavi samo interaptima i clock/power-managmentom za sva ostala jezgra i periferije!
Tek sam počeo da nabrajam jezgra, tu su još i 2x2 PRU-ICSSG jezgra, tek priča za sebe, uglavnom su u stilu Software Defined Network Adapter, učita im se firmware i mogu da postanu recimo 1Gbit kontroleri za industriske protokole, EtherCat, Sampled Values, TSN, bukvalno svi poznati industriski mrežni protokoliki su podržani kroz firmware koji daju, neki su besplatni neki se plaćaju.
Kada se ne koriste ti protokoli, onda su ta jezgra dostupna za bilo kakvo drugo diskretno sofwersko procesiranje sa I/O pinovima, bukvalno su predvidjeni za diskretan bit-banging svih poznatih protokola!
I tu su Cortex-A53 jezgra koja voze linux i ostale periferije koje mogu da se mapiraju na različita jezgra.
Ima DDR3 slot u koji se postavlja SoM/SoC sa AM62x i ostak je glavna noseća PCB koja ima 2x1Gbit Ethernet, izolovan RS-485 i CAN-FD, dodatne izolovane digitalne kanale, napajanje je tu-negde i ima dva ekspanziona slota.
Kao što se vidi, ekspanzioni slotovi su vrlo zanimljivo organizovani, tačnije to je raspored od Raspberry Pi sa 40-pinskim konektorom i rasporedom rupa/šrafova i električno/funkcionalno će biti rutirano da bude isti raspored pinova na konektoru, SPI, I2C, USART i ostali GPIO, plus dodatno jedan slot je rutiran na pinove koje kontroliše linux dok je drugi slot rutiran na rea-time jezgro!
Tu mi fale tri 3xRGB LED
LP5009 gore-levo postavljen da "nervira" ...