Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

В Inxalenye yokuqala Ndizamile ukuxelela iinjineli ze-elektroniki zokuzilibazisa ezikhule kwiibhulukhwe ze-Arduino ukuba kutheni kwaye kutheni kufuneka zifunde ii-database kunye namanye amaxwebhu e-microcontrollers. Lo mbhalo waba mkhulu, ngoko ndathembisa ukubonisa imizekelo esebenzisekayo kwinqaku elahlukileyo. Ewe, wazibiza ngokuba ngumlayishi ...

Namhlanje ndiza kukubonisa indlela yokusebenzisa idatadata ukusombulula ngokulula, kodwa imisebenzi eyimfuneko kwiiprojekthi ezininzi kwi-STM32 (iPilisi eBlue) kunye nabalawuli be-STM8. Zonke iiprojekthi zedemo zinikezelwe kwii-LED zam endizithandayo, siya kuzikhanyisela ngobuninzi, apho kuya kufuneka sisebenzise zonke iintlobo zeeperipherals ezinomdla.

Isicatshulwa kwakhona sajika saba sikhulu, ke ukuze kube lula ndenza umxholo:

I-STM32 Ipilisi eluhlaza okwesibhakabhaka: ii-LED ze-16 ezinomqhubi we-DM634
I-STM8: Ukumisela izikhonkwane ze-PWM ezintandathu
I-STM8: Ii-LED ze-8 RGB kwizikhonkwane ezintathu, ziphazamisa

I-Disclaimer: Andiyonjineli, andizenzi ngathi ndinolwazi olunzulu kwi-elektroniki, eli nqaku lenzelwe abantu abangafundanga njengam. Enyanisweni, ndandizithatha kwiminyaka emibini edlulileyo njengabaphulaphuli ekujoliswe kubo. Ukuba umntu wayendixelele ngoko ukuba akuyoyiki ukufunda i-database ye-chip engaqhelekanga, ngekhe ndichithe ixesha elininzi ndikhangela amaqhekeza ekhowudi kwi-Intanethi kwaye ndiqulunqa iintonga ngesikere kunye ne-adhesive plaster.

Ingqwalasela yeli nqaku yi-databases, kungekhona iidrafti, ngoko ke ikhowudi ayinakuphucuka kakhulu kwaye ihlala iyinto yokubambelela. Iiprojekthi ngokwazo zilula kakhulu, nangona zifanelekile ukuba ziqhelane ne-chip entsha.

Ndiyathemba ukuba inqaku lam liya kunceda umntu okwinqanaba elifanayo lokuntywila kwindawo yokuzonwabisa.

I-STM32

Ii-LED ze-16 kunye ne-DM634 kunye ne-SPI

Iprojekthi encinci esebenzisa iBlue Pill (STM32F103C8T6) kunye nomqhubi we-DM634 LED. Ngoncedo lwedatha yedatha, siya kujongana nomqhubi, izibuko ze-STM IO kunye nokuqwalasela i-SPI.

DM634

I-chip yaseTaiwan ene-16 x 16-bit yeziphumo ze-PWM, inokubotshwa. Imodeli encinci ye-12-bit iyaziwa kwiprojekthi yasekhaya ipakethe ukukhanya. Ngesinye isikhathi, ukukhetha phakathi kwe-DM63x kunye ne-TLC5940 eyaziwayo, ndahlala kwi-DM ngezizathu ezininzi: 1) I-TLC kwi-Aliexpress ngokuqinisekileyo iyinkohliso, kodwa le ayikho; 2) I-DM ine-PWM ezimeleyo kunye nejenereyitha yayo; 3) inokuthengwa ngokungabizi eMoscow, kwaye ungalindi ipasile evela ku-Ali. Kwaye, ngokuqinisekileyo, kwakunomdla ukufunda indlela yokulawula i-chip ngokwakho, kwaye ungasebenzisi ilayibrari esele yenziwe. Iichips ngoku zinikezelwa ikakhulu kwiphakheji ye-SSOP24, kulula ukuyithengisa kwi-adapter.

Kuba umenzi yiTaiwanese, ishiti yedatha kwi-chip ibhalwe ngesiTshayina IsiNgesi, oku kuthetha ukuba kuya kuba mnandi. Qala ngokujonga ipinoutPin uxhumano) ukuqonda ukuba ngowuphi umlenze oza kudibanisa ntoni, kunye nenkcazo yezikhonkwane (Inkcazo yePin). 16 izikhonkwane:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Sinki imithombo ye-DC (i drain evulekileyo)

Cofa / Imveliso yokuvula i-drain - isitokhwe; umthombo wangoku ongenayo; isiphumo esiqhagamshelwe kumhlaba kwisimo esisebenzayo - ii-LED zixhunywe kumqhubi ngama-cathodes. Ngombane, oku, ngokuqinisekileyo, akukho "i drain evulekileyo" (idreyini evulekileyo), kodwa kwiinkcukacha zedatha ubizo olunjalo lweziphumo kwimowudi yedreyini ifumaneka rhoqo.

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Izichasi zangaphandle phakathi kwe-REXT kunye ne-GND ukuseta ixabiso langoku lemveliso

I-resistor yereferensi ifakwe phakathi kwepini ye-REXT kunye nomhlaba, olawula ukuchasana kwangaphakathi kweziphumo, jonga igrafu kwiphepha le-9 ledatha. Kwi-DM634, oku kuxhathisa kunokulawulwa ngesoftware ngokuseta ukuqaqamba ngokubanzi (Ukukhanya kwehlabathi); Andiyi kungena kwiinkcukacha kweli nqaku, ndiza kubeka nje i-2.2 - 3 kOhm resistor apha.

Ukuqonda indlela yokulawula i-chip, makhe sijonge inkcazo yojongano lwesixhobo:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Ewe, nantsi, isiNgesi saseTshayina kulo lonke uzuko lwaso. Kuyingxaki ukuguqulela oku, unokuyiqonda ukuba unqwenela, kodwa kukho enye indlela - ukujonga indlela uqhagamshelo lwedatha kwi-TLC5940 esebenzayo ichazwe:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
… Zithathu kuphela izikhonkwane ezifunekayo ukuze ufake idatha kwisixhobo. Umgca wokunyuka wesignali ye-SCLK utshintsha idatha kwi-SIN pin ukuya kwirejista yangaphakathi. Emva kokuba yonke idatha ilayishiwe, isibonakaliso esifutshane se-XLAT esiphezulu sibeka idatha edluliselwe ngokulandelelana kwiirejista zangaphakathi. Iirejista zangaphakathi ngamasango avuselelwe yinqanaba lophawu lwe-XLAT. Yonke idatha ithunyelwa nge-MSB kuqala.

Latch -i-latch / latch / latch.
Ukunyuka edge ngowona mgca uphambili wokubetha kwentliziyo
MSB kuqala – eyona ibaluleke kakhulu (ekhohlo) ukuya phambili.
ukuvala idatha -Thumela idatha ngokulandelelanayo (bit by bit).

Igama iqhina ifumaneka rhoqo kumaxwebhu eetships kwaye iguqulelwe ngeendlela ezahlukeneyo, ngoko ke ukuqonda ndiya kuzivumela

inkqubo encinci yemfundoUmqhubi we-LED ngokuyimfuneko yirejista yokutshintsha. "Shift" (shift) egameni - bit-by-bit intshukumo yedata ngaphakathi kwesixhobo: isuntswana ngalinye elityhidiweyo ngaphakathi lityhala lonke ityathanga phambi kwalo. Kuba akukho mntu ufuna ukujonga ukuqhwanyaza okumangalisayo kwee-LED ngexesha lokutshintsha, inkqubo yenzeka kwiirejista ze-buffer ezahlulwe kubasebenzi ngesivalo (iqhina) luhlobo lwegumbi lokunxiba apho amasuntswana alandelelana ngokulandelelana okufunayo. Xa yonke into ilungile, i-shutter ivula kwaye i-bits iya emsebenzini, ithatha indawo yebhetshi yangaphambili. Ilizwi iqhina kumaxwebhu e-microcircuits phantse ahlala ethetha isidambisi esinjalo, kuyo nayiphi na indibaniselwano esetyenziswayo.

