ARM38: HUB08 ir STM32F1 hardware

August 1st, 2022

Šiais laikais dažnai galima rasti kiniškų LED matricų- ar tai išmestos, ar defektuotos arba nusipirkti pas pačius kinus. Tokias matricas valdo kiniški kontroleriai kurie viską ir atlieka, jei užtenka nervų suprasti kiniško softo kreivumą. Tačiau kartais atsiranda noras sukurti kažką savo ir paaiškėja, kad nelabai yra informacijos apie tas matricas- yra įvairios bibliotekos (gana kreivos) ar šiaip keisti sprendimai, bet pačio aprašymo nėra.
Šiame straipsnelyje pasinagrinėsim vienspalves (vieno ryškumo lygio) LED matricas su HUB08 jungtimi. Šios matricos maitinamos dažniausiai nuo 5V per atskirą jungtį, o informacija perduodama per 16 kontaktų jungtį su užrašu Hub08. Hub08 leidžia jungti matricas į grandinėles (daisy chain) ir kiniški moduliai ir jų softas automatiškai viską sutvarko. Mane domino kiek žemesnio lygio informacija.
hub08 protocol pinout
Kartais vietoje raudonų LED pajungiami ir mėlyni, taip gaunas RGB spalvos ar panašiai.

Hub08 leidžia perduoti vienu metu keturis duomenų kanalus su tuo pačiu clock (SPI). Dar yra ABCD kontaktai- tai 16 LED eilučių. Paprastai duomenų kanalai pavadinami R1,R2,G1,G2. T.y. dvi raudonos spalvos ir dvi žalios. Kodėl po dvi? Todėl, kad matrica dažniausiai buna 32 LEDų “aukščio" ir panašiai arba daugiau ilgio.

EN tai esamo buferio ir eilutės “rodymas" t.y. LED tuo metu šviečia. LAT (kartais STB) tai trumpas impulsas kuris perkelia duomenis iš SPI buferio į vidinį mikroschemos (74HC595) registrą. Teoriškai galima vienu metu rodyti vaizdą ir tuo pat metu krauti sekančios eilutės duomenis. Tačiau mano turimas kiniškas kontroleris to nedarė.
Matricų LEDai dirba impulsiniu režimu, todėl per juos teka didelė srovė, kuri statiniam režime tikriausiai sudegintu pačius LEDus. O ir nenorima rodyti visokias mirguliacijas jei pastringa kontroleris ar matrica, todėl LED matricoje yra hardwarinis kintamo signalo jutiklis- kol nėra impulsų, tol neveikia išėjimas. Matrica statiniam režime išsijungia.

Pažiūrim į kiniško kontrolerio signalą:
hub08 protocol line frame
(paveiksliukai dideli, naudokit zoom arba žiūrėkit kitame lange)
Beja, mano testuojama matrica uždega šviesos diodus kai duomenys lygus nuliui. Kai duomenys 1- LED nešviečia. Kiek stebina L (LAT, latch) signalo ir ABCD pokytis beveik vienu metu. Rekomenduočiau eilučių numerį keisti prieš ar po L signalo, o ne jo metu. Šis signalas yra “rising edge" tai kogero užtenka laiko duomenim pasikeisti. Kiniškos matricos CLK (paveikslėlyje S) buvo ~1.13MHz, eilučių dažnis apie 11kHz, bet tai priklauso nuo pačios matricos dydžio ir konfiguracijos. EN ilgumas duoda matricos šviesumą.

hub08 protocol data clock
Čia kiek geriau matosi SPI clock ir duomenų santykis. Ir kiek geriau matosi, kad ABCD ir L kinta ne vienu metu.

