Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

В ingxenye yokuqala Ngazama ukutshela onjiniyela bezinto zokuzilibazisa ze-elekthronikhi abakhule besuka ebhulukweni le-Arduino ukuthi kungani kufanele bafunde ama-database kanye neminye imibhalo yama-microcontrollers. Umbhalo waba mkhulu, ngakho ngathembisa ukubonisa izibonelo eziwusizo kwesinye isihloko. Hhayi-ke, wayezibiza ngekhowe lobisi...

Namuhla ngizokukhombisa ukuthi ungasebenzisa kanjani idatha yedatha ukuze uxazulule kalula, kodwa kudingekile kumaphrojekthi amaningi, imisebenzi ku-STM32 (Iphilisi Eliluhlaza) kanye nezilawuli ze-STM8. Wonke amaphrojekthi wedemo anikezelwe kuma-LED engiwathandayo, sizowakhanyisa ngobuningi, okuzodingeka sisebenzise zonke izinhlobo zamapheripheral ezithakazelisayo.

Umbhalo uphinde waba mkhulu, ngakho-ke ukuze kube lula ngenza okuqukethwe:

Iphilisi Eliluhlaza okwesibhakabhaka le-STM32: Ama-LED ayi-16 anomshayeli we-DM634
I-STM8: Ukusetha izikhonkwane ze-PWM eziyisithupha
I-STM8: Ama-LED angu-8 RGB kumaphini amathathu, aphazamisa

Ukuzihlangula: Angiyena unjiniyela, angizenzi nginolwazi olujulile ku-electronics, i-athikili ihloselwe izimfundamakhwela ezinjengami. Eqinisweni, ngangizibheka eminyakeni emibili edlule njengabalaleli engiqondiswe kubo. Ukube othile wayengitshele ngaleso sikhathi ukuthi ama-database e-chip engingawajwayele ayengesabi ukuwafunda, ngangingeke ngichithe isikhathi esiningi ngifuna izingcezu zekhodi ku-inthanethi futhi ngisungula izinduku ezinezikele kanye ne-adhesive tape.

Ukugxila kwalesi sihloko kuma-database, hhayi amaphrojekthi, ngakho-ke ikhodi ingase ingabi kahle kakhulu futhi ihlale iminyene. Amaphrojekthi ngokwawo alula kakhulu, nakuba efanelekile ukujwayelana ne-chip entsha.

Ngithemba ukuthi isihloko sami sizosiza othile osesigabeni esifanayo sokucwiliswa emsebenzini wokuzilibazisa.

I-STM32

Ama-LED angu-16 ane-DM634 ne-SPI

Iphrojekthi encane esebenzisa Iphilisi Eliluhlaza (STM32F103C8T6) kanye nomshayeli we-DM634 LED. Sisebenzisa ama-database, sizothola umshayeli, amachweba we-STM IO futhi silungiselele i-SPI.

DM634

I-chip yaseTaiwan enemiphumela engu-16 16-bit PWM, ingaxhunywa ngamaketango. Imodeli ephansi ye-12-bit yaziwa kusukela kuphrojekthi yasekhaya I-Lightpack. Ngesinye isikhathi, ukukhetha phakathi kwe-DM63x ne-TLC5940 eyaziwa kakhulu, ngakhetha i-DM ngezizathu eziningana: 1) I-TLC ku-Aliexpress iyinkohliso nakanjani, kodwa lena ayikho; 2) I-DM ine-PWM ezimele ene-generator yayo yamafrikhwensi; 3) ingathengwa ngokushibhile eMoscow, kunokulinda iphasela elivela ku-Ali. Futhi, yiqiniso, kwakuthakazelisa ukufunda indlela yokulawula i-chip ngokwakho, kunokusebenzisa umtapo wolwazi owenziwe ngomumo. Ama-chips manje avezwa kakhulu kuphakheji ye-SSOP24; kulula ukuwathengisa ku-adaptha.

Njengoba umkhiqizi engowaseTaiwan, ishidi le-data i-chip ibhalwe ngesi-Chinese English, okusho ukuthi kuzoba mnandi. Okokuqala sibheka i-pinout (Phina Uxhumano) ukuqonda ukuthi yimuphi umlenze okumele uxhumeke kuwo, kanye nencazelo yezikhonkwane (Iphinikhodi Incazelo). 16 izikhonkwane:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Imithombo Yokucwila ye-DC (Open Drain)

Qhwa / Okuphumayo kwe-Open-drain - ukudonsa; umthombo wamanje ongenayo; okukhiphayo kuxhunywe emhlabathini esimweni esisebenzayo - ama-LED axhunywe kumshayeli ngama-cathodes. Ngogesi, lokhu, yiqiniso, akuwona "i-drain evulekile" (vula i-drain), kodwa kuma-database lokhu kuchazwa kwezikhonkwane kumodi yokudonsa kuvame ukutholakala.

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Izinqamuli zangaphandle phakathi kwe-REXT ne-GND ukuze kusethwe inani lamanje lokuphumayo

I-reference resistor ifakwe phakathi kwephinikhodi ye-REXT nomhlabathi, olawula ukumelana kwangaphakathi kokuphumayo, bheka igrafu ekhasini 9 lemininingwane. Ku-DM634, lokhu kumelana nakho kungalawulwa yi-software, ukubeka ukukhanya okuphelele (ukukhanya komhlaba wonke); Ngeke ngingene emininingwaneni kulesi sihloko, ngizovele ngibeke i-resistor engu-2.2 - 3 kOhm lapha.

Ukuze uqonde ukuthi ungayilawula kanjani i-chip, ake sibheke incazelo yesixhumi esibonakalayo sedivayisi:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Yebo, nansi i-Chinese English kuyo yonke inkazimulo yayo. Ukuhumusha lokhu kuyinkinga, ungakuqonda uma ufisa, kodwa kukhona enye indlela - bheka ukuthi uxhumano lwe-TLC5940 esebenzayo luchazwe kanjani kumininingwane:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
... Kudingeka izikhonkwane ezintathu kuphela ukuze ufake idatha ocingweni. Unqenqema olukhuphukayo lwesignali ye-SCLK lususa idatha isuka kuphinikhodi ye-SIN iye kurejista yangaphakathi. Ngemuva kokuthi yonke idatha isilayishiwe, isignali emfushane ephezulu ye-XLAT ibamba idatha edluliselwe ngokulandelana kumarejista angaphakathi. Amarejista angaphakathi angamasango aqalwa izinga lesignali ye-XLAT. Yonke idatha idluliswa ngokubaluleke kakhulu kuqala.

Latch – i-latch/latch/lock.
Unqenqema olukhuphukayo – umphetho ophambili we-pulse
MSB kuqala - okubaluleke kakhulu (kwesokunxele) ukuya phambili kancane.
ukuze uvale idatha - Dlulisa idatha ngokulandelana (kancane kancane).

izwi isiqhebezo ivame ukutholakala emibhalweni yama-chips futhi ihunyushwa ngezindlela ezihlukahlukene, ngakho-ke ngenxa yokuqonda ngizozivumela

