Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

В qaybta koowaad Waxaan isku dayay inaan u sheego injineerada hiwaayadaha elektiroonigga ah ee ka soo koray surwaalka Arduino sida iyo sababta ay tahay inay u akhriyaan xaashida xogta iyo dukumeentiyada kale ee kantaroolayaasha. Qoraalku wuxuu noqday mid weyn, markaa waxaan ballanqaaday inaan tusaalooyin wax ku ool ah ku soo bandhigo maqaal gaar ah. Hagaag, wuxuu isku magacaabay likaha caanaha...

Maanta waxaan ku tusi doonaa sida loo isticmaalo xaashida xogta si aad u xalliso wax fudud, laakiin lagama maarmaanka u ah mashruucyo badan, hawlaha STM32 (Plue Pill) iyo STM8 kontaroolayaasha. Dhammaan mashaariicda demo waxaa u heellan LED-yada aan jeclahay, waxaan ku iftiimin doonaa tiro badan, taas oo aan u adeegsan doono dhammaan noocyada durugsan ee xiisaha leh.

Qoraalku mar kale wuxuu noqday mid weyn, markaa si habboon ayaan u samaynayaa nuxurka:

STM32 Pill Buluugga ah: 16 LED oo wata DM634 darawal
STM8: Dejinta lix biin oo PWM ah
STM8: 8 RGB LEDs oo ku yaal saddex biin, kala goysa

Afeef: Ma ihi injineer, iskama dhigayo inaan aqoon qoto dheer u leeyahay qalabka elektaroonigga ah, maqaalka waxaa loogu talagalay hiwaayadda sidayda oo kale. Dhab ahaantii, waxaan isu haystay laba sano ka hor inaan ahay bartilmaameedka bartilmaameedka. Haddii uu qof ii sheegi lahaa markaa in xaashida xogta ee chip-ka aan la aqoon ma ahayn mid cabsi leh in la akhriyo, ma aanan waqti badan ku bixin raadinta qaybo ka mid ah koodka internetka oo aan alifay biro maqas ah iyo cajalad dhejis ah.

Maqaalkani waxa uu diiradda saarayaa xaashida xogta, ma aha mashruucyo, markaa koodku waxa laga yaabaa in aanu aad u hagaagsanayn oo inta badan cidhiidhi ah. Mashruucyada laftoodu waa kuwo aad u fudud, inkastoo ay ku habboon yihiin aqoonta ugu horreysa ee chip-ka cusub.

Waxaan rajeynayaa in maqaalkaygu uu caawin doono qof ku jira marxalad la mid ah oo ku saabsan hiwaayadda.

STM32

16 LED oo leh DM634 iyo SPI

Mashruuc yar oo isticmaalaya kiniinka buluuga ah (STM32F103C8T6) iyo darawalka LED DM634. Isticmaalka xaashiyaha xogta, waxaanu ogaan doonaa darawalka, dekedaha STM IO iyo habaynta SPI.

DM634

Chip Taiwanese ah oo leh 16 16-bit PWM wax soo saar, ayaa lagu xidhi karaa silsilado. Qaabka hoose ee 12-bit waxaa laga yaqaanaa mashruuc gudaha ah Xidhmada laydhka. Hal mar, doorashada inta u dhaxaysa DM63x iyo TLC5940 oo si fiican loo yaqaan, waxaan u doortay DM sababo dhowr ah: 1) TLC on Aliexpress hubaal waa been abuur, laakiin kani maaha; 2) DM waxay leedahay PWM iskeed u madax bannaan oo leh koronto-dhaliye u gaar ah; 3) si jaban ayaa looga iibsan karaa Moscow, halkii laga sugi lahaa baakidh Cali. Iyo, dabcan, waxay ahayd mid xiiso leh inaad barato sida loo xakameeyo jajabka laftaada, halkii aad isticmaali lahayd maktabad diyaarsan. Chips ayaa hadda inta badan lagu soo bandhigay xirmada SSOP24; way fududahay in lagu iibiyo adabtarada.

Maadaama soo saaraha uu yahay Taiwanese, xaashida xogta chip-ku wuxuu ku qoran yahay Ingiriisi Shiinees ah, taas oo macnaheedu yahay inay noqon doonto madadaalo. Marka hore waxaan eegaynaa pinout (Xidhiidhka Pin) si loo fahmo lugta la isku xidho waxa lagu xidho, iyo sharaxaad biinankaFaahfaahin Biin). 16 biin:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Ilaha Quraacda DC (Drain Furan)

Qufac / Wax soo saarka qulqulka furan - biyo-mareen; isha qulqulka qulqulaya; wax soo saarka ayaa ku xiran dhulka ee gobolka firfircoon - LED-yada waxay ku xiran yihiin darawalka by cathodes. Koronto ahaan, tani waa, dabcan, ma aha "qulqul furan" (qulqulo furan), laakiin xaashida xogta waxaa inta badan laga helaa biinanka qaabka bullaacadaha.

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Iska caabiyeyaasha dibadda ee u dhexeeya REXT iyo GND si loo dejiyo qiimaha hadda jira