Ngoko ke, ukudluliselwa kwedatha kwi-DM634 kuqhutyelwa ngolu hlobo lulandelayo: setha igalelo le-DAI kwixabiso le-bit ephezulu ye-LED ekude, tsala i-DCK phezulu naphantsi; seta igalelo le-DAI kwixabiso lentwana elandelayo, tsala iDCK; kwaye njalo-njalo de onke amasuntswana ahanjiswe (ndangena), emva koko sidonsa i-LAT. Oku kunokwenziwa ngesandlai-bit bang), kodwa kungcono ukusebenzisa ujongano lweSPI olulolwe ngokukodwa kule nto, kuba iboniswe kwi-STM32 yethu kwiikopi ezimbini.

Icwecwe eliBlue STM32F103

Intshayelelo: Abalawuli be-STM32 bantsonkothe ​​kakhulu kune-Atmega328 kunokuba bangoyikisa. Ngexesha elifanayo, ngenxa yezizathu zokonga amandla, phantse zonke iiperipherals zivaliwe ekuqaleni, kwaye i-clock frequency yi-8 MHz ukusuka kumthombo wangaphakathi. Ngethamsanqa, abadwelisi beprogram be-STM babhale ikhowudi ezisa i-chip "kwi-72 MHz", kwaye ababhali bazo zonke ii-IDE endibaziyo bazibandakanyile kwinkqubo yokuqalisa, ngoko akufuneki ukuba sivale (kodwa). unako ukuba ufuna ngokwenene). Kodwa kufuneka uvule iiperipherals.

Uxwebhu: Itshiphu edumileyo ye-STM32F103C8T6 ifakwe kwiPilisi eBlue, kukho amaxwebhu amabini aluncedo kuyo:

Kuluhlu, sinokuba nomdla:

  • Iipinouts - i-chip pinouts - ukuba sithatha isigqibo sokwenza iibhodi ngokwethu;
  • Imephu yeMemori - imephu yememori yechip ethile. I-Reference Manual inemephu yawo wonke umgca, ikhankanya iirejista ezingekho kwezethu.
  • Itheyibhile yeeNkcazo zePin- edwelisa eyona misebenzi iphambili kunye nenye yesikhonkwane; "Ipilisi eluhlaza okwesibhakabhaka" kwi-Intanethi, unokufumana imifanekiso efanelekileyo ngakumbi ngoluhlu lwezikhonkwane kunye nemisebenzi yabo. Ke ngoko, sikhangela iPilitsi yeBlue kwangoko kwaye sigcine lo mfanekiso ukufuphi:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
QAPHELA: bekukho impazamo emfanekisweni ovela kwi-Intanethi, ephawulwe kwizimvo, ebulela ngayo. Umfanekiso uthatyathelwe indawo, kodwa esi sifundo - kungcono ukujonga ulwazi olungekho kwi-databases.

Sisusa i-database, vula i-Reference Manual, ukususela ngoku siyisebenzisa kuphela.
Inkqubo: jongana negalelo / imveliso eqhelekileyo, misela iSPI, vula iiperipherals eziyimfuneko.

Igalelo lokuPhuma

Kwi-Atmega328, i-I/O ilula kakhulu, yiyo loo nto ubuninzi beenketho ze-STM32 bunokubhida. Ngoku sifuna izigqibo kuphela, kodwa kukho iindlela ezine:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Vula iSiphumo soMbhobho, iPush-Tsalo iPhulo, Tyhala-Tsala ngenye indlela, Vula-Tsala isiphumo

"Tsalo-tyhala" (Ukutyhala) - isiphumo esiqhelekileyo esivela kwi-Arduino, i-pin ingaba yi-HIGH okanye i-LOW. Kodwa nge "drain evulekileyo" ivela ubunzima, nangona enyanisweni yonke into ilula apha:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Uqwalaselo lwemveliso / xa izibuko labelwe imveliso: / isikhuseli semveliso sinikwe amandla: / – vula imowudi yokuhambisa: "0" kwirejista yemveliso yenza i-N-MOS, "1" kwirejista yemveliso ishiya izibuko kwimo ye-Hi-Z (P -MOS ayisebenzi ) / - imowudi yokutyhala: "0" kwirejista yemveliso isebenze i-N-MOS, "1" kwirejista yemveliso isebenze i-P-MOS.

Wonke umahluko ovulekileyo we drain (idreyini evulekileyo) ukusuka ku-"tyhala-tsala" (Ukutyhala) kukuba kwisikhonkwane sokuqala ayinakuthatha imo Ephakamileyo: xa iyunithi ibhaliwe kwirejista yemveliso, iya kwimo yokumelana okuphezulu (impedance ephezulu, Hi-Z). Xa ubhala i-zero, iphini kuzo zombini iindlela ziziphatha ngendlela efanayo, ngokufanelekileyo nangombane.

Kwimo yemveliso eqhelekileyo, iphini iguqulela ngokulula imixholo yerejista yemveliso. Kwi "enye" ​​ilawulwa yiperipheral ehambelanayo (bona 9.1.4):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Ukuba i-port bit iqwalaselwe njengenye imveliso yomsebenzi, irejista yemveliso ivaliwe kwaye i-pin idityaniswe kwisignali yemveliso yeperipheral.

Umsebenzi ongomnye wephini ngalinye uchazwe kwi Iinkcazo zePini Uxwebhu lukumfanekiso okhutshelweyo. Xa ubuzwa ukuba wenzeni ukuba isikhonkwane sinemisebenzi emininzi eyenye, impendulo inikwa ngumbhalo osemazantsi kwidatabase:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Ukuba iiperipherals ezininzi zisebenzisa isikhonkwane esinye, ukunqanda impixano phakathi kweminye imisebenzi, kufuneka kusetyenziswe iperipheral enye kuphela ngexesha, utshintshela usebenzisa iPeripheral Clock Enable bit (kwirejista yeRCC ehambelanayo).

Okokugqibela, izikhonkwane kwimowudi yokuphuma nazo zinesantya sewotshi. Le yenye into yokugcina amandla, kwimeko yethu siyibeka nje phezulu kwaye siyilibale.

Ngoko: sisebenzisa i-SPI, oku kuthetha ukuba izikhonkwane ezimbini (ezinedatha kunye nesignali yewotshi) kufuneka "i-alternative push-pull function", kwaye enye enye (LAT) kufuneka ibe "i-push-pull evamile". Kodwa ngaphambi kokuba sibabele, masijongane neSPI.

SPI

Enye i-hack encinci

I-SPI okanye i-Serial Peripheral Interface (ujongano lwe-serial peripheral) lujongano olulula nolusebenzayo kakhulu lokunxibelelana i-MK nezinye ii-MK kunye nelizwe langaphandle ngokubanzi. Umgaqo wokusebenza kwawo sele uchazwe ngasentla, apho malunga nomqhubi we-LED waseTshayina (jonga icandelo lama-25 kwincwadana yokubhekisela). I-SPI inokusebenza kwiimowudi zenkosi ("master") kunye nekhoboka ("slave"). I-SPI ineendlela ezine ezisisiseko, apho ingeyiyo yonke enokubandakanyeka:

  • I-MOSI, iPhulo eliPhambili / iNgeniso yekhoboka: le pin ithumela idatha kwimowudi yenkosi, kwaye ifumana idatha kwimo yekhoboka;
  • I-MISO, Igalelo Eliyintloko / Isiphumo Sobukhoboka: ngokuchaseneyo, iyamkela inkosi, inika ikhoboka;
  • I-SCK, iClock yeSerial: ibeka amaxesha amaninzi okuhanjiswa kwedatha kwinkosi okanye ifumana uphawu lwewotshi kwikhoboka. Ngokubanzi, ibetha iibethi;
  • I-SS, i-Slave Khetha: ngeli jelo, ikhoboka liyazi ukuba lifuna okuthile kuye. Kwi-STM32 ibizwa ngokuba yi-NSS, apho i-N = i-negative, okt. umlawuli uba likhoboka ukuba eli jelo linomhlaba. Idibana kakuhle nemowudi ye-Open Drain Output, kodwa lelinye ibali.