Eksperimentui paėmiau dvi matricas (32×64) ir susukau, kad gautusi kvadratas- 64×64. Viso 4096 šviesos diodai. (naudojau tik raudonus diodus, nes viena matrica buvo dvispalvė, kita vienspalvė). Kontroleris bus pats labiausiai prieinamas, STM32F103c8t6 (Bluepill) kiniškas padirbinys (gal dėlto man neveikia DMA). Deja, šis kontroleris turi paprastą SPI kuris turi tik vieną kanalą, todėl nutariau pagudrauti: duomenys ateina į pirmos matricos R2, pirmos matricos R2 išėjimas vel eina į tos pačios matrios R1 įėjimą. Pirmos matricos R1 išėjimas patenka į antros matricos R2. Antros matricos R2 OUT eina į R1 IN. Taip gaunasi, kad fiziškai ir logiškai visi, vienos eilutės, raudoni šviesos diodai susijungia į vieną SPI pliūpsnį. Reikia perduoti 32 baitus informacijos (32*8=256 šviesos diodai, 4 eilutės) “vienai, sujungtai eilutei", viso 16 eilučių. Aišku, po tokio sujungimo LEDų numeracija bus kiek sudėtingesnė, bet gi skaičiuoja ARM kontroleris, jis moka matematiką.

Toliau galimi du sprendimai kaip organizuoti visko veikimą- dinaminis vaizdo kurimas “on the fly" kaip pas ATARI 2600 kai nereikia “daug" RAM arba naudoti video RAM variantą (512 baitų RAM). Pirmas variantas taupo atmintį, bet labai komplikuoja vartotojo programą- ten labai svarbus taimingas ir viso video vaizdo generavimas. Variantas su video atmintim žymiai lengvesnis- visą matricos valdymą galima užkrauti per pertraukimus (ir DMA, kuris man kažko neveikia), o vartotojo programa gali veikti pagrindiniam cikle be jokio vargo su SPI duomenų perdavimu ir GPIO perjunginėjimu. Manau iš esamų 20kbaitų, pusę kilobaito galima paaukoti video atminčiai.

Pačios matricos valdymas daromas per pertraukimus. Pirmiausia pasinaudojam taimerių ir generuojama “eilutės" pertraukimą- kelis šimtus hercų, kad visa matrica (eilutės/16) nemirgėtu. Šis pertraukimas paruošia signalus, pasiskaičiuoja RAM adresą, išjungia vaizdą ir per SPI persiunčia duomenis. Tuom jis baigia darbą. Jei veiktu DMA, tai net ir procesorius per daug nedirbtu.
Toliau SPI generuoja savo darbo pabaigos pertraukimą. Čia pasirenkam rodomą eilutę, įjungiam ekraną ir baigiam darbą- atiduodam procesoriaus resursus vartotojo programai iki sekančio taimerio ciklo. Teoriškai čia dar galima būtų iššaukti dar vieną taimerį kad reguliuoti matricos šviesumą, bet deja aš to daryti dar nemoku. Todėl dabar matrica šviečia pilnu šviesumu. Pertraukimai dar generuoja taip vadinamas vėliavas (flag)- kintamuosius kurie leidžia asinchroniškai pagrindinei programai žinoti kas šiuo metu vyksta. Tai ir kadro numeris ir VS “impulsas". Tai leidžia vartotojo programai sinchronizuotis su matrica ir jos taimeriu.

Kaip visada programinė įranga:
LED matrix HUB08 demo program for STM32F103 with source code and hex file.

Faile “hub8.c" surašytas visas matricos interfeisas. Ir bazinės komandos plot, point ir teksto paišymas. Papildomai yra bendrinis linijos algoritmas (line.c). Pradėjau pilnai iškėlinėtį vartotojo programas į “user.c" failą- pagrindinima faile “main.c" lieka tik STM32CubeMX generuotas kodas ir kelios eilutės komandų. Taip paprasčiau perkelti programas iš vieno projekto į kitą.

64x64 RED LED

Demo programa nupaišo tekstą ir paleidžia taškelį kuris laksto po matricą ir “atsimuša" į jos kraštus. Kiek keistai paišosi taškelis- tai tik dėl float->int supaprastino konvertavimo. Reikia įvertinti 0,5 apvalinimą, o aš to nepadariau. Tačiau taškelis laksto, mano šuniukui tai labai patiko. Jis net užlipo ant stalo ir numetė tą matricą žemyn…