Iska caabiyaha tixraaca ayaa lagu rakibay inta u dhaxaysa pin-ka REXT iyo dhulka, kaas oo maamula iska caabbinta gudaha ee wax soo saarka, eeg garaafka bogga 9 ee xaashida xogta. DM634, iska caabintan sidoo kale waxaa lagu xakameyn karaa software, dejinta iftiinka guud (iftiin caalami ah; Ma geli doono faahfaahinta maqaalkan, kaliya waxaan halkan gelin doonaa 2.2 - 3 kOhm resistor.

Si aad u fahamto sida loo xakameeyo chip-ka, aan eegno sharraxaadda interface-ka aaladda:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Haa, waa kan, Ingiriisi Shiinees ah oo dhan ammaantiisa. Turjumaadda tani waa dhibaato, waad fahmi kartaa haddii aad rabto, laakiin waxaa jira hab kale - fiiri sida xiriirka shaqada ee TLC5940 loogu qeexay xaashida xogta:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Kaliya seddex biin ayaa loo baahan yahay si ay xogta u geliyaan aaladda. Cidhifka kor u kaca ee calaamada SCLK waxa ay xogta ka beddeshaa pin-ka SIN una beddeshaa diiwaanka gudaha. Kadib marka xogta oo dhan la shubo, calaamad gaaban oo sare oo XLAT ah ayaa ku dhejinaysa xogta sida isdabajooga ah loo wareejiyay diiwaannada gudaha. Diiwaanada gudaha waa albaabada uu kiciyo heerka signalka XLAT. Dhammaan xogta waxa la gudbiyaa inta ugu muhiimsan marka hore.

Latch - qabsato / xidhid / quful.
gees kaca - cidhifka sare ee garaaca wadnaha
MSB marka hore - ugu muhiimsan (bidix) xoogaa hore u socod ah.
in ay saacada xogta - u gudbi xogta si isdaba joog ah (bit by bit).

Erayga qabsato waxaa inta badan laga helaa dukumentiyada loogu talagalay chips waxaana loo tarjumay siyaabo kala duwan, markaa fahamka dartiis waxaan u oggolaan doonaa naftayda

barnaamij waxbarasho oo yarDareewalka LED-ku asal ahaan waa diiwaan-wareejin. "Shift" (wareegMagaca - dhaqdhaqaaqa xogta ee gudaha aaladda: qayb kasta oo cusub oo gudaha lagu soo riixo waxay horay u sii riixdaa dhammaan silsiladda hortiisa. Maaddaama qofna uusan dooneynin inuu fiiriyo libiqsiga qallafsan ee LED-yada inta lagu jiro xilliga beddelka, geeddi-socodku wuxuu ku dhacaa diiwaannada kaydinta ee ka soocay diiwaannada shaqada ee damper (qabsato) waa nooc ka mid ah qolka sugitaanka oo qashin-qubka loo habeeyey sida la rabo. Marka wax walba ay diyaar yihiin, daahyada ayaa furmaya oo qashin-qubka ayaa shaqeynaya, beddelaya dufcaddii hore. Eray qabsato dukumeentiyada microcircuits ku dhawaad ​​had iyo jeer waxay tilmaamayaan qoyaanka noocan oo kale ah, iyada oo aan loo eegin waxa isku-dhafka ah ee loo isticmaalo.

Marka, wareejinta xogta DM634 waxaa loo fuliyaa sidan oo kale: u deji gelinta DAI qiimaha ugu muhiimsan ee LED-ka fog, u jiid DCK kor iyo hoos; u deji gelinta DAI qiimaha inta soo socota, jiid DCK; iyo wixii la mid ah ilaa dhammaan qaybaha la gudbiyo (la xidhay), ka dib waxaan soo jiid LAT. Tan waxaa lagu samayn karaa gacanta (yara-bang), laakiin way fiicantahay in la isticmaalo interface-ka SPI si gaar ah tan loogu talagalay, maadaama lagu soo bandhigay STM32 laba nuqul.

Kiniinka buluuga ah STM32F103

Hordhac: Koontaroolayaasha STM32 aad ayey uga adag yihiin Atmega328 marka loo eego waxay u ekaan karaan cabsi. Intaa waxaa dheer, sababaha tamarta tamarta, ku dhawaad ​​​​dhammaan meelaha durugsan ayaa la damiyay bilowga, iyo inta jeer ee saacaddu waa 8 MHz oo ka timid isha gudaha. Nasiib wanaag, barnaamijyada STM waxay qoreen koodh keenaya jajabka ilaa "la xisaabiyey" 72 MHz, iyo qorayaasha dhammaan IDE-yada aan ogahay waxay ku daraan habka bilowga ah, markaa uma baahnid inaan saacad (laakin) waad awoodaa hadii aad runtii rabto). Laakiin waa inaad shid meelaha ku hareeraysan.

Dukumeenti: Kaniiniga buluuga ah waxaa lagu qalabeeyay chip-ka caanka ah ee STM32F103C8T6, waxaa jira laba dukumeenti oo faa'iido leh:

Xaashida xogta waxa laga yaabaa inaan xiisayno:

  • Pinouts - chip pinouts - haddii aan go'aansanno inaan samayno looxyada nafteena;
  • Khariidadda xusuusta - khariidadda xusuusta ee jajab gaar ah. Buugga Tixraaca wuxuu leeyahay khariidad loogu talagalay khadka oo dhan, wuxuuna xusayaa diiwaannada aan annaga lahayn.
  • Shaxda Qeexitaannada Pin - liiska shaqooyinka ugu muhiimsan iyo kuwa kale ee biinanka; "kaniiniga buluuga ah" waxaad ka heli kartaa sawiro ku haboon internetka oo leh liis biin iyo shaqooyinkooda. Sidaa darteed, isla markiiba google-ka Pill Pill ayaanu ku haynaa sawirkan gacanta:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
FG: qalad baa ka dhacay sawirka laga soo qaaday internetka, kaasoo lagu xusay faallooyinka, waad ku mahadsan tahay taas. Sawirka waa la bedelay, laakiin tani waa cashar - waxa fiican in la hubiyo macluumaadka ee aan ka ahayn xaashida xogta.

Waxaan ka saarna xaashida xogta, furna Buugga Tixraaca, hadda wixii ka dambeeyana waxaan isticmaalnaa oo keliya.
Habka: waxaan la macaamilnaa soo-gelinta/soo-saarka caadiga ah, waxaan habeynaa SPI, shidnaa meelaha lagama maarmaanka ah.

Wax-soo-saarka

Atmega328, I/O si fudud ayaa loo hirgeliyaa, waana sababta tirada badan ee fursadaha STM32 ay u noqon karaan jahawareer. Hadda waxaan u baahanahay gabagabo kaliya, laakiin xitaa kuwani waxay leeyihiin afar doorasho:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
biya-bax furan, jiid-jiid, jiid-jiid beddel ah, biya-mareen kale oo furan

"Jiid-riix" (riix-jiid) waa wax soo saarka caadiga ah ee ka yimaada Arduino, pin-ku wuxuu qaadan karaa qiimaha mid sare ama HOOS AH. Laakiin leh "qulqul furan" waxaa jira dhibaatooyin, inkasta oo runtii wax walba halkan ku fudud yihiin:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Qaabeynta wax soo saarka / marka dekedda loo qoondeeyo soo saarista: / wax soo saarka wax soo saarka ayaa karti u leh: / - qaabka qulqulka furan: "0" ee diiwaanka wax soo saarka wuxuu awood u siinayaa N-MOS, "1" diiwaanka wax soo saarka ayaa ka baxaya dekedda qaabka Hi-Z ( P-MOS lama hawlgelin )/- qaabka riix-jiidista: "0" ee diiwaanka wax soo saarka waxa uu hawlgeliyaa N-MOS, "1" ee diiwaanka wax soo saarka ayaa hawlgeliya P-MOS.

Dhammaan farqiga u dhexeeya qulqulka furan (qulqulo furan) laga bilaabo "push-jiid" (riix-jiid) waa in pin ugu horreeya uusan aqbali karin gobolka HIGH: markaad mid u qorayso diiwaanka wax soo saarka, waxay gashaa habka caabbinta sare (caqabad sare, Hi-Z). Marka la qorayo eber, biinku wuxuu u dhaqmaa isku mid labada qaab, labadaba macquul ahaan iyo koronto ahaanba.

Habka wax soo saarka caadiga ah, biinku wuxuu si fudud u baahiyaa waxa ku jira diiwaanka wax soo saarka. "Beddelka" waxa gacanta ku haya qaybaha u dhigma (eeg 9.1.4):

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Haddii xoogaa dekeddu loo habeeyo sidii biin kale oo shaqo, diiwaanka biinku waa naafo oo biinku waxa uu ku xidhan yahay biinka durugsan.

Waxqabadka beddelka ah ee biin kasta ayaa lagu sifeeyaa Qeexitaannada Pin Xaashida xogta waxay ku taal sawirka la soo dejiyay. Su'aasha ah waxa la samaynayo haddii biinku leeyahay dhowr hawlood oo kale, jawaabta waxaa lagu siinayaa qoraalka hoose ee xaashida xogta:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Haddii meelo badan oo durugsan ay isticmaalaan biin isku mid ah, si looga fogaado isku dhac u dhexeeya hawlo kale, waa in hal dhinac oo keliya la isticmaalo markiiba, iyadoo la beddelayo iyadoo la isticmaalayo saacadda durugsan ee awood u leh (ku qoran diiwaanka RCC ee habboon).

Ugu dambeyntii, biinanka qaabka wax soo saarka sidoo kale waxay leeyihiin xawaare saacad ah. Tani waa sifo kale oo badbaadinta tamarta ah; xaaladdeenna, waxaan u dejineynaa ugu badnaan oo aan illowno.

Marka: waxaan isticmaaleynaa SPI, taas oo macnaheedu yahay in laba biin (oo leh xog iyo calaamad saacad leh) waa inay noqdaan "shaqada riixitaanka beddelka ah", mid kalena (LAT) waa inuu noqdaa "jiid-jiid joogto ah". Laakin ka hor intaanan meeleyn iyaga, aan la macaamilno SPI.

SPI

Barnaamij yar oo waxbarasho

SPI ama Interface Serial Peripheral Interface (interface serial peripheral interface) waa isdhexgal fudud oo aad waxtar u leh isku xirka MK iyo MK-yada kale iyo guud ahaan aduunka ka baxsan. Mabda'a hawlgalkeeda ayaa horeyba kor loogu sharaxay, halkaas oo ku saabsan darawalka LED-ka Shiinaha (buugga tixraaca, fiiri qaybta 25). SPI waxay ku shaqayn kartaa sayid ("sayid") iyo addoon ("addoon") qaabka. SPI waxay leedahay afar kanaal oo aasaasi ah, kuwaas oo aan dhamaantood la isticmaali karin:

  • MOSI, Master Output / Slave Input: biinkani waxa uu ku gudbiyaa xogta habka sare, oo wuxuu ku helaa xogta qaabka addoonka;
  • MISO, Master Input / Slave Output: liddi ku ah, waxay ka heshay sayidkii, waxayna u gudbisaa addoonka;
  • SCK, Serial Clock: wuxuu dejiyaa inta jeer ee gudbinta xogta ee sayidkiisa ama wuxuu helayaa calaamad saacad ah addoonka. Asal ahaan garaacista garaaca;
  • SS, Slave Select: iyadoo la kaashanayo kanaalkan, addoonku wuu ogyahay in wax laga rabo isaga. On STM32 waxaa loo yaqaan NSS, halka N = negative, i.e. kantarooluhu wuxuu noqonayaa addoon haddii uu jiro dhulka kanaalkan. Waxa ay si fiican isugu darsataa qaabka Soo saarista Biyo-baxa Furan, laakiin taasi waa sheeko kale.

Sida wax kasta oo kale, SPI ee STM32 waxay qani ku tahay shaqeynta, taas oo ka dhigaysa xoogaa adag in la fahmo. Tusaale ahaan, ma shaqeyn karto oo keliya SPI, laakiin sidoo kale I2S interface, iyo dukumeentiyada sharraxaaddoodu waa isku dhafan yihiin, waxaa lagama maarmaan ah in la gooyo xad-dhaafka waqtigeeda. Hawsheenu aad bay u fudud tahay: waxaan u baahanahay oo kaliya inaan dirno xogta anagoo adeegsanayna MOSI iyo SCK. Waxaan tageynaa qaybta 25.3.4 (isgaarsiinta hal-duplex, isgaarsiinta nus-duplex), halkaas oo aan ka helno 1 saac iyo 1 silig xogta unidirectional (Signal 1 saac iyo 1 qulqulka xogta aan jiho lahayn):

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Habkan, arjigu wuxuu u isticmaalaa SPI mid ka mid ah gudbinta-kaliya ama qaab-helid-kaliya. / Habka Gudbinta-kaliya waxay la mid tahay qaabka laba-laabashada: xogta waxaa lagu kala qaadaa pin-gudbinta (MOSI in master mode ama MISO qaabka addoonka), iyo pin-helidda (MISO ama MOSI siday u kala horreeyaan) waxaa loo isticmaali karaa sida I / O-da caadiga ah . Xaaladdan oo kale, codsigu wuxuu kaliya u baahan yahay in la iska indhatiro kaydiyaha Rx (haddii la akhriyo, ma jiri doonto xog la wareejiyay halkaas).

Way fiicantahay, biinanka MISO waa bilaash, aynu ku xidhno calaamada LAT. Aynu eegno Xulashada Slave, kaas oo ku yaal STM32 lagu xakameyn karo barnaamij ahaan, taas oo aad ugu habboon. Waxaan akhrinay cutubka isla magaca qaybta 25.3.1 SPI Sharaxaada Guud:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Xakamaynta software NSS (SSM = 1) / Macluumaadka xulashada addoonka waxay ku jirtaa qaybta SSI ee diiwaanka SPI_CR1. Biinka NSS-ta ee dibadda ah ayaa weli bilaash u ah baahiyaha kale ee codsiga.

Waa waqtigii loo qori lahaa diiwaanka. Waxaan go'aansaday inaan isticmaalo SPI2, ka raadi ciwaankeeda salka xaashida xogta - qaybta 3.3 Khariidadda xusuusta:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Hagaag, aan bilowno:

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

Fur qaybta 25.3.3 oo leh ciwaanka is-sharaxaadda ah "Ku-habaynta SPI ee Habka Master":

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

1. Deji inta jeer ee saacada taxane ah oo leh BR[2:0] gudaha diiwaanka SPI_CR1.

Diiwaangelinta waxaa lagu soo ururiyaa qaybta tixraaca ee isla magaca. beddelka ciwaanka (Ciwaanka oo la dhimayCR1 - 0x00, sida caadiga ah dhammaan qaybaha waa la nadiifiyaa (Dib u habeynta qiimaha 0x0000):

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Xirmooyinka BR waxay dejiyaan qaybiyaha saacadaha kontoroolka, sidaas darteed go'aaminta inta jeer ee ay SPI ku shaqeyn doonto. Soo noqnoqoshadayada STM32 waxay noqon doontaa 72 MHz, darawalka LED, marka loo eego xaashida xogta, wuxuu ku shaqeeyaa inta jeer ee ilaa 25 MHz, markaa waxaan u baahanahay inaan u qaybinno afar (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. Deji CPOL iyo CPHA qaniinyada si aad u qeexdo xidhiidhka ka dhexeeya wareejinta xogta iyo wakhtiga saacadaha taxanaha ah (eeg jaantuska bogga 240)

Maadaama aan halkan ku akhrineyno xaashida xogta oo aanan eegin schematics, aan si dhow u eegno sharraxaadda qoraalka ee CPOL iyo CPHA ee bogga 704 (Sharaxaada Guud ee SPI):

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Marxaladda saacadda iyo polarity
Adigoo isticmaalaya qaniinyada CPOL iyo CPHA ee diiwaanka SPI_CR1, waxaad barnaamij ahaan u dooran kartaa afar xiriir waqti. CPOL-ka (saacad polarity) yara waxa ay xakameysaa xaalada calaamada saacada marka aan wax xog ah la gudbin. Qaybtani waxay xakamaysaa hababka sayid iyo addoon. Haddii CPOL dib loo dejiyo, biinanka SCK wuu ku hooseeyaa qaabka nasashada. Haddii xoogaa yar ee CPOL la dejiyo, biinanka SCK wuu sarreeyaa inta lagu jiro qaabka nasashada.
Marka CPHA (wajiga saacada) xoogaa la dhigo, strobe dabin-yar ee sare waa cidhifka labaad ee calaamada SCK (soo dhacaya haddii CPOL ay caddahay, kor u kacaya haddii CPOL la dhigay). Xogta waxaa qabtay isbeddelka labaad ee calaamadda saacadda. Haddii xoogaa yar oo CPHA ah ay caddaato, strobe-ga dabin-yar ee sare waa cidhifka sare ee calaamada SCK (geeska dhacaya haddii CPOL la dhigo, kor u kacaysa haddii CPOL la nadiifiyo). Xogta waxaa lagu qabtaa isbeddelka ugu horreeya ee calaamadda saacadda.

Markaan dhuuxnay aqoontan, waxaan gaadhnay gabagabada in labada qayboodba ay noqdaan eber, sababtoo ah Waxaan rabnaa in signalka SCK uu ahaado mid hooseeya marka aan la isticmaalin, iyo in xogta lagu gudbiyo cidhifka sare ee garaaca wadnaha (eeg sawirka. Kor u kaca ku yaal xaashida xogta DM634).

By habka, halkan waxaan markii ugu horeysay la kulannay sifo ka mid ah ereyada ku jira xaashiyaha xogta ST: iyaga waxaa ku qoran weedha "dib u celi xoogaa eber" in xoogaa dib loo habeeyoiyo ma si loo nadiifiyo xoogaa, sida, tusaale ahaan, Atmega.

3. Deji xoogaa DFF si aad u go'aamiso in xannibaadda xogta ay tahay qaabka 8-bit ama 16-bit

Waxaan si gaar ah u qaatay 16-bit DM634 si aanan ugu dhibin gudbinta xogta 12-bit ee PWM, sida DM633. Waa macno in DFF loo dhigo mid:

#define DFF         0x0800

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

4. Ku qaabbi xoogaa LSBFIRST gudaha diiwaanka SPI_CR1 si loo go'aamiyo qaabka block

LSBFIRST, sida magaceedu soo jeediyo, waxay u habaysaa gudbinta iyada oo ugu yar marka hore. Laakin DM634 waxa ay rabtaa in ay hesho xogta laga bilaabo inta ugu muhiimsan. Sidaa darteed, waxaan ka tagnaa dib u dejinteeda.

5. Qaabka hardware-ka, haddii gelinta NSS-ta loo baahdo, calaamad sare mari pin NSS-ta inta lagu jiro dhammaan isku xigxiga wareejinta byte-ga. Habka software NSS, dhig SSM iyo SSI bits gudaha diiwaanka SPI_CR1. Haddii pin-ka NSS-ta loo isticmaalo soo saarid ahaan, waxa loo baahan yahay oo keliya in la dejiyo qaybta SSOE.

Ku rakib SSM iyo SSI si aad u illowdo qaabka qalabka NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. MSTR iyo SPE bits waa in la dejiyaa (waa in la dejiyaa oo keliya haddii calaamada NSS-ku sarreeyo)

Dhab ahaantii, qaybahan waxaan u magacownay SPI-ga sayid ahaan oo daarnaa:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI waa la habeeyey, aan isla markiiba qorno hawlaha u soo dira bytes darawalka. Akhriska sii wad 25.3.3 "Ku-habaynta SPI ee qaabka sare":

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Dalabka wareejinta xogta
Gudbintu waxay bilaabataa marka byte loo qoro Tx buffer.
Xogta xogta waxa lagu shubaa diiwaanka shaqada ee barbar socda hab (laga bilaabo baska gudaha) inta lagu guda jiro gudbinta ee bit ugu horeysay, ka dib markii taas oo lagu kala qaado isku xiga Qaabka pin-ka MOSI, hore ama horeba u dambeeya iyadoo kuxiran goobta LSBFIRST inyar ee diiwaanka CPI_CR1. Calanka TXE waxa la dejiyay gudbinta xogta kadib laga bilaabo Tx baffer si aad u beddesho diiwaanka, iyo sidoo kale waxay dhalisaa kala-goyn haddii TXEIE bit ee diiwaanka CPI_CR1 la dajiyay.

Waxaan iftiimiyay dhowr kelmadood oo tarjumaadda ah si aan u soo jiito hal sifo oo ka mid ah hirgelinta SPI ee kontaroolayaasha STM. On Atmega calanka TXE (Tx Madhan, Tx waa madhan oo diyaar u ah in la helo xogta) waxa la dejiyay oo kaliya ka dib marka dhammaan byte la diro banaanka. Oo halkan calankan waxaa la dhigay ka dib markii byte la geliyo diiwaanka shaqada gudaha. Maadaama ay halkaas ku riixday dhammaan jajabyada isku mar (oo isku mid ah), ka dibna xogta si isdaba-joog ah ayaa loo gudbiyaa, TXE ayaa la dejiyaa ka hor inta aan gebi ahaanba la dirin byte. Tani waa muhiim sababtoo ah Xaaladda darawalka LED-ka, waxaan u baahanahay inaan jiidno pin-ka LAT ka dib diritaanka всех xogta, i.e. Calanka TXE kaliya naguma filna.

Taas macnaheedu waa in aan u baahanahay calan kale. Aynu eegno 25.3.7 - "Calanka Xaaladda":

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
<…>
Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
MASHQUUL calanka
Calanka BSY waxa la dejiyay oo lagu nadiifiyay qalab (wax loo qoro wax saamayn ah kuma yeelanayso). Calanka BSY waxa uu tilmaamayaa xaaladda lakabka isgaadhsiinta ee SPI.
Waxay dib u dajinaysaa:
marka wareejinta la dhammeeyo (marka laga reebo qaabka master-ka haddii wareejintu ay socoto)
marka SPI ay naafo tahay
marka cilad hab-mastareedka ahi dhacdo (MODF=1)
Haddii wareejintu aysan sii socon, calanka BSY waa la nadiifiyaa inta u dhaxaysa wareejinta xogta

Hagaag, tani waxay ku iman doontaa anfaca Aynu ogaano meesha Tx baffer ku yaal. Si tan loo sameeyo, akhri "Diiwaanka Xogta SPI":

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Bits 15:0 DR[15:0] Diiwaanka Xogta
Xogta la helay ama xogta la gudbinayo.
Diiwaanka xogtu waxa uu u qaybsan yahay laba kayd - mid qoraal ah (transmit buffer) iyo mid akhrin (helid kayd). Ku qorista diiwaanka xogta waxay u qortaa Tx buffer, iyo akhrinta diiwaanka xogta waxay soo celin doontaa qiimaha ku jira kaydiyaha Rx.

Hagaag, iyo diiwaanka xaalada, halka laga helo calamada TXE iyo BSY:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Waxaan qoreynaa:

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

Hagaag, maadaama aan u baahanahay inaan gudbino 16 jeer laba bytes, marka loo eego tirada wax soo saarka darawalka LED, wax sidan oo kale ah:

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

Laakin ma naqaano sida loo jiido pin-ka LAT weli, markaa waxaan ku laaban doonaa I/O.

Qoondaynta biinanka

Gudaha STM32F1, diiwaanka ka mas'uulka ah gobolka biinanka waa wax aan caadi ahayn. Way caddahay inay jiraan in ka badan Atmega, laakiin sidoo kale way ka duwan yihiin chips-yada kale ee STM. Qaybta 9.1 Sharaxaada Guud ee GPIO:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Mid kasta oo ka mid ah dekedaha ujeedada guud ee I/O (GPIO) Waxa uu leeyahay laba diiwaan oo qaabaynta 32-bit ah (GPIOx_CRL iyo GPIOx_CRH), laba xog oo 32-bit ah (GPIOx_IDR iyo GPIOx_ODR), 32-bit set/reset record (GPIOx_BSRR), 16-bit reset record (GPIOx_BRR) iyo 32- diiwaanka xannibaadda yara (GPIOx_LCKR).

Labada diiwaan ee ugu horreeya waa kuwo aan caadi ahayn, sidoo kale waa kuwo aan ku habboonayn, sababtoo ah 16-ka biinanka dekeddu waxay ku kala firirsan yihiin iyaga oo ah qaab "afar xabbadood walaalkii". Kuwaas. biinanka eber ilaa toddobo waxay ku jiraan CRL, inta soo hartayna waxay ku jiraan CRH. Isla mar ahaantaana, diiwaannada soo haray waxay si guul leh uga kooban yihiin dhammaan biinanka dekedda - inta badan waxay soo hartay kala badh "la xafiday".

Si ay u fududaato, aan ka bilowno dhamaadka liiska.

Uma baahnin diiwaanka xannibista.

Dejinta iyo dib-u-dejinta diiwaannada ayaa ah kuwo aad u qosol badan marka ay qayb ahaan isku duuban yihiin: waxaad ku qori kartaa wax walba oo kaliya BSRR, halkaasoo 16-bit ee sare ay dib u dejin doonaan pin ilaa eber, kuwa hoosena waxaa lagu dejin doonaa 1, ama sidoo kale waad awoodaa. adeegso BRR, 16-bit ee hoose oo kaliya oo dib u dejinaya biinanka. Waxaan jeclahay doorashada labaad. Diiwaanadani waa muhiim sababtoo ah waxay bixiyaan marinka atomiga ee biinanka:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Dejinta Atomiga ama Dib u dajinta
Looma baahna in la joojiyo carqaladaynta marka barnaamijka GPIOx_ODR ee heerka waxoogaa ah: hal ama in ka badan ayaa lagu bedeli karaa hal qori oo atomic ah APB2. Tan waxaa lagu gaaraa in loo qoro "1" diiwaanka dejisan/dib-u-dejinta (GPIOx_BSRR ama, dib u dajinta kaliya, GPIOx_BRR) ee xoogaa u baahan in la beddelo. Qaybaha kale waxba kama beddeli doonaan

Diiwaanka xogta ayaa leh magacyo is-sharaxaya - IDR = Input Diiwaanka jihada, diiwaan gelinta; ODR = Output Diiwaanka jihada, diiwaanka wax soo saarka. Uma baahnaan doono iyaga mashruuca hadda socda.

Ugu dambeyntiina, diiwaannada xakamaynta. Maadaama aan xiisayneyno biinanka labaad ee SPI, kuwaas oo kala ah PB13, PB14 iyo PB15, waxaan isla markiiba eegeynaa CRH:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Oo waxaan aragnaa inaan u baahan doono inaan wax ku qorno 20 ilaa 31.

Waxaan horay u ogaanay waxa aan ka rabno biinanka, markaa halkan waxaan ku sameyn doonaa sawir la'aan, kaliya waxaan dhihi doonaa MODE waxay qeexaysaa jihada (gelinta haddii labadaba la dhigo 0) iyo xawaaraha pin (waxaan u baahanahay 50MHz, i.e. Labada pin ilaa "1"), CNF-na waxay dejisaa qaabka: "jiid-jiid" joogto ah - 00, "beddel" - 10. Sida caadiga ah, sida aan kor ku aragno, dhammaan biinanka ayaa leh qaybta saddexaad ee hoose (CNF0), waxay u dejisaa qaab gelin sabayn.

Tan iyo markii aan qorsheynayo inaan wax kale ku sameeyo chip-kan, si fudud ayaan u qeexay dhammaan suurtagalnimada MODE iyo qiyamka CNF labadaba diiwaannada kantaroolka hoose iyo kan sare.

Si uun sidan oo kale

#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

Biinankayadu waxay ku yaalliin dekedda B (cinwaanka saldhigga - 0x40010C00), koodka:

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

Oo, sidaas darteed, waxaad u qori kartaa qeexitaanno loogu talagalay LAT, kaas oo lagu beddeli doono diiwaannada BRR iyo 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 kaliya waa inertia, had iyo jeer sidaas ayay ahaan jirtay, ha joogto)

Hadda wax walba waa weyn yihiin, laakiin ma shaqeeyaan. Sababtoo ah kani waa STM32, waxay badbaadiyaan koronto, taas oo macnaheedu yahay inaad u baahan tahay inaad awood u yeelatid saacadaha durugsan ee loo baahan yahay.

Daar saacadda

Saacadda, oo sidoo kale loo yaqaan Clock, ayaa mas'uul ka ah saacadaha. Waxaan horeyba u ogaan karnaa soo gaabinta RCC. Waxaan ka raadineynaa dukumeentiyada: tani waa Dib u habeyn iyo Xakamaynta Saacadda.

Sida kor lagu sheegay, nasiib wanaag, qaybta ugu adag ee mawduuca clocking waxaa noo sameeyay dad ka socda STM, taas oo aan aad ugu mahadcelineyno (mar labaad waxaan ku siin doonaa xiriiriye) Bogga Di Halt, si ay u caddeeyaan sida ay u wareersan yihiin). Waxaan kaliya u baahanahay diiwaanada ka mas'uul ah awood siinta saacada hareeraheeda Marka hore, aan helno ciwaanka salka RCC, waa bilowga hore ee "Khariidadda Xusuusta":

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

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