Njengayo yonke enye into, iSPI kwi-STM32 ityebile ngokusebenza, nto leyo eyenza kube nzima ukuyiqonda. Ngokomzekelo, ayinakusebenza kuphela nge-SPI, kodwa kunye ne-interface ye-I2S, kwaye kumaxwebhu iinkcazo zabo zixutywe, kuyimfuneko ukunqumla ukugqithisa ngexesha elifanelekileyo. Umsebenzi wethu ulula kakhulu: kufuneka unike idatha usebenzisa i-MOSI kunye ne-SCK kuphela. Siya kwicandelo 25.3.4 (unxibelelwano lwe-half-duplex, i-half-duplex communication), apho sifumana khona Iwotshi ye-1 kunye ne-1 yocingo lwedatha ye-unidirectional (Ikloko e-1 kunye nomjelo wedatha o-1 ongangqalanga):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Kule mowudi, isicelo sisebenzisa iSPI kwimo yokuhambisa kuphela okanye yokwamkela kuphela. / Imowudi yokudlulisa kuphela iyafana nemowudi ephindwe kabini: idatha idluliswa kwiphini lokuthumela (i-MOSI kwimowudi eyintloko okanye i-MISO kwimowudi yekhoboka), ngelixa i-pin yokufumana (i-MISO okanye i-MOSI ngokulandelanayo) ingasetyenziswa njengesiqhelo I/O iphini. Kule meko, kwanele ukuba isicelo singayihoyi i-Rx buffer (ukuba ifundiwe, akuyi kubakho datha egqithisiweyo).

Kakhulu, iphini ye-MISO isimahla, masiqhagamshele isiginali ye-LAT kuyo. Masijongane ne-Slave Select, enokulawulwa ngokwenkqubo kwi-STM32, eluncedo kakhulu. Sifunda umhlathi wegama elifanayo kwicandelo 25.3.1 SPI Inkcazo ngokubanzi:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Ulawulo lwesoftware ye-NSS (SSM = 1) / Ulwazi lokukhetha amakhoboka luqulethwe kwi-SSI bit yerejista ye-SPI_CR1. I-pin ye-NSS yangaphandle ishiywe ikhululekile kwezinye iimfuno zesicelo.

Lixesha lokubhalela iirejista. Ndigqibe ekubeni ndisebenzise i-SPI2, sikhangela idilesi yesiseko sayo kwidatha yedatha- kwicandelo 3.3 Imephu yeMemori (iMemo yeMemori):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Ewe, masiqale:

#define _SPI2_(mem_offset) (*(volatile uint32_t *)(0x40003800 + (mem_offset)))

Sivula icandelo 25.3.3 ngesihloko esithi "Ukulungisa i-SPI kwimowudi enkulu":

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

1. Cwangcisa iwotshi yojongano olulandelelanayo ngeBR[2:0] bits kwirejista yeSPI_CR1.

Iirejista ziqokelelwa kwicandelo lencwadana yereferensi yegama elifanayo. Ukutshintsha idilesi (idilesi offset) CR1 ino 0x00, ngokungagqibekanga zonke iintwana ziyacinywa (phinda umisele ixabiso 0x0000):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Iibhithi ze-BR ziseta isahluli sewotshi yesilawuli, ngaloo ndlela imisela ubuninzi bexesha apho iSPI iya kusebenza khona. I-STM32 frequency iya kuba yi-72 MHz, umqhubi we-LED, ngokwedatha yedatha yayo, usebenza ngokuphindaphindiweyo ukuya kwi-25 MHz, ngoko kufuneka sahlule ezine (BR[2:0] = 001).

#define _SPI_CR1 0x00

#define BR_0        0x0008
#define BR_1        0x0010
#define BR_2        0x0020

_SPI2_ (_SPI_CR1) |= BR_0;// pclk/4

2. Misela i-CPOL kunye ne-CPHA bits ukuchaza ubudlelwane phakathi kokudluliselwa kwedatha kunye newotshi ye-serial interface (jonga umzobo kwiphepha lama-240)

Ekubeni sifunda i-database apha, kwaye singajongi i-schematics, makhe sijonge ngakumbi inkcazo yombhalo we-CPOL kunye ne-CPHA bits kwiphepha 704 (iNkcazelo Jikelele ye-SPI):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Isigaba sewotshi kunye ne-polarity
Ukusebenzisa i-CPOL kunye ne-CPHA bits yerejista ye-SPI_CR1, ungakhetha ngokwenkqubo iinketho ezine zomlinganiselo wexesha. I-CPOL (i-Clock Polarity) bit ilawula imo yesignali yewotshi xa kungekho datha ithunyelwayo. Le bit ilawula iimowudi zenkosi kunye nekhoboka. Ukuba i-CPOL isetwe ngokutsha, iphini ye-SCK iphantsi xa iphumla. Ukuba i-bit ye-CPOL iseti, i-pin ye-SCK iphezulu xa ingasebenzi.
Ukuba i-CPHA (iSigaba seClock) isetyenzisiwe, i-MSB trap strobe ngumphetho wesibini wesignali ye-SCK (ukuwa ukuba i-CPOL isusiwe, okanye i-edge yokunyuka ukuba i-CPOL imisiwe). Idatha ifakwe kutshintsho lwewotshi yesibini. Ukuba i-bit ye-CPHA iyacinywa, i-high bit trap strobe kukunyuka kwe-signal ye-SCK (ukuwa ukuba i-CPOL imisiwe, okanye i-edge yokunyuka ukuba i-CPOL icacile). Idatha ifakwe kutshintsho lwewotshi yokuqala.