Uher report 4000 ir 4200

July 31st, 2022

Tai grynas 1966 metų produktas. Tačiau jau gryni tranzistoriai. Tai Uher Report 4000 serijos reporterių magnetofonai. Blogos būklės tokie magiukai parduodami už metalo laužo kainą, geri- artėja prie 500€. Visi magnetofonai turi vieną nemalonų defektą- greičių perjungimas ir ryšis su capstan'ų atliekamas frikcionu. O per tiek metų guma suakmenėja ir nebėra gero kontakto. O dar papildomai atsiranda visokie ūžesiai ir braškėjimai. Kiti dirželiai perkami internetuose ir lengvai keičiami.

Uher report 4200
Čia “stereo" versija. Tačiau tai ne tas stereo kur visi naudoja, o “vienpusis", nes magiukas turi galvą tik su dviem takeliais per visą juostą.
“Rankinė greičių dėžė" dešinėje aparato iš tikro ir yra rankinė greičių dėžė, čia persijungia juostos traukimo greitis ir įsijungia motoriukas.

They had four speeds: 7½ inches per second (i.p.s. or in/s), 3¾ i.p.s., 1⅞ i.p.s., and 15/16 i.p.s. [19 cm per second (cm/s), 9.5 cm/s, 4.75 cm/s, and 2.38 cm/s].

Mano turimas stereo variantas stipriai parudijęs ir kogero numestas iš kokio šešto aukšto- yra mechaninių problemų, nors viskas veikia. Teko tik su švitriniu popierium pažulinti frikciono gumą.
Tačiau pasitaikė dar vienas pasiūlimas ir nupirkau dar vieną, kiek geresnės būklės, bet pilnai mono (jie man kainavo ~40€). Tai Uher report 4000 ir 4200, ir šuniukas.
Uher report 4000 ir 4200
Mono varianto “fasadas" paprastesnis:
Uher report 4000
Tai senesnis modelis, gal 1961.

Aš šiuos magelius pirkau pernai žiemą, bet kažkodėl nieko apie tai neparašiau. Pirkau durnumo priepuolio metu, o dabar galvoju, kad toks aparatas tiktu kam nors kaip restauracijos treniruoklis. Stereo versiją reikėtu pilnai išardyti ir perdažyti. Aš nežinau, ar reikia ką nors liesti elektronikoje nes viskas veikia, o mechanikoje tiktai gumų problema. Tiesa, labai sunkiai plovėsi galvutės, nes kogero jos niekada nevalytos.
mechanizmas
Frikcionas priklijuotas (tiksliau ivulkanuzuotas) į tą aliumininį ratą. Jis kraštu liečiasi prie bronzinio veleno ir taip reguliuojasi juostelės greitis.

elektronika
Tikrai senoviškos plokštės ir senobiniai tranzistoriai. Dešinėje tranzistorius prisuktas prie korpuso- tikriausiai didelio galingumo, gal kokio pusės vato. :)

Čipų trūkumas 2

July 24th, 2022

Seniau lupinėdavau iš šroto (Husqvarnos žoliapjovės) STM32F103 čipus. Ne tiek jau daug rasdavau, nes dažniausiai čipai užlakuoti. Dabar vėl parvežė, matau keletą nelakuotu, čiumpu ir namie matau klastą:
STM32F103 clone
Tai kinietiškas analogas- ne toks “ekologiškas", bet sako kad greitesnis. Čipo viduje yra du kristalai- atskirai ROMas ir atskirai MCU. Čipo paleidimo metu programa perrašoma į RAM ir veikia iš ten. Teoriškai gaunasi lėtesnis boot, bet greitesnis kontroleris.
Lygtai pilnai suderinamas su STM produktu, bet tikriausiai yra savų prigulnybių. Čipas užnumeruotas kaip 303, bet čia tikrai ne trečia serija.
Seniau visi čipai buvo STM. Matyt arba taupo pinigus arba tikrai nėra kur pirkti naujų STM (nereikia barstyti).