uhlelo oluncane lwezemfundoUmshayeli we-LED empeleni uyirejista yeshifu. "Shift" (ukushintsha) egameni - ukuhamba kancane kwedatha ngaphakathi kwedivayisi: ibhithi elisha ngalinye elishova ngaphakathi liphusha lonke iketango ngaphambili kwalo. Njengoba kungekho muntu ofuna ukubona ukucwayiza okunesiphithiphithi kwama-LED ngesikhathi sokushintsha, inqubo yenzeka kumarejista we-buffer ahlukaniswe namarejista okusebenza ngedamper (isiqhebezo) kuwuhlobo lwegumbi lokulinda lapho amabhithi ahlelwa khona ngokulandelana okufunayo. Uma konke sekumi ngomumo, i-shutter ivula futhi izingcezu ziya emsebenzini, esikhundleni se-batch yangaphambilini. Izwi isiqhebezo emibhalweni yama-microcircuits cishe njalo isho umswakama onjalo, noma ngabe isetshenziswa kuziphi izinhlanganisela.

Ngakho, ukudluliswa kwedatha ku-DM634 kwenziwa kanje: setha okokufaka kwe-DAI enanini lencanyana ebaluleke kakhulu ye-LED ekude, donsa i-DCK phezulu naphansi; setha okokufaka kwe-DAI kunani lebhithi elandelayo, donsa i-DCK; nokunye kuze kube yilapho zonke izingcezu sezidlulisiwe (kungene), ngemva kwalokho sidonsa i-LAT. Lokhu kungenziwa ngesandla (i-bit-bang), kodwa kungcono ukusebenzisa i-interface ye-SPI eklanyelwe lokhu ngokukhethekile, njengoba yethulwe ku-STM32 yethu ngamakhophi amabili.

Iphilisi Eliluhlaza okwesibhakabhaka STM32F103

Isingeniso: Izilawuli ze-STM32 ziyinkimbinkimbi kakhulu kune-Atmega328 kunokuba zibonakale zethusa. Ngaphezu kwalokho, ngenxa yezizathu zokonga amandla, cishe wonke ama-peripherals avaliwe ekuqaleni, futhi imvamisa yewashi ingu-8 MHz kusuka kumthombo wangaphakathi. Ngenhlanhla, abahleli bezinhlelo ze-STM babhale ikhodi eletha i-chip ku-72 MHz “ebaliwe, futhi ababhali bawo wonke ama-IDE engibaziyo bawafake enqubweni yokuqalisa, ngakho-ke asidingi ukuwasha (kodwa ungakwazi uma ufuna ngempela). Kodwa kuzodingeka uvule ama-peripherals.

Amadokhumenti: Iphilisi Eliluhlaza okwesibhakabhaka lifakwe i-STM32F103C8T6 chip edumile, kukhona imibhalo emibili ewusizo yalo:

Kumininingwane singaba nentshisekelo ku-:

  • Amaphinikhodi - ama-chip pinouts - uma kwenzeka sinquma ukwenza amabhodi ngokwethu;
  • Imephu Yenkumbulo – imephu yememori ye-chip ethile. I-Reference Manual inemephu yawo wonke ulayini, futhi ikhuluma ngamarejista owethu angenawo.
  • Ithebula leZincazelo zephinikhodi - ukufakwa kuhlu imisebenzi eyinhloko neminye yamaphini; "kwiphilisi eliluhlaza okwesibhakabhaka" ungathola izithombe ezilula kakhulu ku-inthanethi ngohlu lwamaphini nemisebenzi yawo. Ngakho-ke, ngokushesha sisebenzisa i-pinout ye-Blue Pill futhi sigcine lesi sithombe siseduze:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
QAPHELA: kube nephutha esithombeni esivela ku-inthanethi, eliphawulwe kumazwana, ngiyabonga ngalokho. Isithombe sishintshiwe, kodwa lesi yisifundo - kungcono ukuhlola ulwazi hhayi kuma-database.

Sikhipha imininingwane, sivula i-Reference Manual, futhi kusukela manje kuqhubeke siyisebenzisa kuphela.
Inqubo: sibhekana nokufaka/okuphumayo okujwayelekile, silungiselela i-SPI, sivula ama-peripherals adingekayo.

Okokufaka

Ku-Atmega328, i-I/O isetshenziswa kalula nje, yingakho ukuchichima kwezinketho ze-STM32 kungadida. Manje sidinga kuphela iziphetho, kodwa nalezi zinezinketho ezine:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
vula ipayipi, phusha-donsa, enye i-push-donsa, enye indawo evulekile yokukhipha amanzi

"Pull-push" (phusha-donsa) okukhiphayo okujwayelekile okuvela ku-Arduino, iphinikhodi ingathatha inani elingaba OKUPHAKAMILE noma ELIPHANSI. Kodwa nge "drain evulekile" kukhona ubunzima, nakuba empeleni yonke into ilula lapha:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ukucushwa kokuphumayo / lapho ichweba labelwe okuphumayo: / isivaluli esiphumayo sinikwe amandla: / – imodi yokukhipha amanzi evulekile: “0” kurejista yokukhiphayo yenza i-N-MOS, “1” kurejista yokukhiphayo ishiya ichweba ngemodi ye-Hi-Z ( I-P-MOS ayicushiwe) / – imodi yokuphusha-donsa: “0” kurejista yokukhiphayo yenza i-N-MOS isebenze, “1” kurejista yokukhiphayo yenza i-P-MOS isebenze.

Wonke umehluko phakathi kwe-drain evulekile (vula i-drain) kusuka ku-“push-pull” (phusha-donsa) ukuthi kuphini lokuqala alikwazi ukwamukela isimo ESIPHAKAMILE: lapho ubhala eyodwa kurejista yokuphumayo, iya kwimodi yokumelana okuphezulu (impedance ephezulu, Sawubona-Z). Uma ubhala uziro, iphinikhodi iziphatha ngendlela efanayo kuzo zombili izindlela, ngokunengqondo nangokogesi.

Kumodi evamile yokukhiphayo, iphinikhodi ivele isakaze okuqukethwe kwerejista yokukhiphayo. Kokunye "okuhlukile" kulawulwa ama-peripheral ahambisanayo (bona 9.1.4):

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Uma i-port bit ilungiselelwe njengenye iphinikhodi yomsebenzi, irejista yephinikhodi iyacishwa futhi iphinikhodi ixhunywe kuphinikhodi.

Okunye ukusebenza kwephinikhodi ngayinye kuchazwe ku Izincazelo Zephini Idatha isesithombeni esilandiwe. Embuzweni wokuthi yini okufanele uyenze uma iphinikhodi ineminye imisebenzi eminingana, impendulo inikezwa umbhalo waphansi kudathabhethi:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Uma ama-peripheral amaningi asebenzisa iphinikhodi efanayo, ukuze kugwenywe ukungqubuzana phakathi kokunye ukusebenza, kufanele kusetshenziswe i-peripheral eyodwa kuphela ngesikhathi, eguquliwe kusetshenziswa i-peripheral clock enable bit (kurejista ye-RCC efanele).