Kadibna ama guji isku xirka meesha aad isku daydo inaad wax ka hesho saxanka, ama, aad uga sii fiican, u gudub sharraxaadda diiwaannada karti-gelinta ee qaybaha ku saabsan awood diwaangelinta. Halka aan ka heli doono RCC_APB1ENR iyo RCC_APB2ENR:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Iyaga, sidaas darteed, waxay ka kooban yihiin qaybo ay ka mid yihiin saacadaha SPI2, IOPB (I/O Port B) iyo hawlo kale (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;

Koodhka kama dambaysta ah waa la heli karaa halkan.

Haddii aad fursad u leedahay inaad tijaabiso, ku xidh DM634 sidan oo kale: DAI ilaa PB15, DCK ilaa PB13, LAT ilaa PB14. Waxaan ka soo qaadeynaa darawalka 5 volts, ha iloobin inaad ku xirto saldhigga.

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

STM8 PWM

PWM ee STM8

Markii aan kaliya qorsheynayay maqaalkan, waxaan go'aansaday, tusaale ahaan, in aan isku dayo in aan barto qaar ka mid ah shaqeynta chip-ka aan la aqoon iyada oo la adeegsanayo kaliya xaashida xogta, si aanan ugu dambeyn kabaha kabaha la'aan. STM8 waxay ku fiicnayd doorkan: marka hore, waxaan haystay laba loox oo Shiinees ah oo leh STM8S103, marka labaadna, maahan mid caan ah, sidaas darteed tijaabinta akhrinta iyo raadinta xalalka internetka waxay ku xiran tahay la'aanta xalalkan.

Chip ayaa sidoo kale leh xaashida xogta и Buugga tixraaca RM0016, marka hore waxaa jira pinout iyo cinwaanada diiwaanka, in labaad - wax kasta oo kale. STM8 waxa lagu borogaraamiyay C oo ku jira IDE aad u xun Horumarinta Muuqaalka ST.

Saacadaha iyo I/O

Sida caadiga ah, STM8 wuxuu ku shaqeeyaa inta jeer ee 2 MHz, tani waa in isla markiiba la saxo.

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
HSI (xawaaraha sare ee gudaha) saacad
Calaamadaha saacada HSI waxa laga soo minguuriyay 16 MHz RC oscillator gudaha ah oo leh qaybiye barnaamiji karo (1 ilaa 8). Waxa lagu dejiyay diiwaanka qaybiyaha saacadaha (CLK_CKDIVR).
Fiiro gaar ah: bilawga, oscillator HSI RC oo leh qaybiye 8 ah ayaa loo doortaa isha ugu horeysa ee calaamada saacada.

Waxaan ka helnaa ciwaanka diiwaanka xaashida xogta, sharaxaada ku jirta refman oo arag in diiwaanku u baahan yahay in la nadiifiyo:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Maadaama aan wadno PWM oo aan isku xireyno LED-yada, aan eegno pinout:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Chipku wuu yar yahay, hawlo badan ayaa la hakiyay biinanka isku midka ah. Waxa ku jira xargaha labajibbaaran waa “shaqaynta beddelka ah”, waxa lagu beddelaa “ikhtiraacyada ikhtiyaarka ah” (ikhtiyaarka bytes) – wax la mid ah fiyuuska Atmega. Waxaad bedeli kartaa qiyamkooda barnaamij ahaan, laakiin ma aha lagama maarmaan, sababtoo ah Hawsha cusub waxa la hawlgeliyay kaliya dib-u-bilow ka dib. Way sahlan tahay in la isticmaalo ST Visual Programmer (la soo dejiyay horumarinta muuqaalka), kaas oo bedeli kara bytes-kan. Pinout-ku wuxuu tusinayaa in biinanka CH1 iyo CH2 ee wakhtiga ugu horreeya ay ku qarsoon yihiin xargaha labajibbaaran; waa lagama maarmaan in la dejiyo AFR1 iyo AFR0 ee STVP, ka labaadna wuxuu sidoo kale ka wareejin doonaa CH1 wax soo saarka saacadda labaad ee PD4 ilaa PC5.

Sidaa darteed, 6 biin ayaa xakameyn doona LED-yada: PC6, PC7 iyo PC3 marka ugu horeysa, PC5, PD3 iyo PA3 marka labaad.

Dejinta biinanka I/O laftooda ee STM8 waa ka fudud oo ka macquulsan marka loo eego STM32:

  • yaqaan diiwaanka jihada xogta Atmega DDR (Diiwaanka Jihada Xogta): 1 = wax soo saar;
  • diiwaanka ugu horreeya ee kantaroolka CR1, marka la soo saaro, wuxuu dejiyaa habka riixitaanka (1) ama qulqulka furan (0); Tan iyo markii aan ku xidho LED-yada chip-ka leh cathodes, waxaan halkan uga tagayaa eber;
  • Diiwaanka kontoroolka labaad ee CR2, marka la soo saaro, wuxuu dejiyaa xawaaraha saacadda: 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

Dejinta PWM

Marka hore, aynu qeexno ereyada:

  • Joogtaynta PWM - inta jeer ee uu saacaduhu saxo;
  • Si toos ah dib ugu soo deji, AR - qiimaha autoloadable ilaa kaas oo saacaduhu tirin doono (muddada garaaca);
  • Cusbooneysii Dhacdada, UEV - dhacdo ku dhacda marka saacaduhu tiriyo AR;
  • Wareegtada Xilka PWM - Wareegga waajibaadka PWM, oo inta badan loo yaqaan "cunsurka waajibaadka";
  • Qabso/Is barbar dhig Qiimaha - qiimaha qabsashada/isbarbardhigga, kaas oo saacaduhu tiriyey wax qaban doona (haddii ay dhacdo PWM, waxay rogtay calaamadda wax soo saarka);
  • Preload Qiimaha - qiimaha horay loo sii raray. Is barbar dhig qiimaha ma beddeli karo inta uu saacaduhu saxayo, haddii kale wareegga PWM wuu jabayaa. Sidaa darteed, qiyamka cusub ee la kala qaado ayaa lagu dhejiyaa meel kayd ah oo la soo saaro marka saacaduhu gaadho dhamaadka tirinta oo dib loo dajiyo;
  • Cidhif toosan и Hababka isku toosan - isku dhejinta xadka iyo xarunta, oo la mid ah kan Atmel Degdega PWM и PWM sax ah wajiga.
  • OCIREF, Soo-saarka Isbarbardhigga Calaamadaha Tixraaca - calaamadda soosaarka tixraaca, dhab ahaantii, waxa ka muuqda biinka u dhigma ee qaabka PWM.

Sida horeba uga caddaatay pinout-ka, laba-wakhti-bixiyeyaashu waxay leeyihiin awoodaha PWM - kan koowaad iyo kan labaad. Labaduba waa 16-bit, kan ugu horreeya wuxuu leeyahay waxyaabo badan oo dheeraad ah (gaar ahaan, waxay tirin kartaa kor iyo hoosba). Waxaan u baahanahay labadaba inaan si siman u shaqeyno, markaa waxaan go'aansaday inaan ka bilaabo midka labaad ee iska cad ee saboolka ah, si aan si lama filaan ah u isticmaalin wax aan jirin. Dhibaatada qaar ayaa ah in sharraxaadda shaqada PWM ee dhammaan saacadaha ku jira buugga tixraaca ay ku jirto cutubka ku saabsan saacadeeyaha ugu horreeya (17.5.7 PWM Mode), markaa waa inaad dib iyo dib u booddo dukumeentiga oo dhan mar walba.

PWM ee STM8 ayaa faa'iido muhiim ah ka leh PWM Atmega:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Soohdinta La Toosiyey PWM
Qaabeynta xisaabta hoose ilaa sare
Tirinta hoose waa firfircoon tahay haddii xoogaa DIR ee ku jira diiwaanka TIM_CR1 la nadiifiyo
Tusaale:
Tusaalaha wuxuu isticmaalaa qaabka ugu horreeya ee PWM. Calaamada tixraaca PWM OCIREF waa la hayaa sare ilaa TIM1_CNT <TIM1_CCRi. Haddii kale waxay qaadataa heer hoose. Haddii qiimaha isbarbardhigga ee diiwaanka TIM1_CCRi uu ka weyn yahay qiimaha autoload ( diiwanka TIM1_ARR ), calaamada OciREF waxa lagu hayaa 1. Haddii qiimaha isbarbardhigga uu yahay 0, OCIREF waxa lagu hayaa eber....

Waqtiga STM8 inta lagu jiro dhacdo cusboonaysii hubi marka hore is barbar dhig qiimaha, ka dibna kaliya ayaa soo saara calaamad tixraac ah. Saacadaha Atmega ayaa marka hore isku xira ka dibna is barbar dhigaya, taasoo keentay compare value == 0 Wax-soo-saarku waa irbad, taas oo ay tahay in si uun wax looga qabto (tusaale ahaan, iyada oo si barnaamij ahaan loo rogayo caqliga).

Markaa waxa aan rabno inaan sameyno: 8-bit PWM (AR == 255), tirinta min hoose ilaa sare, toosinta xadka. Maadaama nalalka iftiinka ay ku xiran yihiin chip by cathodes, PWM waa inay soo saartaa 0 (LED) ilaa is barbar dhig qiimaha iyo 1 ka dib.

Waxaan horey u akhrinay qaar ku saabsan Qaabka PWM, marka waxaan helnaa diiwaanka loo baahan yahay ee saacadeeyaha labaad anagoo ka raadinayna buuga tixraaca ee weedhan (18.6.8 - TIMx_CCMR1):

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
110: Habka ugu horreeya ee PWM - marka la tirinayo hoosta ilaa sare, kanaalka ugu horreeya ayaa shaqaynaya halka TIMx_CNT <TIMx_CCR1. Haddii kale, kanaalka ugu horreeya waa mid aan shaqayn. 1: Qaabka labaad ee PWM - marka la tirinayo hoosta ilaa sare, kanaalka ugu horeeya ayaa shaqaynayn halka TIMx_CNT <TIMx_CCR111. Haddii kale, kanaalka ugu horreeya waa firfircoon yahay.

Maadaama LED-yadu ay ku xiran yihiin MK by cathodes, qaabka labaad ayaa nagu habboon (midka koowaad sidoo kale, laakiin weli ma garanayno taas).

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Bit 3 OC1PE: Daar pin 1 horudhac
0: Diiwaanka hore u soo shubista TIMx_CCR1 waa naafo. Waxaad u qori kartaa TIMx_CCR1 wakhti kasta. Qiimaha cusubi isla markiiba wuu shaqeeyaa.
1: Diiwaanka hore u soo shubista TIMx_CCR1 waa la dajiyay. Hawlgallada wax-akhriska/qorista waxay gelayaan diiwaanka hor-u-qaadista. Qiimaha hore loo raray TIMx_CCR1 waxa lagu shubaa diiwaanka hadhka inta lagu jiro dhacdo kasta oo cusbooneed
*Fiiro gaar ah: Qaabka PWM si uu si sax ah ugu shaqeeyo, diiwaanada horudhaca ah waa in la hawlgeliyaa. Middaani lagama maarmaan ma aha hal qaab oo calaamad ah (bitalka OPM waxa lagu dejiyay diiwaanka TIMx_CR1).

Hagaag, aan u shidno wax kasta oo aan uga baahanahay saddexda kanaal ee wakhtiga labaad:

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

AR waxay ka kooban tahay laba diiwaan oo sideed-bit ah, wax walba waa sahlan yihiin:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Saacadaha labaad waxa kaliya oo lagu tirin karaa hoosta ilaa sare, toosinta xadka, waxba uma baahna in la beddelo. Aynu dhigno qaybiyaha soo noqnoqda, tusaale ahaan, 256. Wakhtiga labaad, qaybiyaha waxa lagu dejiyay diiwaanka TIM2_PSCR waana awood laba ah:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Waxa hadhay oo dhan waa in la shido gabagabada iyo saacada labaad lafteeda. Dhibaatada ugu horreysa waxaa lagu xalliyaa diiwaannada Qabso/Is barbar dhig Awoodi: waxaa jira laba, saddex kanaal oo ku kala firirsan si aan asymmetrical ahayn. Halkan waxaan sidoo kale ku baran karnaa in ay suurtagal tahay in la beddelo polarity of signal, i.e. Mabda 'ahaan, waxaa suurtagal ahayd in la isticmaalo PWM Mode 1. Waxaan qoreynaa:

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

Ugu dambayntii, waxaanu ku bilownay saacada diiwaanka TIMx_CR1:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Aynu qorno analoog fudud AnalogWrite(), kaas oo u wareejin doona qiyamka dhabta ah saacada isbarbardhigga. Diiwaanada waxaa loo magacaabay si la saadaalin karo Qabso/Is barbar dhig diiwaanka, waxaa jira laba ka mid ah kanaal kasta: dalabka hooseeya ee 8 ee TIM2_CCRxL iyo kuwa sare-sare ee TIM2_CCRxH. Maadaama aan abuurnay 8-bit PWM, waa ku filan inaad qorto oo kaliya qaybaha ugu yar ee muhiimka ah:

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

Akhristaha fiiro gaar ah leh wuxuu ogaan doonaa inaan haysano cillad yar oo PWM ah, oo aan awoodin inay soo saarto 100% buuxin (qiimaha ugu sarreeya ee 255, calaamaduhu waa loo rogaa hal wareeg oo saacad ah). Wixii LED-yada tani dhib ma leh, iyo akhristaha fiirsada ayaa durba qiyaasi kara sida loo hagaajiyo.

PWM saacada labaad ayaa shaqeysa, aan u gudubno kan koowaad.

Saacadaha ugu horreeya wuxuu leeyahay xoogaa isku mid ah oo isku mid ah diiwaangelin isku mid ah (waa kaliya in kuwan "la xafiday" ee saacadda labaad si firfircoon loogu isticmaalo marka hore dhammaan noocyada waxyaallaha horumarsan). Sidaa darteed, waa ku filan tahay in la helo cinwaanada diiwaannada isku midka ah ee xaashida xogta oo koobi koodka. Hagaag, beddel qiimaha qaybiyaha soo noqnoqda, sababtoo ah... Waqtiga ugu horreeya wuxuu rabaa inuusan helin awood laba ah, laakiin qiimaha saxda ah ee 16-bit ee labada diiwaan Prescaler Sare и Low. Waxaan sameynaa wax walba oo... saacadeeyaha ugu horreeya ma shaqeeyo. Maxaa jira?

Dhibaatada waxa kaliya oo lagu xalin karaa iyada oo la eegayo qaybta oo dhan ee ku saabsan diiwaanka xakamaynta ee saacada 1, halkaas oo aan raadineyno mid ka mid ah saacadaha labaad uusan haysan. Waxaa jiri doona 17.7.30 Jebinta diiwaanka (TIM1_BKR), meesha ay ku taal waxoogaa:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Daar wax soo saarka ugu muhiimsan

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Taasi waa hubaal hadda, koodka halkaas.

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

STM8 Multiplex

Isku dhufashada STM8

Mashruuca-yar-yar ee saddexaad waa in lagu xiro siddeed RGB LEDs saacadda labaad ee qaabka PWM oo laga dhigo inay muujiyaan midabyo kala duwan. Waxay ku saleysan tahay fikradda isku-dhufashada LED-ka, taas oo ah haddii aad shid iyo aad u damiso LED-yada si aad iyo aad u dhaqso badan, waxay noogu muuqan doontaa inay si joogto ah u shidaan (joogitaanka aragga, qallafsanaanta aragtida aragtida). Mar baan sameeyay wax sidan oo kale ah on Arduino.

Algorithm shaqada waxay u egtahay sidan:

  • isku xidhay anode ee LED RGB ugu horeysay;
  • shiday, u diraya calaamadaha lagama maarmaanka ah ee cathodes;
  • la sugay ilaa dhamaadka wareegga PWM;
  • ku xiran anode-ka labaad ee RGB LED;
  • shiday...

Waa hagaag, iwm. Dabcan, qalliinka quruxda badan waxaa loo baahan yahay in anodeku ku xiran yahay oo LED-ku "shido" isla mar ahaantaana. Waa hagaag, ama ku dhawaad. Si kastaba ha noqotee, waxaan u baahanahay inaan qorno koodka soo saari doona qiyamka saddexda kanaal ee saacadda labaad, beddelo marka UEV la gaaro, isla markaana beddelo LED-ga hadda firfircoon ee RGB.

Maaddaama beddelka LED-ku yahay mid toos ah, waxaan u baahannahay inaan abuurno "xasuusta fiidiyowga" kaas oo gacan-qabeeyaha ka heli doono xogta. Tani waa hab fudud:

uint8_t colors[8][3];

Si loo beddelo midabka LED gaar ah, waxay ku filnaan doontaa in lagu qoro qiyamka loo baahan yahay ee soo diyaarintan. Doorsoomuhu wuxuu mas'uul ka noqon doonaa tirada LED-ka firfircoon

uint8_t cnt;

Demux

Isku dhufashada saxda ah, waxaan u baahanahay, si yaab leh, CD74HC238 demultiplexer. Demultiplexer - chip ka hirgeliya hawlwadeenka qalabka <<. Iyada oo loo marayo saddex biinanka wax-gelinta ah (bits 0, 1 iyo 2) waxaan ku quudineynaa nambar saddex-bit X ah, jawaab ahaanna waxay kicisaa nambarka wax soo saarka (1<<X). Waxyaabaha soo hadhay ee chip-ka waxaa loo isticmaalaa in lagu cabbiro naqshadda oo dhan. Waxaan u baahanahay chip this ma aha oo kaliya in la yareeyo tirada biinanka la haysto ee microcontroller, laakiin sidoo kale badbaadada - si aan si shil ah shid LEDs ka badan intii suurtagal ah oo aan guban MK ah. Chip-ku waa dinaar waana in had iyo jeer lagu hayaa golaha daawada gurigaaga.

CD74HC238 waxay mas'uul ka noqon doontaa bixinta korantada anode-ka LED-ka la rabo. Isku dhafka buuxa ee buuxa, waxay ku siin doontaa korantada tiirka iyada oo loo marayo P-MOSFET, laakiin demo this si toos ah ayey suurtogal u tahay, sababtoo ah waxay soo jiidataa 20 mA, sida laga soo xigtay qiimaynta ugu badan ee xaashida xogta. Ka CD74HC238 Waxaan u baahanahay pinouts iyo xaashidan qishka:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
H = heerka korantada sare, L = heerka korantada hooseeya, X - ha daneynin

Waxaan ku xireynaa E2 iyo E1 dhulka, E3, A0, A1 iyo A3 si ay u biinanka PD5, PC3, PC4 iyo PC5 ee STM8. Maadaama shaxda kore ay ka kooban tahay heerar hoose iyo mid sare labadaba, waxaan u habeyneynaa biinankaan sidii biinanka jiid-jiididda.

PWM

PWM saacada labaad waxaa loo habeeyey si la mid ah sidii sheekadii hore, oo leh laba farqi:

Marka hore, waxaan u baahanahay inaan awoodno joojinta joojinta Cusbooneysii Dhacdada (UEV) kaas oo wici doona shaqo rogta LED-ka firfircoon. Tan waxaa lagu sameeyaa iyadoo la beddelayo xoogaa Cusbooneysii Joojinta Awood oo ku jira diiwaan magac leh

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
Jooji diiwaangelinta awood

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Farqiga labaad wuxuu la xiriiraa ifafaalaha isku-dhufashada, sida ghosting - dhaldhalaalka dulin ee diodes. Xaaladeena, waxaa laga yaabaa inay u muuqato sababtoo ah xaqiiqda ah in saacaduhu, oo sababay hakad ku saabsan UEV, uu sii wado saxnaanta, iyo gacan-qabeeyaha ma haysto wakhti uu ku beddelo LED ka hor inta uusan saacaduhu bilaabin inuu wax ku qoro biinanka. Si taas loola dagaallamo, waa inaad rogtaa caqliga (0 = dhalaalka ugu sarreeya, 255 = waxba ma shidan) oo iska ilaali qiyamka wareegga waajibaadka xad dhaafka ah. Kuwaas. Hubi in ka dib UEV LEDs ay si buuxda u baxaan hal wareeg oo PWM ah.

Beddelida polarity:

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

Ka fogow inaad dejiso r, g iyo b ilaa 255 oo xusuuso inaad u rogo marka aad isticmaalayso.

Kala goysa

Nuxurka kala-joojintu waa in xaaladaha qaarkood uu chip-ku joojiyo fulinta barnaamijka ugu muhiimsan oo uu u yeero qaar ka mid ah hawlaha dibadda. Joojinta waxay ku dhacdaa saameyn dibadda ah ama gudaha ah, oo ay ku jirto saacadda.

Markii ugu horeysay ee aan abuurnay mashruuc ST Visual Develop, marka lagu daro main.c Waxaan helnay daaqad leh fayl dahsoon stm8_interrupt_vector.c, oo si toos ah loogu daro mashruuca. Faylkan, hawl ayaa loo qoondeeyay hakad kasta NonHandledInterrupt. Waxaan u baahanahay inaan ku xidhno shaqadeena goynta la rabo.

Xaashida xogtu waxa ay leedahay shax ka mid ah kuwa carqaladeeya, halkaas oo aan ka helno kuwa aan u baahanahay:

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8
13 TIM2 cusbooneysiin/qulqulaya
14 TIM2 qabsashada/barbardhigga

Waxaan u baahanahay inaan bedelno LED-ka UEV, marka waxaan u baahanahay hakad #13.

Sidaa darteed, marka hore, faylka stm8_interrupt_vector.c U beddel magaca shaqada ee ka masuulka ah kala joojinta lambarka 13 (IRQ13) una beddel adiga:

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

Marka labaad, waa inaan abuurnaa fayl main.h oo leh nuxurka soo socda:

#ifndef __MAIN_H
#define __MAIN_H

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

Ugu dambeyntiina, ku qor shaqadan gudahaaga 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;
}

Waxa hadhay oo dhan waa in la suurtogeliyo joojinta Tan waxaa lagu sameeyaa iyadoo la isticmaalayo amarka isu-duwaha rim - waa inaad ka dhex raadisaa Buugga barnaamijka:

//enable interrupts
_asm("rim");

Amarka kale ee ururiyaha waa sim - waxay damisaa joojinta. Waa in la damiyo inta qiyamka cusub lagu qorayo "xasuusta fiidiyaha", si hakadku u dhaco daqiiqad khaldan uusan u kharribin nidaamka.

Codsiyada oo dhan - ku yaal GitHub.

Akhrinta xaashida xogta 2: SPI ee STM32; PWM, saacadaha iyo joojinta STM8

Haddii ugu yaraan qof uu u arko maqaalkan mid faa'iido leh, ka dibna uma qorin wax aan micno lahayn. Waan ku farxi doonaa inaan helo faallooyin iyo faallooyin, waxaan isku dayi doonaa inaan ka jawaabo wax walba.

Source: www.habr.com

Add a comment