Radau dar keletą BMSų:
STM32F302CCT6
Va čia tikra 3-čioji serija: STM32F302CCT6. Čipas kaip suprantu pilnai “pin compatible" su visų naudojamu STM32F103C8t, tačiau turi kiek kitokius periferinius įrenginius. Pirmiausia tai gretas ADC (iki 5Msps ir 12 bitų), FPU (įdomu kaip juo naudotis), DAC, operaciniai stiprintuvai(!) ir panašiai. Čia jau artėjam prie DSP (beja patys taip ir rašo:Mixed signals MCUs Arm Cortex-M4 core with DSP and FPU, 256 Kbytes of Flash memory, 72 MHz CPU, MPU, 12-bit ADC 5 MSPS, PGA, comparators.)

Su tokiu kontroleriuku galima netgi atsikasti seną projektą su diskrečiom detalėm ir PLL ir perdaryti į gryną “skaitmeną". Analoginis variantas buvo biški nestabilus ir mėgdavo deginti IGBT.

Dar vienas beveik lavonas- topcast

July 11th, 2022

Staiga bac! ir neveikia.
topcast mainboard
Tropinis klimatas Lietuvoje, priverstinis šaldymas ir nelakuota PCB (!). Keli lašai kondensato ir nešvarumai. Ko pasekoje biški neveikia. Nauja kainuoja 1600€ plius siuntimas, tai kaip ir verta nagrinėtis. Juolab, kad technologija antikinė. Svarbiausia, kad procesoriukas (NEC/Renesas H8S/2357) veikia. Veikia ir rodo vėjus, nes analoginėje dalyje atsirado papildomi laidumai.
Read the rest of this entry »

Nauja power elektronika

June 28th, 2022

Bandysim paleisti.

power
Bendras maitblokiuko vaizdas.
Read the rest of this entry »

ARM37: zuikis ir vėžliukas

June 26th, 2022

Kas nesidomi mikroprocesorių programavimų, gali ir neskaityti. Bus nelabai įdomu… :)

Klasikinė bėda- yra du procesai, kurių veikimo greičiai labai skiriasi. Šiam variante: USB ir UART. Kaip suderinti jų bendrą veikimą? Štai imat kokį source code iš interneto platybėse publikuotos pamokėlės, viskas kaip ir veikia kol spaudžiojat duomenis iš klaviatūros, o jei pabandot “copy-paste" ir staiga tekstas pradeda nebepersiduoti, raidės prapuola ir procesoriukas pastringa. Kodėl? Todėl, kad reikia suderinti skirtingo greičio ir veikimo principo procesus:
Pirmas procesas, USB, tai paketinis duomenų perdavimas su galimybe pristabdyti duomenis ar net paprašyti juos pakartoti. Viskas vyksta gana greitai.
Antras procesas, UART, tai nuoseklus, lėtas duomenų perdavimas. Ir pats perdavimas pririštas prie laiko. Jei nenaudojam kontrolinių linijų, procesą negalime sustabdyti. Kai duomenų per daug, jie prarandami.

Taip atrodo iš žmogaus pusės, iš kontrolerio pusės tai jau keturi procesai: USB TX, USB RX, UART TX, UART RX.

Kad suvaldyti šį chaosą, reikia procesus paleisti nepriklausomai, per pertraukimus. Arba, kai siunčiam, tai galima ir pastabdyti pagrindinį ciklą (bent jau šiame eksperimente). Gaunais taip:

  1. UART RX, per pertraukima ir net DMA. Tačiau nežinom kiek baitų gausim, tai visas mūsų DMA/IRQ tvarko tik vieną baitą.
  2. UART TX, siuntimas blokuojant procesoriaus darbą. Mūsų programa nieko protingo nedaro, tai galima blokuoti.
  3. USB RX, tikriausiai per pertraukimą, naudojam HAL biblioteką.
  4. USB TX, blokuojamas ar tai IRQ, naudojam HAL biblioteką*.