Okokugcina, amaphini kumodi yokukhipha nawo anesivinini sewashi. Lesi esinye isici sokulondoloza amandla; esimweni sethu, sivele sikubeke phezulu bese sikukhohlwa.

Ngakho-ke: sisebenzisa i-SPI, okusho ukuthi izikhonkwane ezimbili (ezinedatha kanye nesignali yewashi) kufanele zibe "omunye umsebenzi wokudonsa-ukudonsa", kanti enye (LAT) kufanele ibe "i-push-pull evamile". Kodwa ngaphambi kokubanika, ake sibhekane ne-SPI.

SPI

Olunye uhlelo oluncane lwezemfundo

I-SPI noma i-Serial Peripheral Interface (i-serial peripheral interface) iyisixhumi esibonakalayo esilula nesisebenza kahle kakhulu sokuxhuma i-MK namanye ama-MK kanye nomhlaba wangaphandle uwonke. Isimiso sokusebenza kwayo sesivele sichazwe ngenhla, lapho mayelana nomshayeli we-LED waseShayina (kubhukwana lereferensi, bheka isigaba 25). I-SPI ingasebenza ngemodi eyinhloko (“inkosi”) kanye neyesigqila (“isigqila”). I-SPI ineziteshi ezine eziyisisekelo, okungezona zonke ezingasetshenziswa:

  • I-MOSI, I-Master Output / I-Slave Input: le phinikhodi idlulisela idatha ngemodi eyinhloko, futhi ithola idatha kwimodi yesigqila;
  • I-MISO, I-Master Input / I-Slave Output: ngokuphambene nalokho, yamukela enkosini, futhi idlulisele encekwini;
  • I-SCK, Iwashi Le-serial: isetha imvamisa yokudluliswa kwedatha ku-master noma ithola isignali yewashi encekwini. Ngokuyisisekelo ukushaya amabhithi;
  • I-SS, i-Slave Select: ngosizo lwalesi siteshi, isigqila siyazi ukuthi kukhona okufunwayo kuye. Ku-STM32 ibizwa nge-NSS, lapho N = negative, i.e. isilawuli siba yisigqila uma kukhona umhlabathi kulo mzila. Ihlangana kahle nemodi ye-Open Drain Output, kodwa leyo enye indaba.

Njengakho konke okunye, i-SPI ku-STM32 inothile ngokusebenza, okwenza kube nzima ukuyiqonda. Isibonelo, ayikwazi ukusebenza nge-SPI kuphela, kodwa futhi ne-interface ye-I2S, futhi emibhalweni izincazelo zabo zixutshwe, kuyadingeka ukusika okweqile ngesikhathi. Umsebenzi wethu ulula kakhulu: sidinga nje ukuthumela idatha sisebenzisa i-MOSI ne-SCK kuphela. Siya esigabeni 25.3.4 (ukuxhumana okuyi-half-duplex, ukuxhumana kwe-half-duplex), lapho sithola khona Iwashi elingu-1 nentambo yedatha eyi-unidirectional engu-1 (Isiginali yewashi elingu-1 kanye nokusakaza kwedatha oku-1 okukodwa):

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Kule modi, uhlelo lokusebenza lusebenzisa i-SPI kumodi yokudlulisa kuphela noma yokwamukela kuphela. Imodi yokudlulisa kuphela ifana nemodi eyi-duplex: idatha idluliselwa kuphinikhodi (i-MOSI ikumodi eyinhloko noma i-MISO kumodi yesigqila), futhi iphinikhodi yokwamukela (i-MISO noma i-MOSI ngokulandelanayo) ingasetshenziswa njengephinikhodi ye-I/O evamile. . Kulokhu, uhlelo lokusebenza ludinga kuphela ukungaziba i-Rx buffer (uma ifundwa, ngeke kube khona idatha edlulisiwe lapho).

Kuhle, iphinikhodi ye-MISO imahhala, masixhume isignali ye-LAT kuyo. Ake sibheke i-Slave Select, okuthi ku-STM32 ingalawulwa ngokohlelo, okuyinto elula kakhulu. Sifunda isigaba segama elifanayo esigabeni 25.3.1 SPI Incazelo Ejwayelekile:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ukulawulwa kwesofthiwe ye-NSS (SSM = 1) / Ulwazi lokukhetha izigqila luqukethwe kubhithi ye-SSI yerejista ye-SPI_CR1. Iphinikhodi ye-NSS yangaphandle ihlala imahhala kwezinye izidingo zohlelo lokusebenza.

Sekuyisikhathi sokubhalela amarejista. Nginqume ukusebenzisa i-SPI2, ngifuna ikheli layo eliyisisekelo kumininingwane - esigabeni 3.3 Imephu Yenkumbulo:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Awu, ake siqale:

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

Vula isigaba 25.3.3 ngesihloko esizichazayo “Ukulungiselela i-SPI Kumodi Eyinhloko”:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

1. Setha imvamisa yewashi lomkhiqizo ngamabhithi BR[2:0] kurejista ye-SPI_CR1.