Emva kokungcamla olu lwazi, sifikelela kwisigqibo sokuba omabini amasuntswana kufuneka ahlale engu-zero, kuba sifuna ukuba isignali ye-SCK ihlale iphantsi xa ingasetyenziswa, kwaye idatha idluliselwe kwinqanaba elikhulayo le-pulse (jonga umkhiwane. Ukunyuka komda Idatha ye-DM634

Ngendlela, apha siqale sadibana nenqaku lesigama kwi-ST datas: kuzo ibinzana elithi "setha kwakhona i-bit kwi-zero" ibhaliwe. ukuseta kwakhona kancinci, kwaye akunjalo ukucima kancinci, njenge, umzekelo, Atmega.

3. Seta i-bit ye-DFF ukumisela i-8-bit okanye i-16-bit ifomathi yebhloko yedatha

Ndithathe ngokukodwa i-16-bit DM634 ukuze ndingakhathazeki ngokugqithiselwa kwedatha ye-PWM ye-12-bit, njenge-DM633. I-DFF iyavakala ukubeka ubunye:

#define DFF         0x0800

_SPI2_ (_SPI_CR1) |= DFF; // 16-bit mode

4. Qwalasela i-bit ye-LSBFIRST kwirejista ye-SPI_CR1 ukuchaza ifomati yebhloko

I-LSBFIRST, njengoko igama layo lisitsho, imisela uthumelo ngeyona nto ibalulekileyo kuqala. Kodwa i-DM634 ifuna ukufumana idatha ye-MSB kuqala. Ngoko ke, siyishiya isetyenzisiwe.

5. Kwimowudi ye-hardware, ukuba i-input evela kwi-NSS pin iyafuneka, qhuba i-NSS pin high ngexesha lonke lokulandelelana kokudluliselwa kwe-byte. Kwimo yenkqubo ye-NSS, seta i-SSM kunye ne-SSI bits kwirejista ye-SPI_CR1. Ukuba isikhonkwane se-NSS siza kukhutshwa, kuphela isuntswana le-SSO ekufuneka limiselwe.

Faka i-SSM kunye ne-SSI ukulibala malunga nemowudi yehardware ye-NSS:

#define SSI         0x0100
#define SSM         0x0200

_SPI2_ (_SPI_CR1) |= SSM | SSI; //enable software control of SS, SS high

6. I-MSTR kunye ne-SPE bits kufuneka zisetwe (zihlala zisetiwe kuphela ukuba i-NSS iphezulu)

Ngokwenyani, ngezi bits sabela iSPI yethu njengenkosi kwaye siyivule:

#define MSTR        0x0004
#define SPE         0x0040

_SPI2_ (_SPI_CR1) |= MSTR; //SPI master
//когда все готово, включаем SPI
_SPI2_ (_SPI_CR1) |= SPE;

I-SPI iqwalaselwe, masibhale ngokukhawuleza imisebenzi ethumela ii-bytes kumqhubi. Qhubeka ufunda 25.3.3 "Ukuqwalasela i-SPI kwiMowudi ePhambili":

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Umyalelo wokudluliselwa kwedatha
Ugqithiso luqala xa i-byte ibhalwa kwi-Tx buffer.
I-byte yedatha ifakwe kwirejista yeshifti ku ehambelanayo imowudi (ukusuka kwibhasi yangaphakathi) ngexesha lokuhanjiswa kwe-bit yokuqala, emva koko idluliselwe kuyo iyahambelana Imowudi ye-MOSI ye-pin, eyokuqala okanye yokugqibela kancinane phambili ngokuxhomekeke kucwangciso lwe bit LSBFIRST kwirejista CPI_CR1. Iflegi ye-TXE isetwa emva kokuhanjiswa kwedatha ukusuka kwi-Tx buffer ukuya kwirejista yokutshintsha, kwaye uphazamiseko luyenziwa ukuba isuntswana le-TXEIE kwirejista ye-CPI_CR1 isetiwe.

Ndagqamisa amagama ambalwa ekuguquleleni ukutsala ingqalelo kwinto enye yokuphunyezwa kwe-SPI kubalawuli be-STM. Kwi-Atmega, iflegi yeTXE (Tx Ayinanto, Tx ayinanto kwaye ilungele ukufumana idatha) isetwa kuphela emva kokuba yonke i-byte ithunyelwe ngaphandle. Kwaye apha le flegi ibekwe emva kokuba i-byte ityhilwe kwirejista yokutshintsha kwangaphakathi. Ekubeni ityhalelwa apho kunye nawo onke amasuntswana ngexesha elinye (ngokunxuseneyo), kwaye ke idatha ihanjiswa ngokulandelelana, i-TXE ibekwe phambi kokuba i-byte ithunyelwe ngokupheleleyo. Oku kubalulekile kuba kwimeko yomqhubi wethu we-LED, kufuneka sikhuphe ipini ye-LAT emva kokuthumela всех idatha, o.k. kuphela iflegi ye-TXE ayiyi kukwanela kuthi.

Oko kuthetha ukuba sifuna enye iflegi. Makhe sijonge kwi-25.3.7 - "Iiflegi zesimo":

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
<…>
Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
BUSY iflegi
Iflegi ye-BSY iseti kwaye icocwe yi-hardware (ukubhala kuyo akunasiphumo). Iflegi yeBSY ibonisa ubume bonxibelelwano lweSPI.
Iseta kwakhona:
xa ugqithiselo lugqityiwe (ngaphandle kwemowudi enkulu ukuba ugqithiso luyaqhubeka)
xa iSPI ivaliwe
xa kusenzeka impazamo yemowudi eyintloko (MODF=1)
Ukuba ukuhanjiswa akuqhubeki, iflegi ye-BSY iyacinywa phakathi kokuhanjiswa kwedatha nganye.

Kulungile, kuya kuba luncedo. Fumana apho i-Tx buffer ikhoyo. Ukwenza oku, funda "iRejista yedatha ye-SPI":

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Bits 15:0 DR[15:0] Irejista yedatha
Idatha efunyenweyo okanye idatha yokuhanjiswa.
Irejista yedatha yahlulwe yazii-buffers ezimbini, enye yeyokubhala (transmit buffer) kunye neyokufunda (fumana i-buffer). Ukubhalela kwirejista yedatha kubhala kwi-Tx buffer, kwaye ukufunda kwirejista yedatha kuya kubuyisela ixabiso eliqulethwe kwi-Rx buffer.

Ewe, irejista yesimo, apho kukho iiflegi ze-TXE kunye ne-BSY:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Sibhala:

#define _SPI_DR  0x0C
#define _SPI_SR  0x08

#define BSY         0x0080
#define TXE         0x0002

void dm_shift16(uint16_t value)
{
    _SPI2_(_SPI_DR) = value; //send 2 bytes
    while (!(_SPI2_(_SPI_SR) & TXE)); //wait until they're sent
}

Ewe, kuba kufuneka sidlulisele i-16 ngokuphindwe kabini ngeebyte ezimbini, ngokwenani leziphumo zomqhubi we-LED, into enje:

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();
}

Kodwa asazi ukuba siyitsala njani iphini ye-LAT okwangoku, ke masibuyele ku-I/O.

Yabela izikhonkwane

Kwi-STM32F1, iirejista ezinoxanduva lobume bezikhonkwane aziqhelekanga. Kucacile ukuba zininzi zazo kune-Atmega, kodwa zikwahluke kwezinye iitshiphusi ze-STM. Icandelo 9.1 GPIO Ingcaciso ngokuBanzi:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Nganye kwinjongo jikelele I/O izibuko (GPIO) ineerejista ezimbini ze-32-bit yoqwalaselo (GPIOx_CRL kunye GPIOx_CRH), iirejista ezimbini ze-32-bit data (GPIOx_IDR kunye neGPIOx_ODR), i-32-bit set/reset register (GPIOx_BSRR), irejista ye-16-bit yokusetha kwakhona (GPIOx_BRR) kunye ne-32- irejista yokuvimba kancinci (GPIOx_LCKR).

Ngokungaqhelekanga, kwaye kunokuba kuphazamiseka, ziirejista ezimbini zokuqala apha, kuba izikhonkwane ezili-16 zezibuko zithe saa kuzo zonke iibhithi ezine ngefomathi yomzalwana. Ezo. izikhonkwane ezi-XNUMX ukuya ku-XNUMX zikwi-CRL, kwaye ezinye zikwi-CRH. Kwangaxeshanye, iirejista eziseleyo zilungelelanisa ngempumelelo amasuntswana azo zonke izikhonkwane zezibuko - ngokufuthi esele isiqingatha "esigciniweyo".

Ukwenza lula, masiqale ekupheleni koluhlu.

Asiyifuni irejista yokuvala.

Ukusetha kunye nokusetha kwakhona iirejista kuyahlekisa kuba ngokuyinxenye baphinda-phinda enye kwenye: ungabhala yonke into kuphela kwi-BSRR, apho amasuntswana ali-16 aphezulu azakuseta kwakhona isikhonkwane ku-zero, kwaye ezisezantsi ziyakumiselwa ku-1, okanye sebenzisa i-BRR, amasuntswana ali-16 asezantsi apho usete kwakhona isikhonkwane. Ndiyayithanda inketho yesibini. Ezi rejista zibalulekile kuba zibonelela ngokufikelela kwiathom kwizikhonkwane:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Ukufakela okanye ukuseta ngokutsha
Awudingi ukuvala uphazamiseko xa udwelisa inkqubo GPIOx_ODR kumphakamo kancinane: ungatshintsha amasuntswana abenye okanye ngaphezulu ngokubhala okukodwa kwe APB2. Oku kuphunyezwa ngokubhala u-"1" kwirejista yokusetha/ukusetha ngokutsha (GPIOx_BSRR okanye, ukuseta ngokutsha kuphela, GPIOx_BRR) yebit ukuba itshintshwe. Amanye amasuntswana aya kuhlala engatshintshwanga.

Iirejista zedatha zinamagama athetha kakhulu - IDR = input Irejista yomkhomba-ndlela, irejista yokufaka; ODR= imveliso Irejista yomkhomba-ndlela, irejista yeziphumo. Kwiprojekthi yangoku, asizifuni.

Kwaye ekugqibeleni, iirejista zolawulo. Kuba sinomdla kwizikhonkwane ze-SPI yesibini, ezizezi PB13, PB14 kunye ne-PB15, sijonga kwangoko kwi-CRH:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Kwaye siyabona ukuba kuya kufuneka ukuba ubhale into ngamasuntswana ukusuka kwi-20 ukuya kwi-31.

Sele sicinge ukuba sifuna ntoni kwizikhonkwane ezingentla, ke apha ndiya kwenza ngaphandle kwesikrini, sitsho nje ukuba iMODE ibeka isalathiso (igalelo ukuba iibhithi zombini zimiselwe kwi-0) kunye nesantya sephini (sifuna i-50MHz, okt. zombini isikhonkwane ukuya ku "1"), kwaye i-CNF icwangcisa indlela: eqhelekileyo "push-push" - 00, "alternative" - ​​10. Ngokungagqibekanga, njengoko sibona ngasentla, zonke izikhonkwane zinesuntswana lesithathu ukusuka ezantsi ( CNF0), ibabeka kwindlela igalelo elidadayo.