Visi procesai per pertraukimą daro tik vieną darbą- jei gaunam duomenis, įrašom duomenis į buferį (jei yra vietos). Buferis vadinasi “circle" nes tai kaip ir cirkuliarinis buferis**, tik aš jo neperpildau, prarandu duomenis jei buffer overflow. O pats smagumas vyksta pagrindiniam, amžinam cikle:

 while(1)
	{
	HAL_IWDG_Refresh(&hiwdg); //watchdogas
	
	while(circle_available(&cc)>0) //ar yra duomenu gautu is UART?
		{
		i=circle_available(&cc);
		for(j=0;j<i;j++)
			{
			tmp[j]=circle_pull(&cc); //viska persikopijuojam ir issiunciam
			}
		CDC_Transmit_FS(tmp, i); //siuntimas per USB (blocking?. gal ne)
		}
	
	while(circle_available(&cu)>0) //ar yra duomenu gautu is USB?
		{
		i=circle_available(&cu);
		for(j=0;j<i;j++)
			{
			tmp[j]=circle_pull(&cu); //viska persikopijuojam ir issiunciam
			}
		send_uart((char *) tmp,i); //siunciam per UART (blocking)
		}
	}
}

Tikriausiai senas Wordpresas nenusiaubė programos teksto.

Iš principo programa veikia taip: yra ką perduoti? perduodam! ir vėl iš naujo.

Tačiau galima dar labiau viską užkomplikuoti- TX padaryti su atskirais buferiais ir siuntimo procesą irgi padaryti asinchroninį. Tada procesoriuje išsilaisvintu dar šiek tiek resursų kokiai nors pagrindinei programai.
Dar viena bėda- nenumatytas atvejis, kai trumpuose momentuose, kol ištraukiami duomenys į buferį, kas nors įrašytu naujus duomenis. Teoriškai circle buferis apsaugo nuo tokių nemalonumų… Praktiškai, buitiniams reikalams viskas veikia.

Šis straipsniukas skirtas man pačiam prisiminti, nes reikėjo ir neatsiminiau. Teko kiek parašinėti.

*) HAL USB biblioteka netikrina ar duomenys išėjo. Jei reikalingi TIKRAI gerai daryti, reikia tikrinti USB būklę. Tada jau geriau nagrinėtis ATARI disko emuliatoriaus kodą (rodos ten padariau viską)
**) circular buffer, cirkuliarinis buferis leidžia rašyti ir skaityti duomenis iš buferio. T.y duomenys kaip gyvatėlė Uroboras, nauji duomenys prisideda prie galvos, o seni nusiima prie uodegos. Viskas gerai, kol galva nepasiekia uodegos ir gyvatėlė neįsikanda. Tada prarandam duomenis.
P.S. source kodas neoptimizuotas dėl aiškesnio vaizdavimo.

ARM36: Burbuliniai LED

June 15th, 2022

Antikvarinis LED indikatorius, tikriausiai iš kokio nors tarybinio kalkuliatoriaus. Žavi savo netobulumu:

burbulinis LED
АЛС318

Simboliai mažyčiai (todėl ir plastikinės linzės), šviesumas mizernas (prie tausojančių srovių). Bet savotiškai žavingas.
Tokiam indikatoriui pajungti reikia gana daug laidų ir dinaminės indikacijos. Demonstracijai panaudojau breadboard ir “bluepill" plokštę (STM32F103C8t)- mikroschema mažoka, beveik visos kojos sunaudojamos indikatoriui. Prie anodų (pliusinių elektrodų) reikia prikabinti kokius nors rezistorius, kad apriboti srovę per LED, tik 3mA statiniam režime per vieną segmentą. Naudojant dinaminę indikaciją leistina srovė 40mA, bet jei indikacija sustos, tai atia LEDams.
Read the rest of this entry »

Švilpiko dienos radija

June 2nd, 2022

Nu gal ne visai, originale tai Panasonic RC-6025, o pas mane Sanyo Sterocast RM5320, tikriausiai 1972 metų gamybos (gali būti ir su kitu brendu, kad ir Siemens alpha). Tikrai japoniška, nes visur tik “made in Japan", ant garsiakalbio Sanyo ir panašiai.
Sanyo sterocast
Kodėl žinau, kad yra kitu brendų? Ogi todėl, kad pirmoji radija kur pirkau buvo Siemens. Bet ji ne tik su sugadintu motoriuku (plastikinis dantratis be dantų), bet ją man dar ir stiprokai sudaužė- 70-tųjų plastikas labai trapus.
Read the rest of this entry »