Amarejista aqoqwa engxenyeni yereferensi yegama elifanayo. Ukushintsha ikheli (Ikheli lisusiwe) ku-CR1 - 0x00, ngokuzenzakalelayo zonke izingcezu ziyasulwa (Setha kabusha inani 0x0000):

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Amabhithi e-BR asetha isihlukanisi sewashi lesilawuli, ngaleyo ndlela inquma imvamisa lapho i-SPI izosebenza khona. Imvamisa yethu ye-STM32 izoba ngu-72 MHz, umshayeli we-LED, ngokusho kwedatha yedatha yayo, usebenza nemvamisa efinyelela ku-25 MHz, ngakho-ke sidinga ukuhlukanisa ngezine (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. Setha amabhithi e-CPOL kanye ne-CPHA ukuze uchaze ubudlelwano phakathi kokudluliswa kwedatha nesikhathi sewashi le-serial (bona umdwebo ekhasini 240)

Njengoba sifunda imininingwane yedatha lapha futhi singabheki i-schematics, ake sibhekisise incazelo yombhalo yamabhithi e-CPOL ne-CPHA ekhasini 704 (Incazelo Evamile Ye-SPI):

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Isigaba sewashi kanye ne-polarity
Usebenzisa izingcezu ze-CPOL ne-CPHA zerejista ye-SPI_CR1, ungakhetha ngokohlelo ubudlelwano obune besikhathi. Ibhithi ye-CPOL (i-polarity yewashi) ilawula isimo sesignali yewashi lapho kungekho datha edluliswayo. Le bit ilawula izindlela eziyinhloko nezigqila. Uma i-CPOL isethwe kabusha, iphinikhodi ye-SCK iphansi kumodi yokuphumula. Uma ibhithi ye-CPOL isethiwe, iphinikhodi ye-SCK iphezulu ngesikhathi sokuphumula.
Uma ibhithi ye-CPHA (isigaba sewashi) isethiwe, i-high bit trap strobe iwunqenqema lwesibili lwesignali ye-SCK (iwa uma i-CPOL icacile, ikhuphuke uma i-CPOL isethiwe). Idatha ithathwa wushintsho lwesibili kusiginali yewashi. Uma ibhithi ye-CPHA icacile, i-high bit trap strobe iwunqenqema olukhuphukayo lwesignali ye-SCK (unqenqema oluwayo uma i-CPOL isethiwe, umkhawulo okhuphukayo uma i-CPOL isuliwe). Idatha ithathwa ekushintsheni kokuqala kusiginali yewashi.

Njengoba sesilutholile lolu lwazi, sifinyelela esiphethweni sokuthi zombili izingcezu kufanele zihlale zirozi, ngoba Sifuna isignali ye-SCK ihlale iphansi uma ingasetshenziswa, futhi idatha idluliselwe onqenqemeni olukhuphukayo lwe-pulse (bona i-Fig. I-Rising Edge Idatha ye-DM634

Ngendlela, lapha saqala ukuhlangana nesici sesilulumagama kumininingwane ye-ST: kuzo igama elithi "setha kabusha i-bit ku-zero" libhaliwe. ukusetha kabusha kancanekodwa cha ukusula kancane, njengesibonelo, i-Atmega.

3. Setha ibhithi ye-DFF ukuze unqume ukuthi ibhulokhi yedatha iyifomethi engu-8-bit noma engu-16-bit

Ngithathe ngokukhethekile i-DM16 engu-634-bit ukuze ngingazihluphi ngokuthumela idatha ye-12-bit PWM, njenge-DM633. Kunengqondo ukusetha i-DFF ibe yinye:

#define DFF         0x0800

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

4. Lungiselela ibhithi ye-LSBFIRST kurejista ye-SPI_CR1 ukuze unqume ifomethi yebhulokhi

I-LSBFIRST, njengoba negama layo liphakamisa, ilungiselela ukudluliswa okuncane okungabalulekile kuqala. Kodwa i-DM634 ifuna ukwamukela idatha kusukela entweni ebaluleke kakhulu. Ngakho-ke, siyishiya ihlelwe kabusha.

5. Kumodi yezingxenyekazi zekhompuyutha, uma okokufaka okuvela kuphinikhodi ye-NSS kudingekile, sebenzisa isignali ephezulu ephinikhodi ye-NSS phakathi nalo lonke uhlelo lokudluliswa kwebhayithi. Kumodi yesofthiwe ye-NSS, setha amabhithi e-SSM ne-SSI kurejista ye-SPI_CR1. Uma iphinikhodi ye-NSS izosetshenziswa njengokukhiphayo, ibhithi le-SSO kuphela elidinga ukusethwa.

Faka i-SSM ne-SSI ukuze ukhohlwe ngemodi yehadiwe ye-NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Izingcezu ze-MSTR kanye ne-SPE kufanele zisethwe (zihlala zisethiwe kuphela uma isignali ye-NSS iphezulu)

Empeleni, ngalawa mabhithi siqoka i-SPI yethu njengengcweti futhi siyivule:

#define MSTR        0x0004
#define SPE         0x0040

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

I-SPI imisiwe, masibhale ngokushesha imisebenzi ethumela amabhayithi kumshayeli. Qhubeka ufunda 25.3.3 “Ilungiselela i-SPI kumodi eyinhloko”:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
I-oda lokudlulisa idatha
Ukudlulisela kuqala lapho ibhayithi ibhalwa kubhafa ye-Tx.
I-data byte ilayishwa kurejista yeshifu ku ngokuhambisana Imodi (kusuka ebhasini langaphakathi) ngesikhathi sokudluliselwa kwe-bit yokuqala, emva kwalokho idluliselwa ku ngokulandelana Imodi yephinikhodi ye-MOSI, eyokuqala noma yokugcina kancane kuya ngokulungiselelwa kwebhithi ye-LSBFIRST kurejista ye-CPI_CR1. Ifulegi le-TXE lisethwa ngemva kokudluliswa kwedatha ukusuka ku-Tx buffer kuya kurejista yokushift, futhi idala ukuphazamiseka uma ibhithi ye-TXEIE kurejista ye-CPI_CR1 isethiwe.

Ngigqamise amagama ambalwa ekuhumusheni ukuze ngidonse ukunaka esicini esisodwa sokusetshenziswa kwe-SPI kuzilawuli ze-STM. Ku-Atmega ifulegi le-TXE (I-Tx Engenalutho, i-Tx ayinalutho futhi ilungele ukwamukela idatha) isethwa kuphela ngemva kokuba yonke ibhayithi isithunyelwe ngaphandle. Futhi lapha leli fulegi lisethwa ngemva kokuba i-byte ifakiwe kurejista yeshifu yangaphakathi. Njengoba iphushwa lapho nazo zonke izingcezu ngesikhathi esifanayo (ngokuhambisanayo), bese idatha idluliselwa ngokulandelana, i-TXE isethwe ngaphambi kokuthi i-byte ithunyelwe ngokuphelele. Lokhu kubalulekile ngoba esimweni somshayeli wethu we-LED, sidinga ukudonsa iphinikhodi ye-LAT ngemva kokuthumela всех idatha, i.e. Ifulegi le-TXE lilodwa ngeke lisanele.

Lokhu kusho ukuthi sidinga elinye ifulegi. Ake sibheke ku-25.3.7 - "Amafulegi Wesimo":

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
<…>
Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ifulegi elimatasa
Ifulegi le-BSY liyasethwa futhi lisulwe yihadiwe (ukulibhalela akunamphumela). Ifulegi le-BSY libonisa isimo sesendlalelo sokuxhumana se-SPI.
Isetha kabusha:
lapho ukudlulisa kuqediwe (ngaphandle kwemodi eyinhloko uma ukudlulisa kuqhubeka)
uma i-SPI ivaliwe
uma kwenzeka iphutha lemodi eyinhloko (MODF=1)
Uma ukudlulisa kungaqhubeki, ifulegi le-BSY liyasulwa phakathi kokudluliswa kwedatha ngakunye

Kulungile, lokhu kuzofika kahle. Ake sithole ukuthi i-Tx buffer ikuphi. Ukuze wenze lokhu, funda “Irejista Yedatha ye-SPI”:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Izingcezu 15:0 DR[15:0] Irejista Yedatha
Idatha etholiwe noma idatha ezodluliswa.
Irejista yedatha ihlukaniswe ngamabhafa amabili - eyokubhala (dlulisa ibhafa) neyokufunda (thola ibhafa). Ukubhalela irejista yedatha kubhala kubhafa ye-Tx, futhi ukufunda kurejista yedatha kuzobuyisela inani eliqukethwe kubhafa ye-Rx.

Hhayi-ke, nerejista yesimo, lapho kutholakala amafulegi we-TXE ne-BSY:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Siyabhala:

#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
}

Hhayi-ke, njengoba sidinga ukudlulisa izikhathi eziyi-16 ngamabhayithi amabili, ngokwenani lemiphumela yomshayeli we-LED, into enjengale:

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 ukuthi siyidonsa kanjani iphinikhodi ye-LAT okwamanje, ngakho-ke sizobuyela ku-I/O.

Izikhonkwane zokwabela

Ku-STM32F1, amarejista anesibopho sesimo sezikhonkwane awavamile neze. Kuyacaca ukuthi ziningi kune-Atmega, kodwa futhi zihlukile kwamanye ama-STM chips. Isigaba 9.1 Incazelo Ejwayelekile ye-GPIO:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Imbobo ngayinye yenhloso evamile ye-I/O (GPIO) inamarejista amabili okucushwa angama-32-bit (GPIOx_CRL kanye ne-GPIOx_CRH), amarejista amabili edatha angama-32-bit (GPIOx_IDR kanye ne-GPIOx_ODR), irejista engamabhithi angu-32/yokusetha kabusha (GPIOx_BSRR), irejista yokusetha kabusha engu-16-bit (GPIOx_BRR) kanye ne-32- irejista yokuvimbela kancane (GPIOx_LCKR).

Amarejista amabili okuqala awajwayelekile, futhi abuye aphazamiseke, ngoba izikhonkwane zembobo eziyi-16 zihlakazekile kuwo wonke ngefomethi ethi "amabhithi amane ngomfowethu". Labo. izikhonkwane ezithi ziro kuye kweziyisikhombisa ziku-CRL, kanti ezinye ziku-CRH. Ngesikhathi esifanayo, amarejista asele aqukethe ngempumelelo izingcezu zazo zonke izikhonkwane zechweba - ngokuvamile okusele ingxenye "egodliwe".

Ukuze kube lula, ake siqale kusukela ekugcineni kohlu.

Asiyidingi irejista yokuvimbela.

Amarejista okusetha nokusetha kabusha ayahlekisa kakhulu ngoba aphindaphindeka ngokwengxenye: ungabhala yonke into kuphela ku-BSRR, lapho amabhithi aphezulu ayi-16 azosetha kabusha iphini ku-zero, futhi aphansi azosethelwa ku-1, noma ungakwazi futhi. sebenzisa i-BRR, amabhithi angu-16 aphansi awo asetha kabusha iphinikhodi. Ngithanda inketho yesibili. Lawa marejista abalulekile ngoba ahlinzeka ngokufinyelela kwe-athomu kumaphini:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
I-Atomic Setha noma Setha Kabusha
Asikho isidingo sokukhubaza ukuphazamiseka uma kuhlelwa i-GPIOx_ODR ezingeni elincane: ibhithi eyodwa noma ngaphezulu ingashintshwa ngomsebenzi owodwa wokubhala kwe-athomu APB2. Lokhu kufinyelelwa ngokubhala "1" kurejista yokusetha/yokusetha kabusha (GPIOx_BSRR noma, ngokusetha kabusha kuphela, GPIOx_BRR) yebhithi edinga ukushintshwa. Ezinye izingcezu zizohlala zingashintshiwe.

Amarejista edatha anamagama azichazayo - IDR = Ukufaka Irejista yokuqondisa, irejista yokufaka; ODR = Okukhiphayo Irejista yokuqondisa, irejista yokuphumayo. Ngeke sizidinge kuphrojekthi yamanje.

Futhi ekugcineni, lawula amarejista. Njengoba sinentshisekelo kumaphini we-SPI wesibili, okuyi-PB13, i-PB14 ne-PB15, sibheka ngokushesha i-CRH:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Futhi siyabona ukuthi sizodinga ukubhala okuthile ngamabhithi ukusuka ku-20 kuye ku-31.

Sesivele sicabange ngaphezu kwalokho esikufunayo kumaphini, ngakho-ke lapha ngizokwenza ngaphandle kwesithombe-skrini, ngizosho nje ukuthi i-MODE icacisa isiqondiso (okokufaka uma zombili izingcezu zisethelwe ku-0) kanye nesivinini sephini (sidinga i-50MHz, i.e. kokubili ukuphina ku-“1”), futhi i-CNF ibeka imodi: “push-pull” evamile – 00, “alternative” – 10. Ngokuzenzakalelayo, njengoba sibona ngenhla, wonke amaphini anebhithi yesithathu ukusuka phansi (CNF0), iwabeka kumodi okokufaka okuntantayo.

Njengoba ngihlela ukwenza enye into ngale chip, ukuze kube lula ngichaze wonke amanani angenzeka eMODE kanye ne-CNF kuwo womabili amarejista okulawula aphansi nangaphezulu.

Ngandlela thize kanje

#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 zitholakala echwebeni B (ikheli lesisekelo - 0x40010C00), ikhodi:

#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;

Futhi, ngokufanelekile, ungabhala izincazelo ze-LAT, ezizothintwa amarejista e-BRR 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 just by inertia, bekuhlala kunjalo, kuvumele kuhlale)