Kuba ndiceba ukwenza enye into ngale chip, ukwenza lula, ndichaze ngokubanzi onke amaxabiso anokwenzeka eMODE kunye ne-CNF kuzo zombini iirejista zolawulo ezisezantsi neziphezulu.

Ngandlela thile ngolu hlobo

#define CNF0_0 0x00000004
#define CNF0_1 0x00000008
#define CNF1_0 0x00000040
#define CNF1_1 0x00000080
#define CNF2_0 0x00000400
#define CNF2_1 0x00000800
#define CNF3_0 0x00004000
#define CNF3_1 0x00008000
#define CNF4_0 0x00040000
#define CNF4_1 0x00080000
#define CNF5_0 0x00400000
#define CNF5_1 0x00800000
#define CNF6_0 0x04000000
#define CNF6_1 0x08000000
#define CNF7_0 0x40000000
#define CNF7_1 0x80000000
#define CNF8_0 0x00000004
#define CNF8_1 0x00000008
#define CNF9_0 0x00000040
#define CNF9_1 0x00000080
#define CNF10_0 0x00000400
#define CNF10_1 0x00000800
#define CNF11_0 0x00004000
#define CNF11_1 0x00008000
#define CNF12_0 0x00040000
#define CNF12_1 0x00080000
#define CNF13_0 0x00400000
#define CNF13_1 0x00800000
#define CNF14_0 0x04000000
#define CNF14_1 0x08000000
#define CNF15_0 0x40000000
#define CNF15_1 0x80000000

#define MODE0_0 0x00000001
#define MODE0_1 0x00000002
#define MODE1_0 0x00000010
#define MODE1_1 0x00000020
#define MODE2_0 0x00000100
#define MODE2_1 0x00000200
#define MODE3_0 0x00001000
#define MODE3_1 0x00002000
#define MODE4_0 0x00010000
#define MODE4_1 0x00020000
#define MODE5_0 0x00100000
#define MODE5_1 0x00200000
#define MODE6_0 0x01000000
#define MODE6_1 0x02000000
#define MODE7_0 0x10000000
#define MODE7_1 0x20000000
#define MODE8_0 0x00000001
#define MODE8_1 0x00000002
#define MODE9_0 0x00000010
#define MODE9_1 0x00000020
#define MODE10_0 0x00000100
#define MODE10_1 0x00000200
#define MODE11_0 0x00001000
#define MODE11_1 0x00002000
#define MODE12_0 0x00010000
#define MODE12_1 0x00020000
#define MODE13_0 0x00100000
#define MODE13_1 0x00200000
#define MODE14_0 0x01000000
#define MODE14_1 0x02000000
#define MODE15_0 0x10000000
#define MODE15_1 0x20000000

Izikhonkwane zethu zikwizibuko B (idilesi yesiseko - 0x40010C00), ikhowudi:

#define _PORTB_(mem_offset) (*(volatile uint32_t *)(0x40010C00 + (mem_offset)))

#define _BRR  0x14
#define _BSRR 0x10
#define _CRL  0x00
#define _CRH  0x04

//используем стандартный SPI2: MOSI на B15, CLK на B13
//LAT пусть будет на неиспользуемом MISO – B14

//очищаем дефолтный бит, он нам точно не нужен
_PORTB_ (_CRH) &= ~(CNF15_0 | CNF14_0 | CNF13_0 | CNF12_0);

//альтернативные функции для MOSI и SCK
_PORTB_ (_CRH) |= CNF15_1 | CNF13_1;

//50 МГц, MODE = 11
_PORTB_ (_CRH) |= MODE15_1 | MODE15_0 | MODE14_1 | MODE14_0 | MODE13_1 | MODE13_0;

Kwaye, ngokufanelekileyo, ungabhala ii-defines ze-LAT, eziza kutshintsha iirejista ze-BRR kunye ne-BSRR:

/*** LAT pulse – high, then low */
#define LAT_pulse() _PORTB_(_BSRR) = (1<<14); _PORTB_(_BRR) = (1<<14)

#define LAT_low() _PORTB_(_BRR) = (1<<14)

(LAT_low nje nge-inertia, ngandlela thile ibihlala injalo, mayihlale kuwe)

Ngoku yonke into ilungile, kodwa ayisebenzi. Ngenxa yokuba le yi-STM32, bonga umbane apha, nto leyo ethetha ukuba kufuneka uvule i-clocking yeeperipherals eziyimfuneko.

Layita iwotshi

Iwotshi inoxanduva lwewotshi, kananjalo Clock. Kwaye sele sisiqaphela isishunqulelo esithi RCC. Siyijonga kuxwebhu: oku kuSeta kwakhona kunye noLawulo lweKloko (Ulawulo lokusetha ngokutsha kunye nokuwashwa).

Njengoko kukhankanyiwe ngasentla, ngethamsanqa, abantu abavela kwi-STM benze eyona nxalenye inzima kakhulu yesihloko sokuvala iwashi kuthi, apho sibulela kakhulu kubo (kwakhona ndiya kunika ikhonkco Iwebhusayithi kaDi Haltukuyicacisa indlela ebhideke ngayo). Sifuna kuphela iirejista ezinoxanduva lokwenza i-peripheral clocking isebenze (i-Peripheral Clock Yenza iirejista). Okokuqala, masifumane idilesi yesiseko ye-RCC, isekuqalekeni kwe "Memory Card":

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

#define _RCC_(mem_offset) (*(volatile uint32_t *)(0x40021000 + (mem_offset)))

Kwaye ke nokuba ucofe ikhonkco apho uzama ukufumana into etafileni, okanye, ngcono kakhulu, uye ngaphezulu kweenkcazo zokubandakanya iirejista ezivela kumacandelo malunga. vula iirejista. Siyifumana phi i-RCC_APB1ENR kunye ne-RCC_APB2ENR:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Kwaye kuzo, ngokulandelelanayo, amasuntswana abandakanya ukuvalelwa kwe-SPI2, IOPB (I / O Port B) kunye neminye imisebenzi (AFIO).

#define _APB2ENR 0x18
#define _APB1ENR 0x1C

#define IOPBEN 0x0008
#define SPI2EN 0x4000
#define AFIOEN 0x0001

//включаем тактирование порта B и альт. функций
_RCC_(_APB2ENR) |= IOPBEN | AFIOEN;

//включаем  тактирование SPI2
_RCC_(_APB1ENR) |= SPI2EN;

Ikhowudi yokugqibela inokufumaneka apha.

Ukuba kukho ithuba kunye nomnqweno wokuvavanya, ngoko sidibanisa i-DM634 ngolu hlobo: I-DAI kwi-PB15, i-DCK kwi-PB13, i-LAT kwi-PB14. Sondla umqhubi ukusuka kwi-5 volts, ungakulibali ukudibanisa imihlaba.

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

I-STM8 PWM

I-PWM kwi-STM8

Xa ndicwangcisa nje eli nqaku, ndagqiba, ngokomzekelo, ukuba ndizame ukuqonda umsebenzi othile we-chip engaqhelekanga ngoncedo lwedatha kuphela, ukwenzela ukuba umenzi wezicathulo akayi kuphuma ngaphandle kweebhuthi. I-STM8 yayigqibelele kule ndima: okokuqala, ndibe neebhodi ezimbalwa zaseTshayina ezine-STM8S103, kwaye okwesibini, ayithandwa kakhulu, kwaye ngoko ke isilingo sokufunda kunye nokufumana isisombululo kwi-Intanethi sixhomekeke kukungabikho kwezi zisombululo ezifanayo.

Itshiphu nayo inakho ishiti yedatha и incwadi yesalathiso RM0016, kwi-pinout yokuqala kunye needilesi zokubhalisa, okwesibini - yonke enye into. Ukucwangcisa i-STM8 kwi-C kwi-IDE embi I-ST Visual Development.

Ukuvala kunye ne-I/O