Betkas su delnu ir BT

May 24th, 2022

Nėra labai laiko ką nors normaliai parašyti, tai keletas randominių fotkių:
KM
O jetau, tai “keemkės"! Rusiškas ir tarybinis paladis su platina.

koaksas
Tai kažkoks koaksalinis šakotuvas. Tikriausiai galingas.

BT
(HQ-BLE-1, HMI board)
Tai husqvarnos žoliapjovės ekrano plokštė su BT. Į BT čipą (CC2640R2) supumpavau kinišką firmwarą nuo HM-18/19 modulio. Tačiau pas kinišką modulį viena TX/RX koja ne per tą piną eina, tai teko pritaikyti laidelį ir rezistorių. Arba reikia “pačinti" firmwaro binarą.
Kas per debilizmas tas BT LE, keletas programų mobiliems telefonams yra, bet nėra jokio veikiančio softo windows kompiuteriui.

ARM35: LCD ir FSMC

May 2nd, 2022

Trumpa priešistorė: prisirinkom kažkokių PCB su STM32F103* mikroschemos ir nežinomu LCD. LCD buvo dviejų tipų, o pačios PCB irgi keletos variantų. Kai kurios su kitu STM32 BGA čipu ir ROM/RAM mikroschemom. Dar kitos PCB beveik tuščios ar pažeistos. Užtat visos turi mėlyną dantį ir visokias smulkmes.
Visokius kištukus gana lengvai išaiškinom (gerai, kad ne visos PCB padengtos laku), kai kurie primityvai kaip LCD pasvietimas (ar dar kieno) eina per tranzistorius, tai irgi lengvai atsibūrė. Bet liko LCD. LCD tikrai dviejų tipų- mažesnis, išjungtas juodas ir didesnis, baltas. Abu ekranai grafiniai, nes yra originali firmwarė, kur parašo kad “atnaujink softą". Pirminis softas lygtai ir universalus abiem plokštėm ir jame aptikom, kad plokštės iš Husqvarnos automatinių žoliapjovių.
Deja informacijos apie LCD ekranus ar kontrolerius nebuvo visiškai. Todėl ėmiau iš eilės visokius LCD ekranus su panašiu kiekiu pinų ir bandžiau… Pagal įtampas, pagal originalios firmwarės siunčiamus signalus atrinkau, kur maždaug duomenys, kur WR ar panašūs signalai.
Mažesnis LCD labai panašu į ST7565 ir ten viskas maždaug buvo aišku. Didelis LCD visiškai neaiškus.
Dar pasirodė labai keista, kodėl pasirinktas toks keistas pajungimas prie MCU:

PD0=D2
PD1=D3
PD4=RD
PD5=WR
PD7=CS1
PD14=D0
PD15=D1
PE3=A0
PE7=D4
PE8=D5
PE9=D6
PE10=D7

Tačiau pernelyg nesivarginau. Nes svarbiau buvo LCD. Su didesniu LCD buvo bėdos- labai panašus LCD yra UltraChip serijos kontroleriai kaip UC1610 ar UC1611. Tačiau komandos nevisos veikia. Bėda tame, kad daug komandų bendros visos serijos čipams (ar net kito gamintojo čipams), kitos komandos ignoruojamos ar panašiai. Ir dar nustebino pačio LCD ekrano pilkumo atspalvių bitų seka. Net vienu metu kilo mintis, kad ten spalvoto ekrano kontroleris pritvirtintas prie juodai-balto LCD ekrano. Dar kilo mintis, kad neteisingai nurašiau pinoutą (tikrai ne, žr. toliau).
Bežaidžiant su bitais, buvo kaip ir parašytas šioks toks softas ekrano valdymui. Tačiau norint paišyti vaizdą ant ekrano pagal pikselius, reikia nuskaityti informaciją iš ekrano. Tai galima padaryti ir “bit bang" režimu ir su STM32F103 tai vyksta gana greitai. Bet vistiek viskas labai kvaila. Buvo pasiskaitytos instrukcijos, paguglinta ir pasinagrinėtas STMkubikas ir pasirodo man nežinomas FSMC režimas, kur kaikurios MCU kojos pavirsta DATA, ADR ir kontroliniais (WE, CS ir pan) signalais. Tada skaitymas iš LCD ar rašymas į LCD (ar į kokį SRAM) pavirsta paprasta operacija- “rašymas ir skaitymas iš RAM":