Manje konke kuhle, kodwa akusebenzi. Ngenxa yokuthi lokhu kuyi-STM32, zonga ugesi, okusho ukuthi udinga ukunika amandla amawashi okuvala ucingo adingekayo.

Vula iwashi

Iwashi, elaziwa nangokuthi Iwashi, linesibopho sokuwashwa. Futhi sesivele sisiqaphele isifinyezo esithi RCC. Siyibheka emibhalweni: lokhu Ukusetha Kabusha kanye Nokulawula Iwashi.

Njengoba kushiwo ngenhla, ngenhlanhla, ingxenye enzima kakhulu yesihloko sewashi senzelwe thina ngabantu abavela ku-STM, esibabonga kakhulu ngayo (ngiphinde futhi ngizonikeza isixhumanisi Iwebhusayithi kaDi Halt, ukuze kucace ukuthi idida kanjani). Sidinga kuphela amarejista anesibopho sokuvumela iwashi le-peripheral (Iwashi Le-Peripheral Livumela Amarejista). Okokuqala, masithole ikheli eliyisisekelo le-RCC, lisekuqaleni “kweMemori Yemephu”:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

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

Bese uchofoza isixhumanisi lapho uzama ukuthola okuthile epuletini, noma, okungcono kakhulu, udlule ezincazelweni zamarejista okunika amandla ezigabeni ezimayelana vumela amarejista. Lapho sizothola khona i-RCC_APB1ENR ne-RCC_APB2ENR:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Futhi, ngokufanelekile, aqukethe izingcezu ezihlanganisa iwashi le-SPI2, IOPB (I/O Port B) 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;

Ikhodi yokugcina ingatholakala lapha.

Uma unethuba nesifiso sokuhlola, xhuma i-DM634 kanje: I-DAI ku-PB15, i-DCK ku-PB13, i-LAT ku-PB14. Sinika amandla umshayeli kusuka ku-5 volts, ungakhohlwa ukuxhuma izizathu.

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

I-STM8 PWM

I-PWM ku-STM8

Lapho ngihlela nje lesi sihloko, nganquma, njengesibonelo, ukuzama ukuqonda ukusebenza okuthile kwe-chip engajwayelekile usebenzisa idatha yedatha kuphela, ukuze ngingagcini ngiphethe izicathulo ngaphandle kwamabhuzu. I-STM8 yayilungele le ndima: okokuqala, nganginamabhodi ambalwa aseShayina ane-STM8S103, futhi okwesibili, ayidumile kakhulu, ngakho-ke isilingo sokufunda nokuthola isisombululo ku-Inthanethi sincike ekuntuleni kwalezi zixazululo.