Ngokungagqibekanga, i-STM8 isebenza ngokuphindaphindiweyo kwe-2 MHz, oku kufuneka kulungiswe ngokukhawuleza.

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Iwotshi ye-HSI (Ephezulu Ngaphakathi)
Iwotshi ye-HSI ithathwe kwi-oscillator ye-RC yangaphakathi ye-16 MHz ene-programmable divider (1 ukuya kwi-8). Imiselwe kwirejista yewotshi yesahluli (CLK_CKDVR).
Qaphela: I-oscillator ye-HSI RC ene-dider ye-8 ikhethwe njengomthombo wewotshi enkulu ekuqaliseni.

Sifumana idilesi yerejista kwidatha yedatha, inkcazo kwi-refman kwaye sibone ukuba irejista kufuneka isuswe:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Kuba siza kuqhuba i-PWM kwaye siqhagamshele ii-LED, makhe sijonge i-pinout:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

I-chip incinci, imisebenzi emininzi inqunyanyiswe kwizikhonkwane ezifanayo. Yintoni ekwizibiyeli ezisisikwere “yinye indlela yokusebenza”, itshintshwa ngokuthi “option bytes” (iibhayithi zokukhetha) - into efana ne-Atmega fuses. Ungatshintsha amaxabiso abo ngokwenkqubo, kodwa akuyomfuneko, kuba. Umsebenzi omtsha uvulwa kuphela emva kokuqalisa ngokutsha. Kulula ukusebenzisa i-ST Visual Programmer (ekhutshelweyo ngoPhuhliso oluBonakalayo), enokutshintsha ezi bytes. I-pinout ibonisa ukuba iziphumo ze-CH1 kunye ne-CH2 zexesha lokuqala zifihlwe kwizibiyeli zesikwere; kuyimfuneko ukuseta i-AFR1 kunye ne-AFR0 bits kwi-STVP, kwaye eyesibini iya kudlulisela kwakhona imveliso ye-CH1 yexesha lesibini ukusuka kwi-PD4 ukuya kwi-PC5.

Ngaloo ndlela, izikhonkwane ezi-6 ziya kulawula ii-LEDs: i-PC6, i-PC7 kunye ne-PC3 ye-timer yokuqala, i-PC5, i-PD3 kunye ne-PA3 okwesibini.

Ukuseta izikhonkwane ze-I/O ngokwazo kwi-STM8 kulula kwaye kunengqiqo ngakumbi kune-STM32:

  • Irejista yedatha ye-Atmega eyaziwayo DDR (Irejista yoMkhombandlela weDatha): 1 = imveliso;
  • irejista yokuqala yokulawula i-CR1, xa imveliso, ibeka i-push-pull mode (1) okanye i-drain evulekile (0); ekubeni ndidibanisa ii-LEDs kwi-chip kunye ne-cathodes, ndishiya i-zero apha;
  • irejista yesibini yokulawula i-CR2 ibeka isantya sewotshi xa ikhupha: 1 = 10 MHz

#define PA_DDR     *(volatile uint8_t *)0x005002
#define PA_CR2     *(volatile uint8_t *)0x005004
#define PD_DDR     *(volatile uint8_t *)0x005011
#define PD_CR2     *(volatile uint8_t *)0x005013
#define PC_DDR     *(volatile uint8_t *)0x00500C
#define PC_CR2     *(volatile uint8_t *)0x00500E

PA_DDR = (1<<3); //output
PA_CR2 |= (1<<3); //fast
PD_DDR = (1<<3); //output
PD_CR2 |= (1<<3); //fast
PC_DDR = ((1<<3) | (1<<5) | (1<<6) | (1<<7)); //output
PC_CR2 |= ((1<<3) | (1<<5) | (1<<6) | (1<<7)); //fast

Useto lwePWM

Okokuqala, makhe sichaze amagama:

  • Ubuninzi bePWM - amaxesha apho isibali-xesha siphawula;
  • Ukulayisha kwakhona ngokuzenzekelayo, AR - ixabiso lokulayishwa ngokuzenzekelayo, ukuya kuthi ga apho i-timer iya kubala (ixesha le-pulse);
  • Isiganeko sohlaziyo, i-UEV - isiganeko esenzeka xa isibali-xesha sibala ukuya kwi-AR;
  • PWM uMjikelo woMsebenzi - Umjikelo womsebenzi wePWM, odla ngokubizwa ngokuba "ngumjikelo womsebenzi";
  • Thatha/Thelekisa ixabiso - ixabiso lokubamba / ukuthelekisa, ukubala ukuya kuthi ga apho isibali-xesha uza kwenza into (kwimeko ye-PWM, iguqula isignali yemveliso);
  • ixabiso lokulayisha kwangaphambili – ixabiso elifakwe ngaphambili. thelekisa ixabiso ayinakutshintsha ngelixa isibali-xesha siphawula, kungenjalo umjikelo we-PWM uya kwaphuka. Ke ngoko, amaxabiso amatsha athunyelwayo afakwa kwi-buffer kwaye atsalwe xa isibali-xesha sifika esiphelweni sokubala kwaye sisetwe kwakhona;
  • Ilungelelaniswe nomda и Iimowudi ezilungelelaniswe embindini - ukulungelelaniswa kumda kunye naphakathi, kufana ne-atmelovskie Ngokukhawuleza PWM и Isigaba-esichanekileyo PWM.
  • I-OCiREF, Isiphumo Thelekisa uMqondiso weReferensi - isibonakaliso sesiphumo sereferensi, ngokwenene, into ebonakala kwiphini ehambelanayo kwimodi ye-PWM.

Njengoko sele kucacile kwi-pinout, izibali-xesha ezibini zinamandla e-PWM - eyokuqala neyesibini. Zombini ziyi-16-bit, eyokuqala ineempawu ezininzi ezongezelelweyo (ngokukodwa, ingabala zombini phezulu naphantsi). Sidinga ukuba sobabini sisebenze ngendlela efanayo, ndiye ndagqiba ekubeni ndiqale ngeyesibini ngokucacileyo ehlwempuzekileyo, ukuze ndingasebenzisi ngempazamo into engekho kuyo. Enye ingxaki kukuba inkcazo yokusebenza kwe-PWM yazo zonke izibali-xesha kwincwadana yereferensi kwisahluko malunga nesibali-xesha sokuqala (17.5.7 Indlela ye-PWM), ngoko kufuneka utsibe umva naphambili ngapha koxwebhu lonke ixesha.

I-PWM kwi-STM8 inenzuzo ebalulekileyo ngaphezu kwe-Atmega PWM:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
PWM ngolungelelwaniso lomphetho
Ubumbeko lweakhawunti ukusuka ezantsi ukuya phezulu
Ukubala okuphezulu kuyasebenza ukuba i-DIR bit kwirejista ye-TIM_CR1 icacile
Umzekelo:
Umzekelo usebenzisa imowudi yokuqala ye-PWM. Isalathisi sesalathiso se-PWM i-OCiREF ibambe phezulu okoko nje i-TIM1_CNT <TIM1_CCRi. Ngaphandle koko, kuthatha inqanaba eliphantsi. Ukuba ixabiso lokuthelekisa kwirejista ye-TIM1_CCRi likhulu kunexabiso lokulayisha ngokuzenzekelayo (irejista ye-TIM1_ARR), isignali ye-OCiREF ibanjwe kwi-1. Ukuba ixabiso lokuthelekisa ngu-0, i-OCiREF ibanjwe ku-zero....

STM8 isibali-xesha ngexesha hlaziya umcimbi ijonga kuqala thelekisa ixabiso, kwaye kuphela emva koko ivelisa uphawu lwereferensi. E-Atmega, i-timer kuqala iyaqhaqhazela, kwaye emva koko ithelekise, ngenxa yoko, nini compare value == 0 imveliso yinaliti ekufuneka kusetyenzwe ngayo ngandlela ithile (umzekelo, ngokuguqula ngokwenkqubo ingqiqo).

Ke into esifuna ukuyenza: 8-bit PWM (AR == 255), ukubala ukusuka ezantsi ukuya phezulu, ukulungelelanisa kunye nomda. Kuba iibhalbhu ziqhagamshelwe kwitshiphu ngeecathodes, i-PWM kufuneka ikhuphe i-0 (i-LED ivuliwe) de thelekisa ixabiso kwaye 1 emva.

