2. datu lapu lasÄ«Å”ana: SPI uz STM32; PWM, taimeri un pÄrtraukumi STM8
Š pirmÄ daļa Es mÄÄ£inÄju stÄstÄ«t hobiju elektronikas inženieriem, kuri uzauguÅ”i no Arduino biksÄm, kÄ un kÄpÄc viÅiem vajadzÄtu lasÄ«t datu lapas un citu mikrokontrolleru dokumentÄciju. Teksts izrÄdÄ«jÄs liels, tÄpÄc praktiskus piemÄrus apsolÄ«ju parÄdÄ«t atseviÅ”Ä·Ä rakstÄ. Nu viÅÅ” sevi sauca par piena sÄni...
Å odien es jums parÄdÄ«Å”u, kÄ izmantot datu lapas, lai atrisinÄtu diezgan vienkÄrÅ”us, bet daudziem projektiem nepiecieÅ”amos uzdevumus STM32 (Blue Pill) un STM8 kontrolleros. Visi demo projekti ir veltÄ«ti manÄm mīļÄkajÄm gaismas diodÄm, mÄs tÄs apgaismosim lielos daudzumos, kam bÅ«s jÄizmanto visÄdas interesantas perifÄrijas ierÄ«ces.
Teksts atkal izrÄdÄ«jÄs milzÄ«gs, tÄpÄc ÄrtÄ«bas labad veidoju saturu:
Atruna: Es neesmu inženieris, nepretendÄju uz dziļÄm zinÄÅ”anÄm elektronikÄ, raksts ir paredzÄts tÄdiem amatieriem kÄ es. PatiesÄ«bÄ es sevi uzskatÄ«ju par mÄrÄ·auditoriju pirms diviem gadiem. Ja kÄds man toreiz bÅ«tu teicis, ka datu lapas nepazÄ«stamÄ mikroshÄmÄ nav biedÄjoÅ”i lasÄ«t, es nebÅ«tu veltÄ«jis daudz laika, meklÄjot dažus koda gabalus internetÄ un izgudrojot kruÄ·us ar ŔķÄrÄm un lÄ«mlenti.
Å ajÄ rakstÄ galvenÄ uzmanÄ«ba tiek pievÄrsta datu lapÄm, nevis projektiem, tÄpÄc kods var nebÅ«t ļoti glÄ«ts un bieži vien ir ierobežots. PaÅ”i projekti ir ļoti vienkÄrÅ”i, lai gan piemÄroti pirmajai iepazÄ«Å”anai ar jauno mikroshÄmu.
Es ceru, ka mans raksts palÄ«dzÄs kÄdam lÄ«dzÄ«gÄ hobija iegremdÄÅ”anas posmÄ.
STM32
16 gaismas diodes ar DM634 un SPI
Neliels projekts, izmantojot Blue Pill (STM32F103C8T6) un DM634 LED draiveri. Izmantojot datu lapas, mÄs noskaidrosim draiveri, STM IO portus un konfigurÄsim SPI.
DM634
TaivÄnas mikroshÄma ar 16 16 bitu PWM izejÄm, var savienot Ä·ÄdÄs. ZemÄkÄs klases 12 bitu modelis ir zinÄms no vietÄjÄ projekta Lightpack. Savulaik, izvÄloties starp DM63x un labi zinÄmo TLC5940, es izvÄlÄjos DM vairÄku iemeslu dÄļ: 1) Aliexpress TLC noteikti ir viltots, bet Å”is nav; 2) DM ir autonoms PWM ar savu frekvenÄu Ä£eneratoru; 3) to varÄja lÄti iegÄdÄties MaskavÄ, nevis gaidÄ«t sÅ«tÄ«jumu no Ali. Un, protams, bija interesanti iemÄcÄ«ties paÅ”am vadÄ«t mikroshÄmu, nevis izmantot gatavu bibliotÄku. Tagad mikroshÄmas galvenokÄrt tiek piedÄvÄtas SSOP24 iepakojumÄ, tÄs ir viegli pielodÄt ar adapteri.
TÄ kÄ ražotÄjs ir taivÄnietis, datu lapas mikroshÄma ir rakstÄ«ta Ä·Ä«nieÅ”u angļu valodÄ, kas nozÄ«mÄ, ka tas bÅ«s jautri. Vispirms skatÄmies uz pinout (Pin savienojums), lai saprastu, kurai kÄjiÅai ar ko pieslÄgt, un tapu aprakstu (Pin Apraksts). 16 tapas:
Izlietne / AtvÄrta kanalizÄcijas izvade ā notekas; ieplÅ«stoÅ”Äs strÄvas avots; izeja ir savienota ar zemi aktÄ«vÄ stÄvoklÄ« - gaismas diodes ir savienotas ar draiveri ar katodiem. Elektriski tÄ, protams, nav āatvÄrta kanalizÄcijaā (atvÄrta kanalizÄcija), taÄu datu lapÄs Å”is apzÄ«mÄjums tapÄm drenÄžas režīmÄ bieži ir atrodams.
ÄrÄjie rezistori starp REXT un GND, lai iestatÄ«tu izejas strÄvas vÄrtÄ«bu
Starp REXT tapu un zemÄjumu ir uzstÄdÄ«ts atsauces rezistors, kas kontrolÄ izeju iekÅ”Äjo pretestÄ«bu, skatiet diagrammu datu lapas 9. lappusÄ. DM634 Å”o pretestÄ«bu var kontrolÄt arÄ« ar programmatÅ«ru, iestatot kopÄjo spilgtumu (globÄlais spilgtums); Å ajÄ rakstÄ es neiedziļinÄÅ”os, es vienkÄrÅ”i ievietoÅ”u Å”eit 2.2ā3 kOhm rezistoru.
Lai saprastu, kÄ vadÄ«t mikroshÄmu, apskatÄ«sim ierÄ«ces saskarnes aprakstu:
JÄ, lÅ«k, Ä·Ä«nieÅ”u angļu valoda visÄ tÄs krÄÅ”ÅumÄ. To tulkot ir problemÄtiski, ja vÄlaties, varat to saprast, bet ir arÄ« cits veids - apskatiet, kÄ datu lapÄ ir aprakstÄ«ts savienojums ar funkcionÄli lÄ«dzÄ«gu TLC5940:
... Lai ievadÄ«tu datus ierÄ«cÄ, ir nepiecieÅ”ami tikai trÄ«s tapas. SCLK signÄla augoÅ”Ä mala novirza datus no SIN tapas uz iekÅ”Äjo reÄ£istru. Kad visi dati ir ielÄdÄti, Ä«ss augsts XLAT signÄls aiztur secÄ«gi pÄrsÅ«tÄ«tos datus iekÅ”Äjos reÄ£istros. IekÅ”Äjie reÄ£istri ir vÄrti, ko iedarbina XLAT signÄla lÄ«menis. Visi dati vispirms tiek pÄrsÅ«tÄ«ti vissvarÄ«gÄkais bits.
AizbÄ«dnis ā fiksators/fiksators/slÄdzene. AugoÅ”Ä mala ā pulsa priekÅ”ÄjÄ mala MSB vispirms ā nozÄ«mÄ«gÄkais (kreisais) bits uz priekÅ”u. pulksteÅa datiem ā pÄrsÅ«tÄ«t datus secÄ«gi (pa bitiem).
VÄrds aizÅ”aujamais bieži atrodams mikroshÄmu dokumentÄcijÄ un tiek tulkots dažÄdos veidos, tÄpÄc sapratnes labad atļauÅ”os
neliela izglÄ«tÄ«bas programmaLED draiveris bÅ«tÄ«bÄ ir maiÅu reÄ£istrs. "MaiÅa" (maiÅa) nosaukumÄ - datu kustÄ«ba pa bitiem ierÄ«ces iekÅ”ienÄ: katrs jauns iekÅ”Ä ievietots bits nospiež visu Ä·Ädi uz priekÅ”u. TÄ kÄ maiÅas laikÄ neviens nevÄlas novÄrot haotisku gaismas diožu mirgoÅ”anu, process notiek buferreÄ£istros, kas no darba reÄ£istriem atdalÄ«ti ar slÄpÄtÄju (aizÅ”aujamais) ir sava veida uzgaidÄmÄ telpa, kurÄ biti ir sakÄrtoti vÄlamajÄ secÄ«bÄ. Kad viss ir gatavs, aizvars atveras un uzgaļi dodas uz darbu, nomainot iepriekÅ”Äjo partiju. VÄrds aizÅ”aujamais mikroshÄmu dokumentÄcijÄ gandrÄ«z vienmÄr nozÄ«mÄ Å”Ädu slÄpÄtÄju neatkarÄ«gi no tÄ, kÄdÄs kombinÄcijÄs tas tiek izmantots.
TÄtad datu pÄrsÅ«tÄ«Å”ana uz DM634 tiek veikta Å”Ädi: iestatiet DAI ievadi uz tÄlÄs gaismas diodes nozÄ«mÄ«gÄkÄ bita vÄrtÄ«bu, velciet DCK uz augÅ”u un uz leju; iestatiet DAI ievadi uz nÄkamÄ bita vÄrtÄ«bu, velciet DCK; un tÄ tÄlÄk, lÄ«dz visi biti ir pÄrsÅ«tÄ«ti (iegriezies), pÄc kura velkam LAT. To var izdarÄ«t manuÄli (bit-sprÄdziens), taÄu labÄk ir izmantot Ä«paÅ”i Å”im nolÅ«kam pielÄgotu SPI interfeisu, jo tas ir pieejams mÅ«su STM32 divos eksemplÄros.
ZilÄ tablete STM32F103
Ievads: STM32 kontrolieri ir daudz sarežģītÄki nekÄ Atmega328, nekÄ varÄtu Ŕķist biedÄjoÅ”i. TurklÄt enerÄ£ijas taupÄ«Å”anas nolÅ«kos gandrÄ«z visas perifÄrijas ierÄ«ces sÄkumÄ tiek izslÄgtas, un pulksteÅa frekvence ir 8 MHz no iekÅ”ÄjÄ avota. Par laimi, STM programmÄtÄji uzrakstÄ«ja kodu, kas nodroÅ”ina mikroshÄmu lÄ«dz āaprÄÄ·inÄtajamā 72 MHz, un visu man zinÄmo IDE autori to iekļÄva inicializÄcijas procedÅ«rÄ, tÄpÄc mums nav nepiecieÅ”ams pulkstenis (bet jÅ«s varat, ja jÅ«s patieÅ”Äm vÄlaties). Bet jums bÅ«s jÄieslÄdz perifÄrijas ierÄ«ces.
DokumentÄcija: Blue Pill ir aprÄ«kota ar populÄro STM32F103C8T6 mikroshÄmu, tam ir divi noderÄ«gi dokumenti:
Datu lapa mikrokontrolleriem STM32F103x8 un STM32F103xB;
Memory Map ā atmiÅas karte konkrÄtai mikroshÄmai. UzziÅu rokasgrÄmatÄ ir karte visai lÄ«nijai, un tajÄ ir minÄti reÄ£istri, kuru mÅ«su rÄ«cÄ«bÄ nav.
Pin Definition tabula ā uzskaita tapu galvenÄs un alternatÄ«vÄs funkcijas; āzilajai tableteiā internetÄ var atrast ÄrtÄkus attÄlus ar tapu sarakstu un to funkcijÄm. TÄpÄc mÄs nekavÄjoties googlÄ Blue Pill pinout un paturam Å”o attÄlu pie rokas:
NB: bildÄ no interneta bija kļūda, kas tika atzÄ«mÄta komentÄros, paldies par to. Bilde ir nomainÄ«ta, bet Ŕī ir mÄcÄ«ba - labÄk pÄrbaudÄ«t informÄciju nevis no datu lapÄm.
MÄs noÅemam datu lapu, atveram uzziÅu rokasgrÄmatu un turpmÄk izmantojam tikai to.
ProcedÅ«ra: nodarbojamies ar standarta ievadi/izvadi, konfigurÄjam SPI, ieslÄdzam nepiecieÅ”amÄs perifÄrijas ierÄ«ces.
Ieejas izejas
Atmega328 I/O ir ieviests ÄrkÄrtÄ«gi vienkÄrÅ”i, tÄpÄc STM32 iespÄju pÄrpilnÄ«ba var radÄ«t neskaidrÄ«bas. Tagad mums ir vajadzÄ«gi tikai secinÄjumi, bet pat tiem ir Äetras iespÄjas:
"Vilkt stumt" (stumt vilkt) ir parasta Arduino izvade, tapa var iegÅ«t vÄrtÄ«bu HIGH vai LOW. Bet ar "atvÄrto noteku" ir grÅ«tÄ«bas, lai gan patiesÄ«bÄ Å”eit viss ir vienkÄrÅ”i:
Visas atŔķirÄ«bas starp atvÄrtu kanalizÄciju (atvÄrta kanalizÄcija) no āpush-pullā (stumt vilkt) ir tas, ka pirmajÄ tapÄ nevar pieÅemt HIGH stÄvokli: ierakstot to izvades reÄ£istrÄ, tas pÄriet augstas pretestÄ«bas režīmÄ (augstas pretestÄ«bas, Sveiks-Z). Ierakstot nulli, tapa uzvedas vienÄdi abos režīmos gan loÄ£iski, gan elektriski.
ParastÄ izvades režīmÄ tapa vienkÄrÅ”i pÄrraida izvades reÄ£istra saturu. "AlternatÄ«vÄ" to kontrolÄ attiecÄ«gÄs perifÄrijas ierÄ«ces (sk. 9.1.4):
Ja porta bits ir konfigurÄts kÄ alternatÄ«vas funkcijas tapa, tapu reÄ£istrs ir atspÄjots un tapa ir savienota ar perifÄrijas tapu.
Katra tapa alternatÄ«va funkcionalitÄte ir aprakstÄ«ta PIN definÄ«cijas Datu lapa atrodas uz lejupielÄdÄtÄ attÄla. Uz jautÄjumu, ko darÄ«t, ja tapai ir vairÄkas alternatÄ«vas funkcijas, atbildi sniedz zemsvÄ«tras piezÄ«me datu lapÄ:
Ja vairÄkas perifÄrijas ierÄ«ces izmanto vienu tapu, lai izvairÄ«tos no konflikta starp alternatÄ«vÄm funkcijÄm, vienlaikus jÄizmanto tikai viena perifÄrijas ierÄ«ce, kas tiek pÄrslÄgta, izmantojot perifÄrijas pulksteÅa iespÄjoÅ”anas bitu (attiecÄ«gajÄ RCC reÄ£istrÄ).
Visbeidzot, tapÄm izvades režīmÄ ir arÄ« pulksteÅa Ätrums. Å Ä« ir vÄl viena enerÄ£ijas taupÄ«Å”anas funkcija; mÅ«su gadÄ«jumÄ mÄs to vienkÄrÅ”i iestatÄm uz maksimumu un aizmirstam.
TÄtad: mÄs izmantojam SPI, kas nozÄ«mÄ, ka diviem kontaktiem (ar datiem un ar pulksteÅa signÄlu) jÄbÅ«t "alternatÄ«vai push-pull funkcijai", bet vÄl vienam (LAT) jÄbÅ«t "parastam push-pull". Bet pirms to pieŔķirÅ”anas, tiksim galÄ ar SPI.
SPI
VÄl viena neliela izglÄ«tÄ«bas programma
SPI jeb Serial Peripheral Interface (serial peripheral Interface) ir vienkÄrÅ”s un ļoti efektÄ«vs interfeiss MK savienoÅ”anai ar citiem MK un Ärpasauli kopumÄ. TÄs darbÄ«bas princips jau ir aprakstÄ«ts iepriekÅ”, kur par Ä·Ä«nieÅ”u LED draiveri (atsauces rokasgrÄmatÄ skatiet 25. sadaļu). SPI var darboties galvenÄ (āmasterā) un slave (āslaveā) režīmÄ. SPI ir Äetri pamata kanÄli, no kuriem ne visus var izmantot:
MOSI, galvenÄ izeja / vergu ieeja: Ŕī tapa pÄrsÅ«ta datus galvenajÄ režīmÄ un saÅem datus pakÄrtotÄ režīmÄ;
MISO, galvenÄ ieeja / vergu izeja: gluži pretÄji, tas saÅem galvenajÄ un pÄrraida vergu;
SCK, Serial Clock: iestata datu pÄrraides frekvenci galvenajÄ ierÄ«cÄ vai saÅem pulksteÅa signÄlu slave. BÅ«tÄ«bÄ sitienu sitieni;
SS, Slave Select: ar Ŕī kanÄla palÄ«dzÄ«bu vergs zina, ka no viÅa kaut ko vÄlas. Uz STM32 to sauc par NSS, kur N = negatÄ«vs, t.i. kontrolieris kļūst par vergu, ja Å”ajÄ kanÄlÄ ir zemÄjums. Tas labi apvienojas ar Open Drain Output režīmu, taÄu tas ir cits stÄsts.
TÄpat kÄ viss pÄrÄjais, SPI STM32 ir bagÄta ar funkcionalitÄti, kas padara to nedaudz grÅ«ti saprotamu. PiemÄram, tas var strÄdÄt ne tikai ar SPI, bet arÄ« ar I2S interfeisu, un dokumentÄcijÄ to apraksti ir sajaukti, ir nepiecieÅ”ams savlaicÄ«gi nogriezt lieko. MÅ«su uzdevums ir ÄrkÄrtÄ«gi vienkÄrÅ”s: mums vienkÄrÅ”i jÄnosÅ«ta dati, izmantojot tikai MOSI un SCK. MÄs pÄrejam uz sadaļu 25.3.4 (pusdupleksÄ komunikÄcija, pusdupleksÄ komunikÄcija), kur atrodam 1 pulkstenis un 1 vienvirziena datu vads (1 pulksteÅa signÄls un 1 vienvirziena datu straume):
Å ajÄ režīmÄ lietojumprogramma izmanto SPI tikai pÄrraides vai tikai saÅemÅ”anas režīmÄ. / Tikai pÄrraides režīms ir lÄ«dzÄ«gs dupleksajam režīmam: dati tiek pÄrsÅ«tÄ«ti uz pÄrraides tapu (MOSI galvenajÄ režīmÄ vai MISO pakÄrtotÄ režīmÄ), un saÅemÅ”anas tapu (attiecÄ«gi MISO vai MOSI) var izmantot kÄ parasto I/O tapu. . Å ajÄ gadÄ«jumÄ lietojumprogrammai ir tikai jÄignorÄ Rx buferis (ja tas tiek nolasÄ«ts, tur netiks pÄrsÅ«tÄ«ti dati).
Lieliski, MISO pin ir brÄ«vs, pievienosim tam LAT signÄlu. ApskatÄ«sim Slave Select, kuru uz STM32 var vadÄ«t programmatiski, kas ir ÄrkÄrtÄ«gi Ärti. TÄda paÅ”a nosaukuma rindkopu lasÄm sadaÄ¼Ä 25.3.1 SPI VispÄrÄ«gs apraksts:
Atveriet sadaļu 25.3.3 ar paÅ”saprotamu nosaukumu āSPI konfigurÄÅ”ana galvenajÄ režīmÄā:
1. SPI_CR2 reÄ£istrÄ iestatiet sÄrijas pulksteÅa frekvenci ar bitiem BR[0:1].
ReÄ£istri ir apkopoti tÄda paÅ”a nosaukuma uzziÅu rokasgrÄmatas sadaļÄ. Adreses maiÅa (Adreses nobÄ«de) CR1 ā 0x00, pÄc noklusÄjuma visi biti ir notÄ«rÄ«ti (AtiestatÄ«t vÄrtÄ«bu 0x0000):
BR biti iestata kontroliera pulksteÅa dalÄ«tÄju, tÄdÄjÄdi nosakot frekvenci, kÄdÄ SPI darbosies. MÅ«su STM32 frekvence bÅ«s 72 MHz, LED draiveris saskaÅÄ ar tÄ datu lapu darbojas ar frekvenci lÄ«dz 25 MHz, tÄpÄc jÄdala ar Äetri (BR[2:0] = 001).
2. Iestatiet CPOL un CPHA bitus, lai definÄtu saistÄ«bu starp datu pÄrsÅ«tÄ«Å”anu un sÄrijas pulksteÅa laiku (skatiet diagrammu 240. lpp.)
TÄ kÄ mÄs Å”eit lasÄm datu lapu, nevis skatÄmies shÄmas, sÄ«kÄk apskatÄ«sim CPOL un CPHA bitu teksta aprakstu 704. lappusÄ (SPI vispÄrÄ«gais apraksts):
PulksteÅa fÄze un polaritÄte
Izmantojot SPI_CR1 reÄ£istra CPOL un CPHA bitus, varat programmatiski atlasÄ«t Äetras laika attiecÄ«bas. CPOL (pulksteÅa polaritÄtes) bits kontrolÄ pulksteÅa signÄla stÄvokli, kad netiek pÄrsÅ«tÄ«ti dati. Å is bits kontrolÄ galveno un pakÄrtoto režīmu. Ja CPOL ir atiestatÄ«ts, atpÅ«tas režīmÄ SCK tapa ir zema. Ja ir iestatÄ«ts CPOL bits, atpÅ«tas režīma laikÄ SCK tapa ir augsta.
Kad ir iestatÄ«ts CPHA (pulksteÅa fÄzes) bits, augstais bitu slazds ir SCK signÄla otrÄ mala (krÄ«t, ja CPOL ir skaidrs, palielinÄs, ja ir iestatÄ«ts CPOL). Dati tiek uztverti ar otro pulksteÅa signÄla izmaiÅu. Ja CPHA bits ir tÄ«rs, augstais bitu slazds ir SCK signÄla augoÅ”Ä mala (krÄ«toÅ”Ä mala, ja ir iestatÄ«ta CPOL, augoÅ”Ä mala, ja CPOL ir notÄ«rÄ«ta). Dati tiek uztverti pie pirmÄs pulksteÅa signÄla maiÅas.
ApgÅ«stot Ŕīs zinÄÅ”anas, mÄs nonÄkam pie secinÄjuma, ka abiem bitiem jÄpaliek nullÄm, jo MÄs vÄlamies, lai SCK signÄls paliktu zems, kad tas netiek izmantots, un dati tiktu pÄrraidÄ«ti uz impulsa pieaugoÅ”Äs malas (sk. Rising Edge DM634 datu lapÄ).
Starp citu, Å”eit mÄs pirmo reizi saskÄrÄmies ar vÄrdu krÄjuma iezÄ«mi ST datu lapÄs: tajÄs ir rakstÄ«ta frÄze āatiestatÄ«t bitu uz nulliā. lai mazliet atiestatÄ«tuUn ne lai mazliet notÄ«rÄ«tu, piemÄram, Atmega.
3. Iestatiet DFF bitu, lai noteiktu, vai datu bloks ir 8 bitu vai 16 bitu formÄtÄ
Es Ä«paÅ”i paÅÄmu 16 bitu DM634, lai netraucÄtu pÄrsÅ«tÄ«t 12 bitu PWM datus, piemÄram, DM633. Ir lietderÄ«gi iestatÄ«t DFF uz vienu:
4. KonfigurÄjiet LSBFIRST bitu SPI_CR1 reÄ£istrÄ, lai noteiktu bloka formÄtu
LSBFIRST, kÄ norÄda nosaukums, vispirms konfigurÄ pÄrraidi ar vismazÄko bitu. Bet DM634 vÄlas saÅemt datus, sÄkot no visnozÄ«mÄ«gÄkÄ bita. TÄpÄc mÄs atstÄjam to atiestatÄ«t.
5. AparatÅ«ras režīmÄ, ja ir nepiecieÅ”ama ievade no NSS kontakta, visas baitu pÄrsÅ«tÄ«Å”anas secÄ«bas laikÄ uz NSS kontakta ievadiet augstu signÄlu. NSS programmatÅ«ras režīmÄ iestatiet SSM un SSI bitus SPI_CR1 reÄ£istrÄ. Ja NSS tapu izmanto kÄ izvadi, ir jÄiestata tikai SSOE bits.
InstalÄjiet SSM un SSI, lai aizmirstu par NSS aparatÅ«ras režīmu:
#define SSI 0x0100
#define SSM 0x0200
_SPI2_ (_SPI_CR1) |= SSM | SSI; //enable software control of SS, SS high
6. MSTR un SPE biti ir jÄiestata (tie paliek iestatÄ«ti tikai tad, ja NSS signÄls ir augsts)
Faktiski ar Å”iem bitiem mÄs apzÄ«mÄjam savu SPI kÄ galveno un ieslÄdzam to:
SPI ir konfigurÄts, uzreiz rakstÄ«sim funkcijas, kas sÅ«ta baitus draiverim. TurpinÄt lasÄ«t 25.3.3 āSPI konfigurÄÅ”ana galvenajÄ režīmÄā:
Datu pÄrsÅ«tÄ«Å”anas pasÅ«tÄ«jums
PÄrsÅ«tÄ«Å”ana sÄkas, kad baits tiek ierakstÄ«ts Tx buferÄ«.
Datu baits tiek ielÄdÄts maiÅu reÄ£istrÄ plkst paralÄli režīmÄ (no iekÅ”ÄjÄs kopnes) pirmÄ bita pÄrraides laikÄ, pÄc kura tas tiek pÄrsÅ«tÄ«ts uz secÄ«gi MOSI tapas režīms, pirmais vai pÄdÄjais bits uz priekÅ”u atkarÄ«bÄ no LSBFIRST bita iestatÄ«juma CPI_CR1 reÄ£istrÄ. TXE karodziÅÅ” tiek iestatÄ«ts pÄc datu pÄrraides no Tx bufera uz maiÅu reÄ£istru, kÄ arÄ« Ä£enerÄ pÄrtraukumu, ja ir iestatÄ«ts TXEIE bits CPI_CR1 reÄ£istrÄ.
Es izcÄlu dažus vÄrdus tulkojumÄ, lai pievÄrstu uzmanÄ«bu vienai SPI ievieÅ”anas iezÄ«mei STM kontrolleros. Uz Atmega TXE karogs (Tx tukÅ”s, Tx ir tukÅ”s un gatavs datu saÅemÅ”anai) tiek iestatÄ«ts tikai pÄc visa baita nosÅ«tÄ«Å”anas uz Äru. Un Å”eit Å”is karogs tiek iestatÄ«ts pÄc tam, kad baits ir ievietots iekÅ”ÄjÄ maiÅu reÄ£istrÄ. TÄ kÄ tas tiek virzÄ«ts tur ar visiem bitiem vienlaikus (paralÄli), un pÄc tam dati tiek pÄrsÅ«tÄ«ti secÄ«gi, TXE tiek iestatÄ«ts pirms baita pilnÄ«gas nosÅ«tÄ«Å”anas. Tas ir svarÄ«gi, jo mÅ«su LED draivera gadÄ«jumÄ pÄc nosÅ«tÄ«Å”anas mums ir jÄizvelk LAT tapa viss datus, t.i. Ar TXE karogu vien mums nepietiks.
Tas nozÄ«mÄ, ka mums ir vajadzÄ«gs cits karogs. ApskatÄ«sim 25.3.7. ā āStatusa karogiā:
<ā¦>
AIZÅemts karogs
BSY karogu iestata un notÄ«ra aparatÅ«ra (rakstÄ«Å”anai tajÄ nav nekÄdas ietekmes). BSY karodziÅÅ” norÄda SPI komunikÄcijas slÄÅa stÄvokli.
Tas tiek atiestatīts:
kad pÄrsÅ«tÄ«Å”ana ir pabeigta (izÅemot galvenajÄ režīmÄ, ja pÄrsÅ«tÄ«Å”ana ir nepÄrtraukta)
kad SPI ir atspÄjots
kad rodas galvenÄ režīma kļūda (MODF=1)
Ja pÄrsÅ«tÄ«Å”ana nav nepÄrtraukta, BSY karodziÅÅ” tiek notÄ«rÄ«ts starp katru datu pÄrsÅ«tÄ«Å”anu
Labi, tas noderÄs. Noskaidrosim, kur atrodas Tx buferis. Lai to izdarÄ«tu, izlasiet āSPI datu reÄ£istrsā:
Biti 15:0 DR[15:0] Datu reģistrs
SaÅemtie vai pÄrsÅ«tÄmie dati.
Datu reÄ£istrs ir sadalÄ«ts divos buferos - viens rakstÄ«Å”anai (pÄrsÅ«tÄ«Å”anas buferis) un viens lasÄ«Å”anai (saÅemÅ”anas buferis). Ierakstot datu reÄ£istrÄ, tiek ierakstÄ«ts Tx buferis, un nolasot no datu reÄ£istra, tiks atgriezta vÄrtÄ«ba, kas atrodas Rx buferÄ«.
Un statusa reÄ£istrs, kurÄ ir atrodami karogi TXE un BSY:
TÄ kÄ mums ir jÄpÄrraida 16 reizes divi baiti, atkarÄ«bÄ no LED draivera izvadu skaita, apmÄram Å”Ädi:
void sendLEDdata()
{
LAT_low();
uint8_t k = 16;
do
{ k--;
dm_shift16(leds[k]);
} while (k);
while (_SPI2_(_SPI_SR) & BSY); // finish transmission
LAT_pulse();
}
TaÄu mÄs vÄl nezinÄm, kÄ izvilkt LAT tapu, tÄpÄc atgriezÄ«simies pie I/O.
Piespraudes pieŔķirŔana
STM32F1 reÄ£istri, kas ir atbildÄ«gi par tapu stÄvokli, ir diezgan neparasti. Skaidrs, ka to ir vairÄk nekÄ Atmega, taÄu tie arÄ« atŔķiras no citiem STM Äipiem. 9.1. sadaļa GPIO vispÄrÄ«gs apraksts:
Katrs no vispÄrÄjas nozÄ«mes I/O portiem (GPIO) ir divi 32 bitu konfigurÄcijas reÄ£istri (GPIOx_CRL un GPIOx_CRH), divi 32 bitu datu reÄ£istri (GPIOx_IDR un GPIOx_ODR), 32 bitu iestatÄ«Å”anas/atiestatÄ«Å”anas reÄ£istrs (GPIOx_BSRR), 16 bitu atiestatÄ«Å”anas reÄ£istrs (GPIOx_BRR) un 32 bitu reÄ£istrs. bitu bloÄ·ÄÅ”anas reÄ£istrs (GPIOx_LCKR).
Pirmie divi reÄ£istri ir neparasti un arÄ« diezgan neÄrti, jo 16 portu tapas ir izkaisÄ«tas pa tiem formÄtÄ āÄetri biti uz brÄliā. Tie. tapas no nulles lÄ«dz septiÅÄm ir CRL, bet pÄrÄjÄs ir CRH. TajÄ paÅ”Ä laikÄ atlikuÅ”ajos reÄ£istros veiksmÄ«gi ir visu porta tapu biti - bieži vien paliek puse ārezervÄtaā.
VienkÄrŔības labad sÄksim no saraksta beigÄm.
Mums nav nepiecieÅ”ams bloÄ·ÄÅ”anas reÄ£istrs.
IestatÄ«Å”anas un atiestatÄ«Å”anas reÄ£istri ir diezgan smieklÄ«gi ar to, ka tie daļÄji dublÄ viens otru: visu var rakstÄ«t tikai BSRR, kur augstÄkie 16 biti atiestatÄ«s tapu uz nulli, bet zemÄkie tiks iestatÄ«ti uz 1, vai arÄ« jÅ«s varat arÄ« izmantojiet BRR, kura apakÅ”Äjie 16 biti atiestata tikai tapu . Man patÄ«k otrais variants. Å ie reÄ£istri ir svarÄ«gi, jo tie nodroÅ”ina atomu piekļuvi tapÄm:
Atomu iestatīŔana vai atiestatīŔana
ProgrammÄjot GPIOx_ODR bitu lÄ«menÄ«, pÄrtraukumi nav jÄatspÄjo: vienu vai vairÄkus bitus var mainÄ«t ar vienu atomu rakstÄ«Å”anas operÄciju APB2. To panÄk, mainÄmÄ bita iestatÄ«Å”anas/atiestatÄ«Å”anas reÄ£istrÄ (GPIOx_BSRR vai, tikai atiestatÄ«Å”anai, GPIOx_BRR), ierakstot "1". Citi biti paliks nemainÄ«gi.
Datu reÄ£istriem ir diezgan paÅ”saprotami nosaukumi - IDR = ievade Virzienu reÄ£istrs, ievades reÄ£istrs; ODR = izvade Virzienu reÄ£istrs, izvades reÄ£istrs. PaÅ”reizÄjÄ projektÄ tie mums nebÅ«s vajadzÄ«gi.
Un visbeidzot, kontroles reÄ£istri. TÄ kÄ mÅ«s interesÄ otrie SPI tapas, proti, PB13, PB14 un PB15, mÄs nekavÄjoties skatÄmies uz CRH:
Un mÄs redzam, ka mums bÅ«s kaut kas jÄraksta bitos no 20 lÄ«dz 31.
MÄs jau iepriekÅ” esam izdomÄjuÅ”i, ko mÄs vÄlamies no tapÄm, tÄpÄc Å”eit es iztikÅ”u bez ekrÄnuzÅÄmuma, teikÅ”u tikai to, ka MODE norÄda virzienu (ievade, ja abi biti ir iestatÄ«ti uz 0) un tapas Ätrumu (mums vajag 50MHz, t.i. abas tapas uz ā1ā), un CNF iestata režīmu: parastais āpush-pullā ā 00, āalternatÄ«vaisā ā 10. PÄc noklusÄjuma, kÄ redzams iepriekÅ”, visÄm tapÄm ir treÅ”ais bits no apakÅ”as (CNF0), tas iestata tos režīmÄ peldoÅ”Ä ievade.
TÄ kÄ es plÄnoju ar Å”o mikroshÄmu darÄ«t kaut ko citu, vienkÄrŔības labad esmu definÄjis visas iespÄjamÄs MODE un CNF vÄrtÄ«bas gan apakÅ”Äjam, gan augÅ”Äjam vadÄ«bas reÄ£istram.
(LAT_zems tikai pÄc inerces, tÄ vienmÄr ir bijis, lai paliek)
Tagad viss ir lieliski, bet tas nedarbojas. TÄ kÄ Å”is ir STM32, tie ietaupa elektroenerÄ£iju, kas nozÄ«mÄ, ka jums ir jÄiespÄjo nepiecieÅ”amo perifÄrijas ierÄ«Äu pulksteÅa funkcija.
IeslÄdziet pulksteni
Pulkstenis, kas pazÄ«stams arÄ« kÄ pulkstenis, ir atbildÄ«gs par pulksteni. Un jau varÄjÄm pamanÄ«t saÄ«sinÄjumu RCC. MÄs to meklÄjam dokumentÄcijÄ: Ŕī ir Reset un Clock Control.
KÄ jau minÄts iepriekÅ”, par laimi, visgrÅ«tÄko pulksteÅa tÄmas daļu mums veica cilvÄki no STM, par ko mÄs viÅiem ļoti pateicamies (vÄlreiz iedoÅ”u saiti uz Di Halta vietne, lai bÅ«tu skaidrs, cik tas ir mulsinoÅ”i). Mums ir nepiecieÅ”ami tikai reÄ£istri, kas ir atbildÄ«gi par perifÄrijas pulksteÅa iespÄjoÅ”anu (Peripheral Clock Enable Registers). PirmkÄrt, atradÄ«sim RCC bÄzes adresi, tÄ atrodas āMemory Mapā paÅ”Ä sÄkumÄ:
Un tad vai nu noklikŔķiniet uz saites, kur mÄÄ£inÄt kaut ko atrast plÄksnÄ, vai, daudz labÄk, izlasiet iespÄjojoÅ”o reÄ£istru aprakstus no sadaļÄm par iespÄjot reÄ£istrus. Kur mÄs atradÄ«sim RCC_APB1ENR un RCC_APB2ENR:
Un attiecīgi tajos ir biti, kas ietver SPI2, IOPB (I/O ports B) un alternatīvo funkciju (AFIO) taktiku.
Ja ir iespÄja un vÄlme pÄrbaudÄ«t, tad pieslÄdz DM634 Å”Ädi: DAI pie PB15, DCK uz PB13, LAT pie PB14. MÄs barojam draiveri no 5 voltiem, neaizmirstiet pieslÄgt zemÄjumu.
STM8 PWM
PWM uz STM8
Kad es tikai plÄnoju Å”o rakstu, es nolÄmu, piemÄram, mÄÄ£inÄt apgÅ«t kÄdu nepazÄ«stama mikroshÄmas funkcionalitÄti, izmantojot tikai datu lapu, lai es netiktu pie kurpnieka bez zÄbakiem. STM8 bija ideÄli piemÄrots Å”ai lomai: pirmkÄrt, man bija pÄris Ä·Ä«nieÅ”u dÄļi ar STM8S103, otrkÄrt, tas nav Ä«paÅ”i populÄrs, un tÄpÄc kÄrdinÄjums lasÄ«t un atrast risinÄjumu internetÄ balstÄs tieÅ”i uz Å”o risinÄjumu trÅ«kumu.
PÄc noklusÄjuma STM8 darbojas ar 2 MHz frekvenci, tas nekavÄjoties jÄlabo.
HSI (Ätrgaitas iekÅ”Äjais) pulkstenis
HSI pulksteÅa signÄls tiek iegÅ«ts no iekÅ”Äja 16 MHz RC oscilatora ar programmÄjamu dalÄ«tÄju (no 1 lÄ«dz 8). Tas ir iestatÄ«ts pulksteÅa dalÄ«tÄju reÄ£istrÄ (CLK_CKDIVR).
PiezÄ«me: sÄkumÄ HSI RC oscilators ar dalÄ«tÄju 8 tiek izvÄlÄts kÄ galvenais pulksteÅa signÄla avots.
Datu lapÄ atrodam reÄ£istra adresi, refman aprakstu un redzam, ka reÄ£istrs ir jÄdzÄÅ”:
TÄ kÄ mÄs palaidÄ«sim PWM un pievienosim gaismas diodes, apskatÄ«sim kontaktdakÅ”u:
MikroshÄma ir maza, daudzas funkcijas ir apturÄtas uz tÄm paÅ”Äm tapÄm. Tas, kas ir kvadrÄtiekavÄs, ir āalternatÄ«va funkcionalitÄteā, to pÄrslÄdz āopciju baitiā (opciju baiti) ā kaut kas lÄ«dzÄ«gs Atmega droÅ”inÄtÄjiem. JÅ«s varat mainÄ«t to vÄrtÄ«bas programmÄtiski, bet tas nav nepiecieÅ”ams, jo JaunÄ funkcionalitÄte tiek aktivizÄta tikai pÄc pÄrstartÄÅ”anas. VienkÄrÅ”Äk ir izmantot ST Visual Programmer (lejupielÄdÄts kopÄ ar Visual Develop), kas var mainÄ«t Å”os baitus. Spraude parÄda, ka pirmÄ taimera CH1 un CH2 tapas ir paslÄptas kvadrÄtiekavÄs; STVP ir jÄiestata AFR1 un AFR0 biti, un otrs pÄrsÅ«tÄ«s arÄ« otrÄ taimera CH1 izvadi no PD4 uz PC5.
TÄdÄjÄdi gaismas diodes vadÄ«s 6 tapas: PC6, PC7 un PC3 pirmajam taimeram, PC5, PD3 un PA3 otrajam.
PaÅ”u I/O tapu iestatÄ«Å”ana STM8 ir vienkÄrÅ”Äka un loÄ£iskÄka nekÄ STM32:
pazīstams no Atmega DDR datu virzienu reģistra (Datu virzienu reģistrs): 1 = izvade;
pirmais vadÄ«bas reÄ£istrs CR1, kad tas tiek izvadÄ«ts, iestata push-pull režīmu (1) vai atvÄrtu aizplÅ«Å”anu (0); tÄ kÄ gaismas diodes pievienoju mikroshÄmai ar katodiem, tad Å”eit atstÄju nulles;
PWM frekvence ā biežums, ar kÄdu taimeris tikŔķ;
AutomÄtiskÄ pÄrlÄdÄÅ”ana, AR ā automÄtiski ielÄdÄjamÄ vÄrtÄ«ba, lÄ«dz kurai taimeris skaitÄ«s (impulsa periods);
AtjauninÄt notikumu, UEV ā notikums, kas notiek, kad taimeris ir ieskaitÄ«jis AR;
PWM darba cikls ā PWM darba cikls, ko bieži sauc par ādarba koeficientuā;
UzÅemiet/salÄ«dziniet vÄrtÄ«bu ā uztverÅ”anas/salÄ«dzinÄÅ”anas vÄrtÄ«ba, lÄ«dz kurai taimeris ir ieskaitÄ«jies kaut ko darÄ«s (PWM gadÄ«jumÄ tas invertÄ izejas signÄlu);
IepriekÅ”Äjas ielÄdes vÄrtÄ«ba ā iepriekÅ” ielÄdÄta vÄrtÄ«ba. SalÄ«dziniet vÄrtÄ«bu nevar mainÄ«ties, kamÄr taimeris tikŔķ, pretÄjÄ gadÄ«jumÄ PWM cikls pÄrtrÅ«ks. TÄpÄc jaunas pÄrraidÄ«tÄs vÄrtÄ«bas tiek ievietotas buferÄ« un izvilktas, kad taimeris sasniedz atpakaļskaitÄ«Å”anas beigas un tiek atiestatÄ«ts;
IzlÄ«dzinÄts ar malu Šø CentrÄ izlÄ«dzinÄtie režīmi ā izlÄ«dzinÄjums gar robežu un centrÄ, tÄds pats kÄ Atmel Ätra PWM Šø FÄzei pareizs PWM.
OCiREF, izvades salÄ«dzinÄÅ”anas atsauces signÄls ā atskaites izejas signÄls, faktiski tas, kas parÄdÄs uz atbilstoÅ”Äs tapas PWM režīmÄ.
KÄ jau redzams no pinout, diviem taimeriem ir PWM iespÄjas ā pirmajam un otrajam. Abi ir 16 bitu, pirmajam ir daudz papildu funkciju (jo Ä«paÅ”i tas var skaitÄ«t gan uz augÅ”u, gan uz leju). Mums abiem jÄstrÄdÄ vienÄdi, tÄpÄc nolÄmu sÄkt ar acÄ«mredzami nabadzÄ«gÄko otro, lai nejauÅ”i neizmantotu kaut ko, kas tur nav. ProblÄma ir tÄda, ka visu taimeru PWM funkcionalitÄtes apraksts atsauces rokasgrÄmatÄ ir sadaÄ¼Ä par pirmo taimeri (17.5.7 PWM režīms), tÄpÄc jums visu laiku ir jÄlÄkÄ uz priekÅ”u un atpakaļ visÄ dokumentÄ.
PWM uz STM8 ir svarÄ«ga priekÅ”rocÄ«ba salÄ«dzinÄjumÄ ar PWM uz Atmega:
Robežas lÄ«dzinÄts PWM
Konta konfigurÄcija no apakÅ”as uz augÅ”u
ApakÅ”ÄjÄ skaitÄ«Å”ana ir aktÄ«va, ja DIR bits TIM_CR1 reÄ£istrÄ ir notÄ«rÄ«ts
PiemÄrs
PiemÄrÄ tiek izmantots pirmais PWM režīms. PWM atsauces signÄls OCiREF tiek turÄts augstÄ lÄ«menÄ«, kamÄr TIM1_CNT < TIM1_CCRI. PretÄjÄ gadÄ«jumÄ tas aizÅem zemu lÄ«meni. Ja salÄ«dzinÄjuma vÄrtÄ«ba TIM1_CCRI reÄ£istrÄ ir lielÄka par automÄtiskÄs ielÄdes vÄrtÄ«bu (TIM1_ARR reÄ£istrs), OCiREF signÄls tiek turÄts uz 1. Ja salÄ«dzinÄmÄ vÄrtÄ«ba ir 0, OCiREF tiek turÄts uz nulles....
STM8 taimeris laikÄ atjauninÄÅ”anas pasÄkums vispirms pÄrbauda salÄ«dzinÄt vÄrtÄ«bu, un tikai pÄc tam rada atsauces signÄlu. Atmega taimeris vispirms pieskrÅ«vÄ un pÄc tam salÄ«dzina, kÄ rezultÄtÄ compare value == 0 izeja ir adata, ar kuru kaut kÄ jÄtiek galÄ (piemÄram, programmatiski apgriežot loÄ£iku).
TÄtad, ko mÄs vÄlamies darÄ«t: 8 bitu PWM (AR == 255), skaitot no apakÅ”as uz augÅ”u, lÄ«dzinÄjums gar robežu. TÄ kÄ spuldzes ir savienotas ar mikroshÄmu ar katodiem, PWM vajadzÄtu izvadÄ«t 0 (ieslÄgts LED), lÄ«dz salÄ«dzinÄt vÄrtÄ«bu un 1 pÄc.
110: Pirmais PWM režīms ā skaitot no apakÅ”as uz augÅ”u, pirmais kanÄls ir aktÄ«vs, kamÄr TIMx_CNT < TIMx_CCR1. PretÄjÄ gadÄ«jumÄ pirmais kanÄls ir neaktÄ«vs. [tÄlÄk dokumentÄ ir kļūdaina copy-paste no 1. taimera] 111: Otrais PWM režīms ā skaitot no apakÅ”as uz augÅ”u, pirmais kanÄls ir neaktÄ«vs, kamÄr TIMx_CNT < TIMx_CCR1. PretÄjÄ gadÄ«jumÄ pirmais kanÄls ir aktÄ«vs.
TÄ kÄ gaismas diodes ir savienotas ar MK ar katodiem, mums der otrais režīms (arÄ« pirmais, bet mÄs to vÄl nezinÄm).
3. bits OC1PE: iespÄjot 1. tapas priekÅ”ielÄdÄÅ”anu
0: TIMx_CCR1 priekÅ”ielÄdÄÅ”anas reÄ£istrs ir atspÄjots. JÅ«s varat rakstÄ«t uz TIMx_CCR1 jebkurÄ laikÄ. JaunÄ vÄrtÄ«ba darbojas nekavÄjoties.
1: TIMx_CCR1 priekÅ”ielÄdÄÅ”anas reÄ£istrs ir iespÄjots. LasÄ«Å”anas/rakstÄ«Å”anas operÄcijas piekļūst iepriekÅ”Äjas ielÄdes reÄ£istram. IepriekÅ” ielÄdÄtÄ vÄrtÄ«ba TIMx_CCR1 tiek ielÄdÄta Änu reÄ£istrÄ katra atjauninÄÅ”anas notikuma laikÄ.
*PiezÄ«me. Lai PWM režīms darbotos pareizi, ir jÄiespÄjo priekÅ”ielÄdÄÅ”anas reÄ£istri. Tas nav nepiecieÅ”ams viena signÄla režīmÄ (OPM bits ir iestatÄ«ts TIMx_CR1 reÄ£istrÄ).
Labi, ieslÄdzam visu, kas nepiecieÅ”ams otrÄ taimera trim kanÄliem:
Otrais taimeris var skaitÄ«t tikai no apakÅ”as uz augÅ”u, lÄ«dzinÄjums gar robežu, nekas nav jÄmaina. IestatÄ«sim frekvences dalÄ«tÄju, piemÄram, uz 256. Otrajam taimeram dalÄ«tÄjs ir iestatÄ«ts TIM2_PSCR reÄ£istrÄ un ir divu pakÄpju:
Atliek tikai ieslÄgt secinÄjumus un paÅ”u otro taimeri. Pirmo problÄmu atrisina reÄ£istri UzÅemt/SalÄ«dzinÄt dot iespÄju: pa tiem ir asimetriski izkaisÄ«ti divi, trÄ«s kanÄli. Å eit arÄ« varam uzzinÄt, ka ir iespÄjams mainÄ«t signÄla polaritÄti, t.i. principÄ bija iespÄjams izmantot PWM režīmu 1. MÄs rakstÄm:
UzrakstÄ«sim vienkÄrÅ”u AnalogWrite() analogu, kas salÄ«dzinÄÅ”anai pÄrsÅ«tÄ«s faktiskÄs vÄrtÄ«bas uz taimeri. ReÄ£istri nosaukti paredzami UzÅemt/salÄ«dzinÄt reÄ£istrus, katram kanÄlam ir divi no tiem: zemas kÄrtas 8 biti TIM2_CCRxL un augstÄkÄs kÄrtas TIM2_CCRxH. TÄ kÄ mÄs esam izveidojuÅ”i 8 bitu PWM, pietiek ar to, ka uzrakstiet tikai vismazÄk nozÄ«mÄ«gus bitus:
UzmanÄ«gs lasÄ«tÄjs pamanÄ«s, ka mums ir nedaudz bojÄts PWM, kas nespÄj nodroÅ”inÄt 100% piepildÄ«jumu (maksimÄlajÄ vÄrtÄ«bÄ 255, signÄls tiek apgriezts vienam taimera ciklam). Gaismas diodÄm tas nav svarÄ«gi, un uzmanÄ«gs lasÄ«tÄjs jau var uzminÄt, kÄ to salabot.
PWM uz otrÄ taimera darbojas, pÄriesim pie pirmÄ.
PirmajÄ taimerÄ« ir tieÅ”i tÄdi paÅ”i biti tajos paÅ”os reÄ£istros (tikai tie biti, kas palika ārezervÄtiā otrajÄ taimeri, pirmajÄ tiek aktÄ«vi izmantoti visÄdÄm uzlabotÄm lietÄm). TÄpÄc pietiek datu lapÄ atrast to paÅ”u reÄ£istru adreses un nokopÄt kodu. Nu, mainiet frekvences dalÄ«tÄja vÄrtÄ«bu, jo... pirmais taimeris vÄlas saÅemt nevis divu jaudu, bet precÄ«zu 16 bitu vÄrtÄ«bu divos reÄ£istros Prescaler High Šø Zems. Daram visu un... pirmais taimeris nestrÄdÄ. Kas noticis?
ProblÄmu var atrisinÄt tikai caurskatot visu sadaļu par taimera 1 vadÄ«bas reÄ£istriem, kur meklÄjam to, kura otrajam taimeram nav. Tur bÅ«s 17.7.30 PÄrrÄvuma reÄ£istrs (TIM1_BKR), kur ir Å”is bits:
TreÅ”ais mini projekts ir savienot astoÅas RGB gaismas diodes ar otro taimeri PWM režīmÄ un likt tiem parÄdÄ«t dažÄdas krÄsas. Tas ir balstÄ«ts uz LED multipleksÄÅ”anas koncepciju, proti, ja ļoti, ļoti Ätri ieslÄdzat un izslÄdzat gaismas diodes, mums ŔķitÄ«s, ka tÄs pastÄvÄ«gi deg (redzes noturÄ«ba, vizuÄlÄs uztveres inerce). Es reiz darÄ«ju kaut kas lÄ«dzÄ«gs Å”im vietnÄ Arduino.
Darba algoritms izskatÄs Å”Ädi:
pieslÄdza pirmÄs RGB gaismas diodes anodu;
iedegas to, nosÅ«tot nepiecieÅ”amos signÄlus uz katodiem;
gaidÄ«ja lÄ«dz PWM cikla beigÄm;
pievienoja otrÄs RGB gaismas diodes anodu;
aizdedzies to...
Nu utt. Protams, skaistai darbÄ«bai ir nepiecieÅ”ams pieslÄgt anodu un vienlaikus āaizdegtiesā LED. Nu vai gandrÄ«z. JebkurÄ gadÄ«jumÄ mums ir jÄraksta kods, kas izvadÄ«s vÄrtÄ«bas trÄ«s otrÄ taimera kanÄlos, mainÄ«s tÄs, kad tiek sasniegts UEV, un tajÄ paÅ”Ä laikÄ jÄmaina paÅ”laik aktÄ«vais RGB LED.
TÄ kÄ LED pÄrslÄgÅ”ana ir automÄtiska, mums ir jÄizveido "video atmiÅa", no kuras pÄrtraukumu apstrÄdÄtÄjs saÅems datus. Å is ir vienkÄrÅ”s masÄ«vs:
uint8_t colors[8][3];
Lai mainÄ«tu konkrÄtas gaismas diodes krÄsu, pietiks ar vajadzÄ«gÄs vÄrtÄ«bas ierakstÄ«Å”anu Å”ajÄ masÄ«vÄ. Un mainÄ«gais bÅ«s atbildÄ«gs par aktÄ«vÄs gaismas diodes numuru
uint8_t cnt;
Demux
Pareizai multipleksÄÅ”anai mums, dÄ«vainÄ kÄrtÄ, ir nepiecieÅ”ams CD74HC238 demultiplekseris. Demultiplekseris - mikroshÄma, kas ievieÅ” operatoru aparatÅ«rÄ <<. Caur trim ievades tapÄm (biti 0, 1 un 2) mÄs tam ievadÄm trÄ«s bitu skaitli X, un atbildot tas aktivizÄ izvades numuru (1<<X). AtlikuÅ”Äs mikroshÄmas ievades tiek izmantotas, lai mÄrogotu visu dizainu. Å Ä« mikroshÄma mums ir nepiecieÅ”ama ne tikai, lai samazinÄtu mikrokontrollera aizÅemto tapu skaitu, bet arÄ« droŔībai - lai nejauÅ”i neiedegtu vairÄk gaismas diodes nekÄ iespÄjams un nesadedzinÄtu MK. MikroshÄma maksÄ santÄ«mu, un tÄ vienmÄr jÄglabÄ mÄjas aptieciÅÄ.
MÅ«su CD74HC238 bÅ«s atbildÄ«gs par sprieguma padevi vÄlamÄs gaismas diodes anodam. PilnvÄrtÄ«gÄ multipleksÄ tas pievadÄ«tu spriegumu kolonnai caur P-MOSFET, bet Å”ajÄ demonstrÄcijÄ tas ir iespÄjams tieÅ”i, jo tas patÄrÄ 20 mA, saskaÅÄ ar absolÅ«ti maksimÄlie vÄrtÄjumi datu lapÄ. No Datu lapa CD74HC238 mums ir nepiecieÅ”ami pinouts un Ŕī krÄpÅ”anÄs lapa:
H = augsts sprieguma lÄ«menis, L = zems sprieguma lÄ«menis, X ā vienalga
MÄs savienojam E2 un E1 ar zemi, E3, A0, A1 un A3 ar STM5 tapÄm PD3, PC4, PC5 un PC8. TÄ kÄ augstÄk esoÅ”ajÄ tabulÄ ir gan zems, gan augsts lÄ«menis, mÄs konfigurÄjam Ŕīs tapas kÄ stumÅ”anas tapas.
PWM
PWM otrajÄ taimerÄ« ir konfigurÄts tÄpat kÄ iepriekÅ”ÄjÄ stÄstÄ, ar divÄm atŔķirÄ«bÄm:
PirmkÄrt, mums ir jÄiespÄjo pÄrtraukums AtjauninÄt notikumu (UEV), kas izsauks funkciju, kas pÄrslÄdz aktÄ«vo LED. Tas tiek darÄ«ts, mainot bitu AtjauninÄÅ”anas pÄrtraukuma iespÄjoÅ”ana reÄ£istrÄ ar izteiksmÄ«gu nosaukumu
OtrÄ atŔķirÄ«ba ir saistÄ«ta ar multipleksÄÅ”anas fenomenu, piemÄram, rÄgoÅ”anÄs ā diožu parazitÄrais spÄ«dums. MÅ«su gadÄ«jumÄ tas var parÄdÄ«ties tÄpÄc, ka taimeris, izraisÄ«jis UEV pÄrtraukumu, turpina atzÄ«mÄties, un pÄrtraukumu apstrÄdÄtÄjam nav laika pÄrslÄgt LED, pirms taimeris sÄk kaut ko rakstÄ«t uz tapÄm. Lai to novÄrstu, jums bÅ«s jÄapgriež loÄ£ika (0 = maksimÄlais spilgtums, 255 = nekas nedeg) un jÄizvairÄs no ÄrkÄrtÄjÄm darba cikla vÄrtÄ«bÄm. Tie. nodroÅ”inÄt, lai pÄc UEV gaismas diodes pilnÄ«bÄ nodziest uz vienu PWM ciklu.
Izvairieties no r, g un b iestatīŔanas uz 255 un atcerieties tos apgriezt, kad tos lietojat.
PÄrtrauc
PÄrtraukuma bÅ«tÄ«ba ir tÄda, ka noteiktos apstÄkļos mikroshÄma pÄrtrauc galvenÄs programmas izpildi un izsauc kÄdu ÄrÄju funkciju. PÄrtraukumi rodas ÄrÄjas vai iekÅ”Äjas ietekmes, tostarp taimera, dÄļ.
Kad mÄs pirmo reizi izveidojÄm projektu ST Visual Develop, papildus main.c mÄs saÅÄmÄm logu ar noslÄpumainu failu stm8_interrupt_vector.c, automÄtiski iekļauts projektÄ. Å ajÄ failÄ katram pÄrtraukumam tiek pieŔķirta funkcija NonHandledInterrupt. Mums ir jÄsaista mÅ«su funkcija ar vÄlamo pÄrtraukumu.
Datu lapÄ ir pÄrtraukumu vektoru tabula, kurÄ atrodam vajadzÄ«gos vektorus:
Atliek tikai iespÄjot pÄrtraukumus. Tas tiek darÄ«ts, izmantojot komandu assembler rim - jums tas bÅ«s jÄmeklÄ ProgrammÄÅ”anas rokasgrÄmata:
//enable interrupts
_asm("rim");
VÄl viena montÄtÄja komanda ir sim ā izslÄdz pÄrtraukumus. Tie ir jÄizslÄdz, kamÄr āvideo atmiÅÄā tiek ierakstÄ«tas jaunas vÄrtÄ«bas, lai nepareizÄ brÄ«dÄ« radÄ«ts pÄrtraukums nesabojÄtu masÄ«vu.
Ja vismaz kÄdam Å”is raksts Ŕķiet noderÄ«gs, tad es to nerakstÄ«ju velti. PriecÄÅ”os saÅemt komentÄrus un piezÄ«mes, centÄ«Å”os uz visu atbildÄt.