I-chip nayo inakho ishidi le-data и Idatha ye-RM0016, okokuqala kukhona amakheli e-pinout nerejista, okwesibili - konke okunye. I-STM8 ihlelwe ngo-C ku-IDE embi kakhulu I-ST Visual Development.

Iwashi kanye ne-I/O

Ngokuzenzakalelayo, i-STM8 isebenza ngemvamisa engu-2 MHz, lokhu kufanele kulungiswe ngokushesha.

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Iwashi le-HSI (Ijubane Eliphezulu Langaphakathi)
Isignali yewashi le-HSI ithathwe ku-oscillator yangaphakathi engu-16 MHz RC enesihlukanisi esihlelekayo (1 kuya ku-8). Isethwe kurejista yesihlukanisi sewashi (CLK_CKDVR).
Qaphela: ekuqaleni, i-oscillator ye-HSI RC ene-dider ye-8 ikhethwa njengomthombo oholayo wesignali yewashi.

Sithola ikheli lerejista kumininingwane, incazelo ku-refman futhi sibona ukuthi irejista idinga ukusulwa:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Njengoba sizosebenzisa i-PWM futhi sixhume ama-LED, ake sibheke i-pinout:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

I-chip incane, imisebenzi eminingi imisiwe kuzikhonkwane ezifanayo. Okukubakaki abayisikwele “ukusebenza okunye”, kushintshwa ngokuthi “option bytes” (inketho yamabhayithi) - into efana ne-Atmega fuses. Ungashintsha amanani abo ngokohlelo, kodwa akudingekile, ngoba Umsebenzi omusha ucushwa kuphela ngemva kokuqalisa kabusha. Kulula ukusebenzisa i-ST Visual Programmer (elandiwe nge-Visual Develop), engashintsha lawa mabhayithi. Iphinikhodi libonisa ukuthi izikhonkwane ze-CH1 ne-CH2 zesibali sikhathi sokuqala zifihlwe kubakaki abayisikwele; kuyadingeka ukusetha amabhithi e-AFR1 kanye ne-AFR0 ku-STVP, kanti eyesibili izophinde idlulise okukhiphayo kwe-CH1 kwesibali sikhathi sesibili ukusuka ku-PD4 kuya ku-PC5.

Ngakho, izikhonkwane eziyisi-6 zizolawula ama-LED: i-PC6, i-PC7 ne-PC3 yesibali sikhathi sokuqala, i-PC5, i-PD3 ne-PA3 okwesibili.

Ukusetha izikhonkwane ze-I/O ngokwazo ku-STM8 kulula futhi kunengqondo kakhulu kunaku-STM32:

  • ojwayelekile kwirejista yedatha ye-Atmega DDR (Irejista Yeziqondiso Zedatha): 1 = okukhiphayo;
  • irejista yokulawula yokuqala engu-CR1, lapho okukhiphayo, isetha imodi yokudonsa (1) noma i-drain evulekile (0); njengoba ngixhuma ama-LED ku-chip nge-cathodes, ngishiya ama-zero lapha;
  • irejista yesibili yokulawula i-CR2, lapho okukhiphayo, isetha isivinini sewashi: 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

Ukulungiselelwa kwe-PWM

Okokuqala, ake sichaze imigomo:

  • Imvamisa ye-PWM - imvamisa lapho isibali-sikhathi sisebenza ngaso;
  • Layisha kabusha ngokuzenzakalelayo, AR - inani elilayisheka ngokuzenzakalelayo kuze kufike lapho isibali-sikhathi sizobala khona (isikhathi sokushaya kwenhliziyo);
  • Umcimbi wokuvuselela, i-UEV - umcimbi owenzeka lapho isibali sikhathi sibale ku-AR;
  • PWM Duty Cycle - Umjikelezo womsebenzi we-PWM, ovame ukubizwa ngokuthi "isici somsebenzi";
  • Thatha/Qhathanisa Inani – inani lokuthwebula/ukuqhathanisa, lapho isibali sikhathi sibalwe khona uzokwenza okuthile (esimweni se-PWM, iguqula isignali yokuphumayo);
  • Layisha ngaphambilini Inani – inani elilayishwe kuqala. Qhathanisa inani ayikwazi ukushintsha ngenkathi isibali-sikhathi siphawula, ngaphandle kwalokho umjikelezo we-PWM uzophuka. Ngakho-ke, amanani amasha adlulisiwe afakwa ku-buffer futhi akhishwe lapho isibali sikhathi sifika ekupheleni kokubala kwaso futhi sisethwa kabusha;
  • Iqondaniswe nomphetho и Amamodi aqondaniswe namaphakathi - ukuqondanisa emngceleni naphakathi nendawo, okufana ne-Atmel's I-PWM esheshayo и I-PWM elungile esigabeni.
  • I-OCiREF, Isiginali yereferensi yokuphumayo – isignali yokuphuma kwereferensi, empeleni, okuvela kuphinikhodi ehambisanayo kwimodi ye-PWM.

Njengoba sekucacile kakade ku-pinout, izibali sikhathi ezimbili zinamandla e-PWM - eyokuqala neyesibili. Zombili ziyi-16-bit, eyokuqala inezici eziningi ezengeziwe (ikakhulukazi, ingabala kokubili phezulu naphansi). Sidinga kokubili ukusebenza ngokulinganayo, ngakho-ke nginqume ukuqala ngesesibili ngokusobala esimpofu, ukuze ngingasebenzisi ngephutha into engekho. Enye inkinga ukuthi incazelo yokusebenza kwe-PWM yazo zonke izibali zesikhathi kubhukwana lereferensi isesahluko esimayelana nesibali sikhathi sokuqala (17.5.7 Imodi ye-PWM), ngakho kufanele weqe uye phambili naphambili kuyo yonke idokhumenti ngaso sonke isikhathi.

I-PWM ku-STM8 inenzuzo ebalulekile kune-PWM ku-Atmega:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
I-PWM Eqondaniswe Nomngcele
Ukucushwa kwe-akhawunti kusuka phansi kuye phezulu
Ukubala okuya phansi kuya phezulu kuyasebenza uma ibhithi ye-DIR kurejista ye-TIM_CR1 isuliwe
Isibonelo:
Isibonelo sisebenzisa imodi yokuqala ye-PWM. Isignali yereferensi ye-PWM i-OCiREF iphakanyiswe phezulu uma nje i-TIM1_CNT <TIM1_CCRi. Uma kungenjalo kuthatha izinga eliphansi. Uma inani lokuqhathanisa kurejista ye-TIM1_CCRi likhulu kunevelu yokulayisha okuzenzakalelayo (irejista ye-TIM1_ARR), isignali ye-OCiREF ibanjwe ku-1. Uma inani lokuqhathanisa lingu-0, i-OCiREF ibanjwe ku-zero....

Isikhathi se-STM8 ngesikhathi buyekeza umcimbi ihlola kuqala qhathanisa inani, bese kuphela lapho kukhiqiza isignali yereferensi. Isibali sikhathi sika-Atmega siqale siqhathanise bese siqhathanisa, okuholela ekutheni compare value == 0 okuphumayo kuyinaliti, okumele kusetshenzwe ngayo ngandlela thize (isibonelo, ngokuguqula i-logic ngokohlelo).