Sele sifunde ngezinye Imo ye-PWM, ngoko ke sifumana irejista efunekayo yesibali-xesha sesibini ngokukhangela kwincwadana yereferensi yeli binzana (18.6.8 - TIMx_CCMR1):

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
I-110: Imo ye-PWM yokuqala - xa ubala ukusuka ezantsi ukuya phezulu, itshaneli yokuqala iyasebenza nje ngo-TIMx_CNT <TIMx_CCR1. Ngaphandle koko, itshaneli yokuqala ayisebenzi. [Ngaphezu koko kuxwebhu, impazamo yokukopisha-uncamathisele ukusuka kwi-timer 1] 111: Imo ye-PWM yesibini - xa ubala ukusuka ezantsi ukuya phezulu, itshaneli yokuqala ayisebenzi kude kube ngu-TIMx_CNT <TIMx_CCR1. Kungenjalo, itshaneli yokuqala iyasebenza.

Ekubeni ii-LED zixhunyiwe kwi-MK kunye ne-cathodes, imodi yesibini iyasifanela (eyokuqala nayo, kodwa asiyazi le nto).

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
I-Bit 3 OC1PE: Nika amandla iSiphumo sokuLayishwa kwangaphambili 1
0: Irejista yangaphambili kwi-TIMx_CCR1 ivaliwe. Ungabhalela ku-TIMx_CCR1 nangaliphi na ixesha. Ixabiso elitsha lisebenza ngokukhawuleza.
1: Irejista yangaphambili kwi-TIMx_CCR1 yenziwe yasebenza. Ukufunda/ukubhala imisebenzi ukufikelela kwirejista yokulayisha kwangaphambili. Ixabiso elilayishwe kwangaphambili le-TIMx_CCR1 lilayishwe kwirejista yesithunzi ngexesha lohlaziyo ngalunye.
*Qaphela: Iirejista zokulayisha kwangaphambili kufuneka zenziwe ukuba imo ye-PWM isebenze kakuhle. Oku kuyakhethwa kwimowudi yophawu olunye (i-OPM bit isetwe kwirejista ye-TIMx_CR1).

Kulungile, vula yonke into oyifunayo kwiitshaneli ezintathu zesibali-xesha sesibini:

#define TIM2_CCMR1 *(volatile uint8_t *)0x005307
#define TIM2_CCMR2 *(volatile uint8_t *)0x005308
#define TIM2_CCMR3 *(volatile uint8_t *)0x005309

#define PWM_MODE2   0x70 //PWM mode 2, 0b01110000
#define OCxPE       0x08 //preload enable

TIM2_CCMR1 = (PWM_MODE2 | OCxPE);
TIM2_CCMR2 = (PWM_MODE2 | OCxPE);
TIM2_CCMR3 = (PWM_MODE2 | OCxPE);

I-AR iqulethe iirejista ezimbini ezisibhozo, yonke into ilula apha:

#define TIM2_ARRH  *(volatile uint8_t *)0x00530F
#define TIM2_ARRL  *(volatile uint8_t *)0x005310

TIM2_ARRH = 0;
TIM2_ARRL = 255;

I-timer yesibini ingabala kuphela ukusuka phezulu ukuya phezulu, ukulungelelaniswa kumda, akukho nto idinga ukutshintshwa. Seta isahluli samaza, umzekelo, ukuya kuma-256. Kwixesha lesibini, isahluli sisetwe kwirejista ye-TIM2_PSCR kwaye ingamandla amabini:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Kuhlala ukuvula izigqibo kunye nexesha lesibini ngokwalo. Umsebenzi wokuqala usonjululwa ngamarejista Thatha/Thelekisa Yenza: kukho ezimbini kuzo, iziteshi ezintathu zithe saa ngokulinganayo phezu kwazo. Apha sinokufunda kwakhona ukuba kunokwenzeka ukutshintsha i-polarity yesignali, okt. ngokomgaqo, iMowudi ye-PWM 1 nayo ingasetyenziswa.Sibhala:

#define TIM2_CCER1 *(volatile uint8_t *)0x00530A
#define TIM2_CCER2 *(volatile uint8_t *)0x00530B

#define CC1E  (1<<0) // CCER1
#define CC2E  (1<<4) // CCER1
#define CC3E  (1<<0) // CCER2

TIM2_CCER1 = (CC1E | CC2E);
TIM2_CCER2 = CC3E;

Kwaye ekugqibeleni, siqala isibali-xesha kwirejista ye-TIMx_CR1:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Masibhale i-analog elula ye-AnalogWrite (), eya kudlulisa awona maxabiso angawo kwisibali-xesha sokuthelekisa. Iirejista zithiwe thaca amagama Bamba/Thelekisa iirejista, zimbini kuzo kwitshaneli nganye: amasuntswana ayi-8 asezantsi kwi-TIM2_CCRxL kunye namasuntswana aphezulu kwi-TIM2_CCRxH. Oko saqala i-8-bit PWM, kwanele ukubhala kuphela amasuntswana asezantsi:

#define TIM2_CCR1L *(volatile uint8_t *)0x005312
#define TIM2_CCR2L *(volatile uint8_t *)0x005314
#define TIM2_CCR3L *(volatile uint8_t *)0x005316

void setRGBled(uint8_t r, uint8_t g, uint8_t b)
{
    TIM2_CCR1L = r;
    TIM2_CCR2L = g;
    TIM2_CCR3L = b;
}

Umfundi onomdla uya kuqaphela ukuba sine-PWM enesiphako kancinci, ayikwazi ukunika i-100% yokuzalisa (kwixabiso eliphezulu le-255, umqondiso uguqulwa ngumjikelo wexesha elilodwa). Kwii-LED, oku akunandima, kwaye umfundi onomdla sele eqikelele indlela yokuyilungisa.

I-PWM kwisibali-xesha sesibini siyasebenza, yiya kweyokuqala.

Isibali-xesha sokuqala sinamasuntswana afana ncam kwiirejista ezifanayo (kuphela nje ukuba loo masuntswana ashiyekileyo "egciniwe" kwisibali-xesha sesibini asetyenziswa ngokusebenzayo kuzo zonke iintlobo zezinto eziphambili ekuqaleni). Ngoko ke, kwanele ukufumana iidilesi zeerejista ezifanayo kwi-database kwaye ukopishe ikhowudi. Ewe, tshintsha ixabiso le-frequency divider, kuba. isibali-xesha sokuqala sifuna ukufumana hayi amandla amabini, kodwa ixabiso elichanekileyo le-16-bit kwiirejista ezimbini Prescaler High и low. Senza yonke into kwaye ... ixesha lokuqala alisebenzi. Yintoni ingxaki?

Indlela yodwa yokusombulula ingxaki kukujonga lonke icandelo malunga neerejista zolawulo lwe-timer 1, apho sikhangela enye i-timer yesibini ayinayo. kuza kubakhona i 17.7.30 Irejista yekhefu (TIM1_BKR), apho kukho isuntswana elinje:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Yenza imveliso engundoqo

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Kuko konke okwangoku, ikhowudi Pha.

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

STM8 Multiplex

Ukuphindaphinda kwi-STM8

Iprojekthi encinci yesithathu kukudibanisa ii-LED ezisibhozo ze-RGB kwisibali-xesha sesibini kwimodi ye-PWM kwaye ubenze babonise imibala eyahlukileyo. Isekwe kumbono wokuphindaphinda kwe-LED, ebandakanya inyani yokuba ukuba uvula kwaye ucime ii-LEDs, ngokukhawuleza okukhulu, kuya kubonakala ngathi zihlala zivuliwe (ukuzingisa kombono, inertia yokubona okubonakalayo). Ndakhe ndayenza into enjalo kwi-arduino.

I-algorithm yomsebenzi ibonakala ngolu hlobo:

  • iqhagamshele i-anode ye-RGB LED yokuqala;
  • wayikhanyisa, enika iimpawu eziyimfuneko kwii-cathodes;
  • ulinde ukuphela komjikelo we-PWM;
  • iqhagamshele i-anode yesibini ye-RGB LED;
  • yilayithe...