*(__IO unsigned char *)(LCD_DAT_ADDR)=d;
d=*(__IO unsigned char *)(LCD_DAT_ADDR);

Ir mūsų LCD būtent ir pajungtas kaip FSMC įrenginys (dėl to ir toks keistas LCD pinouto pajungimas).
Tačiau net dvi dienas man niekas neveikė. Nes dokumentacijoje gana miglotai parašyta ir iš pirmo žvilgsnio viskas labai nelogiška. Bėda susijusi su duomenų šynos pločių ir adresu. LCD ekrano A0 pinas, kuris atskiria duomenis nuo komandų prikabintas prie A19 pino. Šio pino lygį turi reguliuoti adresu bitai:

//Musu LCD A0 pajungtas prie A19 pino.
#define LCD_CMD_ADDR 0×60000000
#define LCD_DAT_ADDR 0×60080000

Tačiau niekas neveikė. Pasirodo, mano pavyzdiniam softe buvo ne “unsigned char", o “unsigned int" (aka uint16). Kituose pavyzdžiuose net 32 bitų kintamasis. Ir dar baisiau- net keletas straipsnių rašė, kad jei naudojam 16 bitų nuskaitymą, adresas pasislenka per vieną bitą, jei 32 bitus, per du bitus. Tačiau ir tai nepadėjo, nes mano pagrindinė klaida buvo tokia, kad nuskaičius 16 bitų iš 8 pin porto, maniau, kad mažesnieji bitai turės reikalingą informaciją. Pasirodo, kad ne. Kiek suprantu, STM čipas hardwariniam lygyje prisiderina prie “bus width" ir dar net kelis nuskaitymus ar rašymus. O jei sukonfiguruota nelogiškai, viskas ir nelogiškai veikia.
Todėl, jei reikia nuskaityti BAITĄ iš 8 laidų šynos, tai reikia C kalboje ir skaityti BAITĄ. Dar nesu tikras ar skaitant WORD iš BYTE nedaromas dvigubas nuskaitymas. Šitą reikia dar patikrinti, nes LCD ekranos softas dar kiek optimizuotusi. O dėl adreso, čia man irgi kiek neaišku, bet baitų, wordų ir longwordų adresai yra atitinkamai pasislinkę, jei norime juos nuskaityti. Pas ARM gal nėra tos bėdos kur yra pas MC68000, kur negalima skaityti pabaičiui ar panašiai iš nelyginių adresų…
Labai daug ir neaiškiai parašiau, bet čia mano “brain dump" ir ši informacija skirta man prisiminti, kaip pajungti FSMC režimą pas STM32F103. Ką dar gero duoda tas FSMC? Ogi DMA.

Kad straipsnis gautusi indomesnis, va fotkė:
LCD

Tai tas didysis ekranas, deja neįjungtas pašvietimas. Naudojamas keistokas “klasikinis" TI99 šriftas kuris gal netinkamas šiam ekranui.

Ir net trys variantai source code su viskuo: mažas ekranas bitbang, didelis ekranas bitbang ir didelis ekranas FSMC:
Husqvarna LCD ir STM32F103 FSMC.

Visas source tikrai neaptvarkyti, yra labai daug eksperimentavimo ir “reverse engineering" likučių.

*) ne visos STM32F103 palaiko FSMC. Čia STM32F103VGT6.

Unhappy Tikbalang