Ngakho-ke esifuna ukukwenza: 8-bit PWM (AR == 255), ukubala ukusuka phansi kuye phezulu, ukuqondanisa nomngcele. Njengoba amalambu okukhanya exhunywe ku-chip ngama-cathode, i-PWM kufanele ikhiphe u-0 (i-LED ivuliwe) kuze kube qhathanisa inani futhi 1 ngemva.

Sesifundile ngabanye Imodi ye-PWM, ngakho-ke sithola irejista edingekayo yesibali sesikhathi sesibili ngokusesha encwadini yereferensi yalo mushwana (18.6.8 - TIMx_CCMR1):

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
110: Imodi yokuqala ye-PWM – uma ubala ukusuka phansi kuye phezulu, isiteshi sokuqala siyasebenza kuyilapho i-TIMx_CNT <TIMx_CCR1. Uma kungenjalo, isiteshi sokuqala asisebenzi. [okuqhubekayo kudokhumenti kukhona iphutha lokunamathisela kokukopisha kusuka ku-timer 1] 111: Imodi ye-PWM yesibili – uma ubala ukusuka phansi ukuya phezulu, isiteshi sokuqala asisebenzi kuyilapho i-TIMx_CNT <TIMx_CCR1. Uma kungenjalo, isiteshi sokuqala siyasebenza.

Njengoba ama-LED axhunywe ku-MK ngama-cathode, imodi yesibili iyasifanela (eyokuqala nayo, kodwa asikwazi lokho okwamanje).

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
I-Bit 3 OC1PE: Nika amandla ukulayisha kuqala kwephinikhodi 1
0: Irejista yokulayisha kuqala ku-TIMx_CCR1 ivaliwe. Ungabhalela ku-TIMx_CCR1 noma nini. Inani elisha lisebenza ngokushesha.
1: Irejista yokulayisha kuqala ku-TIMx_CCR1 ivuliwe. Ukufunda/ukubhala kufinyelela kurejista yokulayisha kuqala. Inani elilayishwe ngaphambili elithi TIMx_CCR1 lilayishwa kurejista yesithunzi phakathi nomcimbi wokubuyekeza ngamunye.
*Qaphela: Ukuze imodi ye-PWM isebenze kahle, amarejista okulayisha kuqala kufanele anikwe amandla. Lokhu akudingekile kumodi yesiginali eyodwa (ibhithi ye-OPM isethwe kurejista ye-TIMx_CR1).

Kulungile, ake sivule yonke into esiyidingayo eziteshini ezintathu zesibali sikhathi sesibili:

#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 iqukethe amarejista amabili-bit ayisishiyagalombili, yonke into ilula:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Isibali sikhathi sesibili singabala kuphela ukusuka phansi kuye phezulu, ukuqondanisa eduze nomngcele, akukho lutho oludinga ukushintshwa. Ake sisethe isihlukanisi samafrikhwensi, isibonelo, sibe ngu-256. Esibali sikhathi sesibili, isihlukanisi sisethwe kurejista ye-TIM2_PSCR futhi singamandla amabili:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Okusele nje ukuvula iziphetho kanye nesibali sikhathi sesibili uqobo. Inkinga yokuqala ixazululwa ngamarejista Thwebula/Qhathanisa Nika amandla: kunamashaneli amabili, amathathu ahlakazekile kuwo wonke ngokulinganayo. Lapha singakwazi futhi ukufunda ukuthi kungenzeka ukuguqula i-polarity yesiginali, i.e. empeleni, bekungenzeka ukusebenzisa Imodi ye-PWM 1. 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;

Ekugcineni, siqala isibali sikhathi kurejista ye-TIMx_CR1:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Masibhale i-analogue elula ye-AnalogWrite(), ezodlulisela amanani wangempela kusibali sikhathi ukuze siqhathaniswe. Amarejista aqanjwe ngokubikezelwa Thatha/Qhathanisa amarejista, kukhona okubili kwakho esiteshini ngasinye: amabhithi angu-8 e-oda eliphansi ku-TIM2_CCRxL nalawo ane-oda eliphezulu kokuthi TIM2_CCRxH. Njengoba sidale i-8-bit PWM, kwanele ukubhala izingcezu ezingabalulekile kuphela:

#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 olalelayo uzoqaphela ukuthi sine-PWM enephutha kancane, ayikwazi ukukhiqiza ukugcwalisa okungu-100% (ngenani eliphakeme lama-255, isiginali iguqulelwe umjikelezo wesikhathi esisodwa). Kuma-LED lokhu akunandaba, futhi umfundi olalelayo usengakwazi kakade ukuqagela ukuthi angakulungisa kanjani.

I-PWM kusibali sikhathi sesibili siyasebenza, ake sidlulele kweyokuqala.

Isibali sikhathi sokuqala sinamabhithi afanayo ncamashi kumarejista afanayo (ukuthi lawo mabhithi asale "egodliwe" esibali sikhathi sesibili asetshenziswa ngenkuthalo kweyokuqala kuzo zonke izinhlobo zezinto ezithuthukile). Ngakho-ke, kwanele ukuthola amakheli amarejista afanayo kumininingwane bese ukopisha ikhodi. Hhayi-ke, shintsha inani le-frequency divider, ngoba... isibali sikhathi sokuqala asifuni ukuthola amandla amabili, kodwa inani eliqondile le-16-bit kumarejista amabili I-Prescaler High и ongaphakeme. Senza konke futhi... isibali sikhathi sokuqala asisebenzi. Kwenzenjani?

Inkinga ingaxazululwa kuphela ngokubheka kuso sonke isigaba mayelana namarejista okulawula we-timer 1, lapho sibheka leyo isibali-sikhathi sesibili esingenayo. Kuzoba khona 17.7.30 Irejista yekhefu (TIM1_BKR), lapho kukhona lokhu okuncane:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Nika amandla okukhiphayo okuyinhloko

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Yilokho kuphela okuqinisekile manje, ikhodi Lapho.

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

I-STM8 Multiplex

I-Multiplexing ku-STM8

Iphrojekthi encane yesithathu iwukuxhuma ama-RGB LED ayisishiyagalombili kusibali sikhathi sesibili kumodi ye-PWM futhi iwenze abonise imibala ehlukene. Kususelwa kumqondo wokuphindaphindeka kwe-LED, okungukuthi uma uvula futhi ucisha ama-LED, ngokushesha okukhulu, kuzobonakala ngathi ahlala evuliwe (ukuphikelela kombono, inertia yokubona okubonakalayo). Ngake ngenza kanjalo into efana nalokhu ku-Arduino.

I-algorithm yomsebenzi ibonakala kanje:

  • ixhume i-anode ye-RGB LED yokuqala;
  • uyikhanyise, ithumele izimpawu ezidingekayo kuma-cathodes;
  • walinda kwaze kwaba sekupheleni komjikelezo we-PWM;
  • ixhume i-anode yesibili ye-RGB LED;
  • yilayithe...