Kulungile, njl. Ngokuqinisekileyo, ngenxa yomsebenzi omhle, kufuneka ukuba udibaniso lwe-anode kunye "nomlilo" lwe-LED lwenzeke ngaxeshanye. Ewe, phantse. Kwimeko nayiphi na into, kufuneka sibhale ikhowudi eya kuvelisa amaxabiso kwiitshaneli ezintathu zesibali-xesha sesibini, sizitshintshe xa i-UEV ifikelelwe kwaye kwangaxeshanye utshintshe iRGB LED esebenzayo ngoku.

Ekubeni ukutshintshwa kwe-LED kuzenzekelayo, kufuneka senze "imemori yevidiyo" ukusuka apho umphathi wokuphazamiseka uya kufumana idatha. Olu luluhlu olulula:

uint8_t colors[8][3];

Ukuze utshintshe umbala we-LED ethile, kuya kukwanela ukubhala amaxabiso ayimfuneko kuloluhlu. Kwaye ukuguquguquka kuya kuba noxanduva lwenani le-LED esebenzayo

uint8_t cnt;

Idemux

Ukuphindaphinda okufanelekileyo, sifuna, ngokungaqhelekanga ngokwaneleyo, i-CD74HC238 demultiplexer. I-Demultiplexer - i-chip eyenza umqhubi kwi-hardware <<. Ngezikhonkwane ezintathu zokufaka (iibits 0, 1 kunye no-2) simondla ngenani lamasuntswana amathathu X, kwaye ekuphenduleni uvula inani lemveliso (1<<X). Amagalelo aseleyo etshiphu asetyenziselwa ukulinganisa uyilo lonke. Sifuna le chip kungekuphela nje ukunciphisa inani lezikhonkwane ezihlala kwi-microcontroller, kodwa kunye nokhuseleko - ukuze ungavuli ngengozi ii-LED ezininzi kunokuba kunokwenzeka kwaye ungatshisi iMK. I-chip ixabisa i-penny, kufuneka ihlale igcinwe kwi-first-aid kit ekhaya.

I-CD74HC238 iya kuba noxanduva lokubonelela ngombane kwi-anode ye-LED efunekayo. Kwi-multiplex epheleleyo, iya kubonelela nge-voltage kwikholamu nge-P-MOSFET, kodwa kule demo, ungayenza ngokuthe ngqo, kuba. itsala 20mA, ngokutsho Amanqaku aphezulu apheleleyo kwiphepha ledatha. Ukusuka Idatha ye-CD74HC238 sifuna ipinout kunye neli phepha lokukopela:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
H = inqanaba eliphezulu lombane, L = inqanaba le-voltage ephantsi, i-X - ayinandaba

Sidibanisa i-E2 kunye ne-E1 emhlabeni, i-E3, i-A0, i-A1 kunye ne-A3 kwizikhonkwane ze-PD5, i-PC3, i-PC4 kunye ne-PC5 ye-STM8. Kuba le theyibhile ingentla iqulathe amanqanaba aphantsi naphezulu, simisa ezi zikhonkwane njengezikhonkwane zokutyhala.

PWM

I-PWM kwisibali-xesha sesibini iqwalaselwe ngendlela efanayo nakwibali langaphambili, ngeyantlukwano emibini:

Okokuqala, kufuneka sivule uphazamiseko Isiganeko sohlaziyo (UEV) eyakubiza umsebenzi ukuguqula i-LED esebenzayo. Oku kwenziwa ngokutshintsha isuntswana Hlaziya isiphazamiso Vulela kwirejista enegama elithethayo

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
Ukuphazamisa irejista yokuvula

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Umahluko wesibini udityaniswe nesenzeko esinjalo sokuphindaphinda njenge isiporho - ukuvutha kweparasitic yeediode. Kwimeko yethu, kunokuvela ngenxa yokuba isibali-xesha, sibangele ukuphazamiseka kwi-UEV, siyaqhubeka nokuphawula, kwaye umphathi wokuphazamiseka akanalo ixesha lokutshintsha i-LED ngaphambi kokuba isibali-xesha siqale ukubhala into kwiziphumo. Ukulwa noku, kuya kufuneka uguqule i-logic (0 = ukukhanya okuphezulu, 255 = akukho nto ivuliwe) kwaye ungavumeli amaxabiso omjikelezo womsebenzi ogqithisileyo. Ezo. qinisekisa ukuba emva kwe-UEV ii-LED zicinywa ngokupheleleyo kumjikelo omnye we-PWM.

Guqula i-polarity:

//set polarity 
    TIM2_CCER1 |= (CC1P | CC2P);
    TIM2_CCER2 |= CC3P;

Kuphephe ukuseta r, g kunye b ukuya 255 kwaye ukhumbule ukuziguqula xa usebenzisa.

Iyaphazamisa

Undoqo wokuphazamiseka kukuba, phantsi kweemeko ezithile, i-chip iyayeka ukwenza inkqubo ephambili kwaye ibiza umsebenzi othile wangaphandle. Ukuphazamiseka kwenzeka ngenxa yeempembelelo zangaphandle okanye zangaphakathi, kubandakanywa ukusuka kwi-timer.

Xa sasiqala ukwenza iprojekthi kwi-ST Visual Development, ngaphandle kwe main.c sifumene ifestile enefayile engaqondakaliyo stm8_interrupt_vector.cifakwe ngokuzenzekelayo kwiprojekthi. Kule fayile, umsebenzi uncanyathiselwe kwisiphazamiso ngasinye NonHandledInterrupt. Kufuneka sibophe umsebenzi wethu kwisiphazamiso esifunekayo.

I-database inetafile yokuphazamiseka kwe-vectors, apho sifumana ezo sizifunayo:

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8
13 TIM2 uhlaziyo/ukuphuphuma
14 TIM2 Thatha/Thelekisa

Kufuneka sitshintshe i-LED kwi-UEV, ngoko ke ukuphazamisa #13 kuyafuneka.

Ngokufanelekileyo, okokuqala, kwifayile stm8_interrupt_vector.c tshintsha igama lomsebenzi onoxanduva lokuphazamisa inombolo ye-13 (IRQ13) ngokungagqibekanga ibe yeyethu:

{0x82, TIM2_Overflow}, /* irq13 */

Okwesibini, kuya kufuneka senze ifayile main.h umxholo onje:

#ifndef __MAIN_H
#define __MAIN_H

@far @interrupt void TIM2_Overflow (void);
#endif

Kwaye ekugqibeleni, bhala lo msebenzi kweyakho main.c:

@far @interrupt void TIM2_Overflow (void)
{
    PD_ODR &= ~(1<<5); // вырубаем демультиплексор
    PC_ODR = (cnt<<3); // записываем в демультиплексор новое значение
    PD_ODR |= (1<<5); // включаем демультиплексор

    TIM2_SR1 = 0; // сбрасываем флаг Update Interrupt Pending

    cnt++; 
    cnt &= 7; // двигаем счетчик LED

    TIM2_CCR1L = ~colors[cnt][0]; // передаем в буфер инвертированные значения
    TIM2_CCR2L = ~colors[cnt][1]; // для следующего цикла ШИМ
    TIM2_CCR3L = ~colors[cnt][2]; // 

    return;
}

Ihlala ivumela iziphazamiso. Oku kwenziwa ngomyalelo wokuhlanganisa. rim - kuya kufuneka ukhangele kuyo Incwadana yemigaqo:

//enable interrupts
_asm("rim");

Omnye umyalelo wokuhlanganisa - sim - Ucima iziphazamiso. Kufuneka zikhubaziwe ngelixa amaxabiso amatsha ebhalwa "kwimemori yevidiyo" ukuze ukuphazamiseka okubangelwe ngexesha elibi kungonakalisi uluhlu.

Yonke ikhowudi - kwiGithub.

Funda i-database 2: SPI kwi-STM32; I-PWM, izibali-xesha kunye nokuphazamiseka kwi-STM8

Ukuba ubuncinane umntu eli nqaku luncedo, ngoko andizange ndibhale ngeze. Ndiya kuvuya kwizimvo kunye namazwana, ndiya kuzama ukuphendula konke.

umthombo: www.habr.com

Yongeza izimvo