Awu, njll. Yiqiniso, ukuze usebenze kahle kuyadingeka ukuthi i-anode ixhunywe futhi i-LED "ivutha" ngesikhathi esifanayo. Hhayi-ke, noma cishe. Kunoma ikuphi, sidinga ukubhala ikhodi ezokhipha amanani eziteshini ezintathu zesibali sikhathi sesibili, siziguqule lapho kufinyelelwa i-UEV, futhi ngesikhathi esifanayo sishintshe i-RGB LED esebenzayo njengamanje.

Njengoba ukushintsha kwe-LED kuzenzakalela, sidinga ukudala "imemori yevidiyo" lapho isibambi esiphazamisayo sizothola khona idatha. Lolu uhlelo olulula:

uint8_t colors[8][3];

Ukuze ushintshe umbala we-LED ethile, kuzokwanela ukubhala amanani adingekayo kulolu hlu. Futhi okuguquguqukayo kuzoba nesibopho senani le-LED esebenzayo

uint8_t cnt;

I-Demux

Ukuze uthole ukuphindaphinda okufanele, sidinga, ngokuxakile, i-CD74HC238 demultiplexer. I-Demultiplexer - i-chip esebenzisa opharetha kuhadiwe <<. Ngezikhonkwane zokufaka ezintathu (izinqamuthi 0, 1 kanye no-2) siyiphakela inombolo yamabhithi amathathu X, futhi ekuphenduleni ivula inombolo yokuphumayo (1<<X). Okokufaka okusele kwe-chip kusetshenziselwa ukukala yonke idizayini. Asidingi le chip hhayi kuphela ukunciphisa inani lezikhonkwane ze-microcontroller, kodwa futhi nokuphepha - ukuze singavuli ngephutha ama-LED amaningi ngangokunokwenzeka futhi singashisi i-MK. I-chip ibiza isenti futhi kufanele igcinwe njalo kukhabethe lakho lemithi yasekhaya.

I-CD74HC238 yethu izoba nesibopho sokuhlinzeka nge-voltage ku-anode ye-LED oyifunayo. Ku-multiplex egcwele ngokugcwele, izohlinzeka nge-voltage kukholomu nge-P-MOSFET, kodwa kule demo kungenzeka ngokuqondile, ngoba idonsa 20 mA, ngokusho izilinganiso eziphezulu eziphelele kumininingwane. Kusuka Idatha ye-CD74HC238 sidinga ama-pinouts kanye naleli shidi lokukopela:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
H = izinga lamandla kagesi aphezulu, L = izinga lamandla kagesi aphansi, X – aninandaba

Sixhuma i-E2 ne-E1 emhlabathini, i-E3, A0, A1 ne-A3 ukuze sikhombe i-PD5, i-PC3, i-PC4 ne-PC5 ye-STM8. Njengoba ithebula elingenhla liqukethe womabili amazinga aphansi naphezulu, silungisa lawa maphini njengamaphini wokusunduza.

I-PWM

I-PWM kusibali sikhathi sesibili ilungiselelwe ngendlela efanayo naleyo endabeni edlule, ngokuhlukana okubili:

Okokuqala, sidinga ukunika amandla ukuvuleka Buyekeza Umcimbi (UEV) ezobiza umsebenzi oguqula i-LED esebenzayo. Lokhu kwenziwa ngokushintsha i-bit Vuselela Ukuphazamisa Nika amandla kurejista enegama elishoyo

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
Phakamisa irejista yokunika amandla

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Umehluko wesibili uhlobene nesenzakalo sokuphindaphinda, njenge ghosting - ukukhanya kwe-parasitic kwama-diode. Esimweni sethu, kungase kubonakale ngenxa yokuthi isibali sikhathi, esibangele ukuphazamiseka ku-UEV, siyaqhubeka nokumaka, futhi isibambi esiphazamisayo asinaso isikhathi sokushintsha i-LED ngaphambi kokuba isibali sikhathi siqale ukubhala okuthile ezikhoneni. Ukuze ulwe nalokhu, kuzodingeka uguqule ingqondo (0 = ukukhanya okukhulu, 255 = akukho okukhanyisiwe) futhi ugweme amanani omjikelezo womsebenzi owedlulele. Labo. qinisekisa ukuthi ngemuva kwe-UEV ama-LED aphuma ngokuphelele emjikelezweni owodwa we-PWM.

Ukushintsha i-polarity:

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

Gwema ukuhlela u-r, g no-b kuye ku-255 futhi ukhumbule ukuwaguqula lapho uwasebenzisa.

Iyaphazamisa

Ingqikithi yokuphazamiseka ukuthi ngaphansi kwezimo ezithile i-chip iyayeka ukusebenzisa uhlelo oluyinhloko futhi ibize umsebenzi othile wangaphandle. Iziphazamiso zenzeka ngenxa yamathonya angaphandle noma angaphakathi, okuhlanganisa nesibali sikhathi.

Ngenkathi siqala ukudala iphrojekthi ku-ST Visual Development, ngaphezu kwalokho main.c sithole iwindi elinefayela elingaqondakali stm8_interrupt_vector.c, ifakwe ngokuzenzakalelayo kuphrojekthi. Kuleli fayela, umsebenzi wabelwe isiphazamiso ngasinye NonHandledInterrupt. Kudingeka sibophe umsebenzi wethu ekuphazamiseni esikufunayo.

Idatha inethebula lama-vector aphazamisayo, lapho sithola khona esiwadingayo:

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8
13 I-TIM2 ibuyekeza/ukuchichima
14 TIM2 bamba/qhathanisa

Sidinga ukushintsha i-LED ku-UEV, ngakho-ke sidinga ukuphazamisa #13.

Ngokuvumelana nalokho, okokuqala, kufayela stm8_interrupt_vector.c shintsha igama elimisiwe lomsebenzi onesibopho sokuphazamisa No. 13 (IRQ13) libe elakho:

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

Okwesibili, kuzodingeka sakhe ifayela main.h ngokuqukethwe okulandelayo:

#ifndef __MAIN_H
#define __MAIN_H

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

Ekugcineni, 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;
}

Okusele nje ukunika amandla iziphazamiso. Lokhu kwenziwa kusetshenziswa umyalo we-assembler rim - kuzomele uyibheke Ibhukwana Lokuhlela:

//enable interrupts
_asm("rim");

Omunye umyalo wokuhlanganisa uthi sim – ivala iziphazamiso. Kufanele zivaliwe ngenkathi amanani amasha ebhalwa “kwinkumbulo yevidiyo”, ukuze ukuphazamiseka okubangelwe ngesikhathi esingalungile kungonakalisi amalungu afanayo.

Wonke amakhodi - ku-GitHub.

Ukufundwa kwemininingwane yedatha 2: SPI ku-STM32; I-PWM, izibali sikhathi neziphazamiso ku-STM8

Uma okungenani othile ethola lesi sihloko siwusizo, ngakho-ke angizange ngibhale ngeze. Ngizojabula ukuthola ukuphawula nokuphawula, ngizozama ukuphendula konke.

Source: www.habr.com

Engeza amazwana