Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

В apakan akọkọ Mo gbiyanju lati so fun ifisere Electronics Enginners ti o dagba soke lati Arduino sokoto bi o ati idi ti won yẹ ki o ka datasheets ati awọn miiran iwe fun microcontrollers. Ọ̀rọ̀ náà ti tóbi, nítorí náà, mo ṣèlérí láti fi àwọn àpẹẹrẹ gbígbéṣẹ́ hàn nínú àpilẹ̀kọ mìíràn. O dara, o pe ara rẹ ni olu wara ...

Loni Emi yoo fihan ọ bi o ṣe le lo awọn iwe data lati yanju ohun rọrun, ṣugbọn pataki fun ọpọlọpọ awọn iṣẹ akanṣe, awọn iṣẹ ṣiṣe lori STM32 (Pill Blue) ati awọn oludari STM8. Gbogbo awọn iṣẹ akanṣe demo jẹ igbẹhin si awọn LED ayanfẹ mi, a yoo tan wọn ni titobi nla, fun eyiti a yoo ni lati lo gbogbo iru awọn agbeegbe ti o nifẹ.

Ọrọ naa tun jade lati tobi, nitorinaa fun irọrun Mo n ṣe akoonu naa:

STM32 Blue Pill: Awọn LED 16 pẹlu awakọ DM634
STM8: Ṣiṣeto awọn pinni PWM mẹfa
STM8: Awọn LED RGB 8 lori awọn pinni mẹta, awọn idilọwọ

AlAIgBA: Emi kii ṣe ẹlẹrọ, Emi ko dibọn lati ni imọ jinlẹ ninu ẹrọ itanna, nkan naa jẹ ipinnu fun awọn ope bii emi. Ni otitọ, Mo ṣe akiyesi ara mi ni ọdun meji sẹhin bi olugbo ibi-afẹde. Ti ẹnikan ba ti sọ fun mi lẹhinna pe awọn iwe data lori chirún unfamiliar ko bẹru lati ka, Emi kii yoo ti lo akoko pupọ lati wa diẹ ninu awọn koodu koodu lori Intanẹẹti ati ṣiṣẹda awọn crutches pẹlu awọn scissors ati teepu alemora.

Idojukọ nkan yii wa lori awọn iwe data, kii ṣe awọn iṣẹ akanṣe, nitorinaa koodu naa le ma jẹ afinju pupọ ati nigbagbogbo cramp. Awọn iṣẹ akanṣe funrararẹ rọrun pupọ, botilẹjẹpe o dara fun acquaintance akọkọ pẹlu ërún tuntun.

Mo nireti pe nkan mi yoo ṣe iranlọwọ fun ẹnikan ni ipele kanna ti immersion ni ifisere.

STM32

Awọn LED 16 pẹlu DM634 ati SPI

Ise agbese kekere kan nipa lilo Pill Blue (STM32F103C8T6) ati awakọ LED DM634. Lilo awọn iwe data, a yoo ṣawari awakọ, awọn ebute oko oju omi STM IO ati tunto SPI.

DM634

Chirún Taiwanese pẹlu awọn abajade PWM 16-bit 16, le sopọ ni awọn ẹwọn. Awọn kekere-opin 12-bit awoṣe ti wa ni mo lati kan abele ise agbese Lightpack. Ni akoko kan, yiyan laarin DM63x ati TLC5940 ti a mọ daradara, Mo yan DM fun awọn idi pupọ: 1) TLC lori Aliexpress jẹ iro ni pato, ṣugbọn eyi kii ṣe; 2) DM ni PWM adase pẹlu olupilẹṣẹ igbohunsafẹfẹ tirẹ; 3) o le ra laini iye owo ni Ilu Moscow, dipo ki o duro de ile kan lati Ali. Ati pe, nitorinaa, o nifẹ lati kọ ẹkọ bii o ṣe le ṣakoso chirún funrararẹ, dipo lilo ile-ikawe ti a ti ṣetan. Awọn eerun ti wa ni bayi ni akọkọ gbekalẹ ni SSOP24 package; wọn rọrun lati ta si ohun ti nmu badọgba.

Niwon olupese jẹ Taiwanese, iwe data ërún ti kọ ni Chinese English, eyi ti o tumo o yoo jẹ fun. Ni akọkọ a wo pinout (Pin Asopọ) lati ni oye eyi ti ẹsẹ lati so kini lati, ati apejuwe kan ti awọn pinni (Pin Apejuwe). 16 pinni:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Awọn orisun DC Sink (Ṣiṣi ṣiṣan)

Foju / Iṣajade ṣiṣan-ṣii - sisan; orisun ti nwọle lọwọlọwọ; o wu ti wa ni ti sopọ si ilẹ ni awọn ti nṣiṣe lọwọ ipinle - awọn LED ti wa ni ti sopọ si awọn iwakọ nipasẹ cathodes. Ni itanna, eyi jẹ, nitorinaa, kii ṣe “iṣan ti o ṣii” (ìmọ sisan), sugbon ni datasheets yi yiyan fun awọn pinni ni sisan mode ti wa ni igba ri.

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Awọn alatako ita laarin REXT ati GND lati ṣeto iye ti o wu lọwọlọwọ

A ti fi sori ẹrọ resistor itọkasi laarin PIN REXT ati ilẹ, eyiti o nṣakoso resistance inu ti awọn abajade, wo iyaya loju iwe 9 ti iwe data naa. Ninu DM634, resistance yii le tun jẹ iṣakoso nipasẹ sọfitiwia, ṣeto imọlẹ gbogbogbo (agbaye imọlẹ); Emi kii yoo lọ sinu awọn alaye ninu nkan yii, Emi yoo kan fi 2.2 - 3 kOhm resistor nibi.

Lati loye bi o ṣe le ṣakoso chirún, jẹ ki a wo apejuwe ti wiwo ẹrọ naa:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Bẹẹni, nibi o wa, Kannada Gẹẹsi ni gbogbo ogo rẹ. Itumọ eyi jẹ iṣoro, o le loye rẹ ti o ba fẹ, ṣugbọn ọna miiran wa - wo bii asopọ si TLC5940 ti o jọra ti jẹ apejuwe ninu iwe data:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Awọn pinni mẹta nikan ni o nilo lati tẹ data sii sinu ẹrọ naa. Ipari eti ti ifihan SCLK n yi data pada lati PIN SIN si iforukọsilẹ inu. Lẹhin ti gbogbo data ti kojọpọ, ifihan agbara XLAT kukuru kukuru kan ti gbe data lẹsẹsẹ sinu awọn iforukọsilẹ inu. Awọn iforukọsilẹ inu jẹ awọn ẹnu-ọna ti o fa nipasẹ ipele ifihan XLAT. Gbogbo data ti wa ni gbigbe julọ pataki bit akọkọ.

Titiipa - latch / latch / titiipa.
Oke eti - asiwaju eti ti awọn polusi
MSB akọkọ – julọ significant (osi) bit siwaju.
lati aago data - atagba data lesese (bit nipa bit).

Ọrọ naa titiipa Nigbagbogbo a rii ninu iwe fun awọn eerun igi ati pe a tumọ ni awọn ọna oriṣiriṣi, nitorinaa nitori oye Emi yoo gba ara mi laaye.

eto ẹkọ kekere kanIwakọ LED jẹ pataki iforukọsilẹ ayipada. "Iyipada" (yipada) ni awọn orukọ - bitwise ronu ti data inu awọn ẹrọ: kọọkan titun bit shoved inu titari gbogbo pq siwaju ni iwaju ti o. Niwọn igba ti ko si ẹnikan ti o fẹ lati ṣe akiyesi didan rudurudu ti awọn LED lakoko iyipada, ilana naa waye ni awọn iforukọsilẹ ifipamọ ti o yapa lati awọn iforukọsilẹ iṣẹ nipasẹ ọririn (ọgbẹ).titiipa) ni a irú ti idaduro yara ibi ti awọn die-die ti wa ni idayatọ ni awọn ti o fẹ ọkọọkan. Nigbati ohun gbogbo ba ti ṣetan, titiipa naa ṣii ati awọn die-die lọ si iṣẹ, rọpo ipele ti tẹlẹ. Ọrọ titiipa ninu iwe fun microcircuits o fẹrẹ jẹ nigbagbogbo tumọ iru ọririn kan, laibikita iru awọn akojọpọ ti o lo.

Nitorinaa, gbigbe data si DM634 ni a ṣe bii eyi: ṣeto titẹ sii DAI si iye ti iwọn pataki julọ ti LED ti o jinna, fa DCK si oke ati isalẹ; ṣeto titẹ sii DAI si iye ti bit ti o tẹle, fa DCK; ati bẹbẹ lọ titi gbogbo awọn die-die yoo ti gbejade (clocked ni), lẹhin eyi a fa LAT. Eyi le ṣee ṣe pẹlu ọwọ (bit-Bang), ṣugbọn o dara lati lo wiwo SPI ti a ṣe ni pataki fun eyi, niwọn bi o ti gbekalẹ lori STM32 wa ni awọn ẹda meji.

Blue egbogi STM32F103

Ifihan: Awọn oludari STM32 jẹ eka pupọ ju Atmega328 ju wọn le dabi ẹru. Pẹlupẹlu, fun awọn idi ti fifipamọ agbara, o fẹrẹ to gbogbo awọn agbeegbe wa ni pipa ni ibẹrẹ, ati igbohunsafẹfẹ aago jẹ 8 MHz lati orisun inu. Da, STM pirogirama kowe koodu ti o mu awọn ërún soke si awọn "iṣiro" 72 MHz, ati awọn onkọwe ti gbogbo awọn IDEs Mo mọ ti o wa ninu awọn ibẹrẹ ilana, ki a ko nilo lati aago (ṣugbọn). o le ti o ba fẹ looto). Ṣugbọn iwọ yoo ni lati tan awọn agbeegbe.

Iwe: Blue Pill ti ni ipese pẹlu chirún STM32F103C8T6 olokiki, awọn iwe aṣẹ to wulo meji wa fun:

Ninu iwe data a le nifẹ si:

  • Pinouts - ërún pinouts - ni irú a pinnu lati ṣe awọn lọọgan ara wa;
  • Maapu Iranti – maapu iranti fun ërún kan pato. Iwe Itọkasi ni maapu fun gbogbo ila, o si mẹnuba awọn iforukọsilẹ ti tiwa ko ni.
  • Tabili Awọn asọye Pin - kikojọ akọkọ ati awọn iṣẹ yiyan ti awọn pinni; fun “egbogi buluu” o le wa awọn aworan irọrun diẹ sii lori Intanẹẹti pẹlu atokọ ti awọn pinni ati awọn iṣẹ wọn. Nitorinaa, lẹsẹkẹsẹ a ṣe Google Pill Pill pinout ati tọju aworan yii ni ọwọ:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
NB: aṣiṣe kan wa ninu aworan lati Intanẹẹti, eyiti a ṣe akiyesi ninu awọn asọye, o ṣeun fun iyẹn. Aworan ti rọpo, ṣugbọn eyi jẹ ẹkọ - o dara lati ṣayẹwo alaye kii ṣe lati awọn iwe data.

A yọ iwe data kuro, ṣii Itọsọna Itọkasi, ati lati isisiyi lọ a lo nikan.
Ilana: a wo pẹlu boṣewa input / o wu, tunto SPI, tan lori awọn pataki awọn pẹẹpẹẹpẹ.

Iṣagbejade igbewọle

Lori Atmega328, I/O ti wa ni imuse lalailopinpin larọwọto, eyiti o jẹ idi ti opo ti awọn aṣayan STM32 le jẹ airoju. Bayi a nilo awọn ipinnu nikan, ṣugbọn paapaa awọn wọnyi ni awọn aṣayan mẹrin:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
ìmọ sisan, titari-fa, yiyan titari-fa, yiyan ìmọ sisan

"Titari-titari" (titari-fa) jẹ abajade deede lati Arduino, pin le gba iye boya GA tabi LOW. Ṣugbọn pẹlu "ìmọ sisan" nibẹ ni o wa awọn iṣoro, biotilejepe ni otitọ ohun gbogbo rọrun nibi:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Iṣetojade abajade / nigba ti a ti yan ibudo lati ṣejade: / ifipamọ iṣelọpọ ṣiṣẹ: / – ipo ṣiṣan ṣiṣi: “0” ninu iforukọsilẹ iṣẹjade jẹ ki N-MOS ṣiṣẹ, “1” ninu iforukọsilẹ o wu jade kuro ni ibudo ni ipo Hi-Z ( P-MOS ko mu ṣiṣẹ) / – ipo titari-fa: “0” ninu iforukọsilẹ iṣẹjade n mu N-MOS ṣiṣẹ, “1” ninu iforukọsilẹ iṣẹjade n mu P-MOS ṣiṣẹ.

Gbogbo iyatọ laarin ṣiṣan ṣiṣi (ìmọ sisan) lati "titari-fa" (titari-fa) ni pe ni akọkọ pinni ko le gba ipo giga: nigba kikọ ọkan si iforukọsilẹ ti o wu, o lọ sinu ipo resistance giga (ga ikọjujasi, Hi-Z). Nigbati kikọ odo, pinni huwa kanna ni awọn ipo mejeeji, mejeeji ni ọgbọn ati itanna.

Ni deede o wu mode, awọn pin nìkan igbesafefe awọn awọn akoonu ti awọn o wu Forukọsilẹ. Ni "yiyan" o jẹ iṣakoso nipasẹ awọn agbeegbe ti o baamu (wo 9.1.4):

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Ti o ba ti a ibudo bit ti wa ni tunto bi yiyan iṣẹ pinni, pin Forukọsilẹ alaabo ati awọn pin ti wa ni ti sopọ si agbeegbe pin.

Yiyan iṣẹ-ṣiṣe ti kọọkan pinni ti wa ni apejuwe ninu Pin Awọn asọye Iwe data wa lori aworan ti a gbasile. Si ibeere ti kini lati ṣe ti PIN kan ba ni awọn iṣẹ omiiran pupọ, idahun ni a fun nipasẹ akọsilẹ ẹsẹ kan ninu iwe data naa:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Ti o ba ti ọpọ awọn pẹẹpẹẹpẹ lo pinni kanna, lati yago fun rogbodiyan laarin yiyan awọn iṣẹ, nikan agbeegbe yẹ ki o ṣee lo ni akoko kan, toggled lilo agbeegbe aago jeki bit (ni yẹ RCC Forukọsilẹ).

Nikẹhin, awọn pinni ni ipo iṣelọpọ tun ni iyara aago kan. Eyi jẹ ẹya fifipamọ agbara miiran; ninu ọran wa, a kan ṣeto si iwọn ati gbagbe rẹ.

Nitorina: a nlo SPI, eyi ti o tumọ si pe awọn pinni meji (pẹlu data ati pẹlu ifihan agbara aago) yẹ ki o jẹ "iṣẹ titari-fifa miiran", ati pe ọkan miiran (LAT) yẹ ki o jẹ "titari-deede". Ṣugbọn ki a to fi wọn si, jẹ ki ká wo pẹlu SPI.

SPI

Eto eto ẹkọ kekere miiran

SPI tabi Interface Agbeegbe Tẹlentẹle (ni wiwo agbeegbe ni tẹlentẹle) jẹ wiwo ti o rọrun ati ti o munadoko pupọ fun sisopọ MK kan pẹlu awọn MK miiran ati agbaye ita ni gbogbogbo. Ilana ti iṣiṣẹ rẹ ti tẹlẹ ti ṣalaye loke, nibiti nipa awakọ LED Kannada (ninu itọnisọna itọkasi, wo apakan 25). SPI le ṣiṣẹ ni titunto si ("oluko") ati ẹrú ("ẹrú") mode. SPI ni awọn ikanni ipilẹ mẹrin, eyiti kii ṣe gbogbo wọn le ṣee lo:

  • MOSI, Titunto si wu / Ẹrú Input: yi pinni ndari data ni titunto si mode, ati ki o gba data ni ẹrú mode;
  • MISO, Titunto si Input / Iṣẹjade Ẹrú: ni ilodi si, o gba ninu oluwa, o si firanṣẹ ninu ẹru;
  • SCK, Aago Tẹlentẹle: ṣeto igbohunsafẹfẹ ti gbigbe data ninu oluwa tabi gba ifihan aago kan ninu ẹru naa. Ni pataki lilu lilu;
  • SS, Ẹrú Select: pẹlu iranlọwọ ti yi ikanni, ẹrú mọ pe nkankan ti wa ni fe lati rẹ. Lori STM32 o pe NSS, nibiti N = odi, i.e. oluṣakoso di eru ti ilẹ ba wa ni ikanni yii. O daapọ daradara pẹlu Ipo Imujade Ṣiṣii, ṣugbọn iyẹn jẹ itan miiran.

Bii ohun gbogbo miiran, SPI lori STM32 jẹ ọlọrọ ni iṣẹ ṣiṣe, eyiti o jẹ ki o nira diẹ lati ni oye. Fun apẹẹrẹ, o le ṣiṣẹ kii ṣe pẹlu SPI nikan, ṣugbọn pẹlu wiwo I2S, ati ninu awọn iwe-ipamọ awọn apejuwe wọn ti dapọ, o jẹ dandan lati ge awọn apọju ni akoko ti akoko. Iṣẹ-ṣiṣe wa rọrun pupọ: a kan nilo lati firanṣẹ data ni lilo MOSI ati SCK nikan. A lọ si apakan 25.3.4 (ibaraẹnisọrọ idaji-duplex, ibaraẹnisọrọ idaji-duplex), nibiti a ti rii 1 aago ati 1 unidirectional data waya (Ifihan aago 1 ati ṣiṣan data unidirectional 1):

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Ni ipo yii, ohun elo naa nlo SPI ni boya gbigbe-nikan tabi ipo gbigba-nikan. / Ipo gbigbe-nikan jẹ iru si ipo ile oloke meji: data ti wa ni gbigbe lori pin gbigbe (MOSI ni ipo titunto si tabi MISO ni ipo ẹrú), ati pin gbigba (MISO tabi MOSI lẹsẹsẹ) le ṣee lo bi pin I / O deede . Ni ọran yii, ohun elo nikan nilo lati foju ifipamọ Rx (ti o ba ka, kii yoo si data gbigbe sibẹ).

Nla, PIN MISO jẹ ọfẹ, jẹ ki a so ami ifihan LAT pọ si. Jẹ ki a wo Ẹrú Select, eyiti o wa lori STM32 le jẹ iṣakoso ni eto, eyiti o rọrun pupọ. A ka ìpínrọ ti orukọ kanna ni apakan 25.3.1 SPI Apejuwe Gbogbogbo:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Iṣakoso sọfitiwia NSS (SSM = 1) / Alaye yiyan ẹrú wa ninu SSI bit ti iforukọsilẹ SPI_CR1. PIN NSS ita wa ni ọfẹ fun awọn iwulo ohun elo miiran.

O to akoko lati kọ si awọn iforukọsilẹ. Mo pinnu lati lo SPI2, wa adirẹsi ipilẹ rẹ ninu iwe data - ni apakan 3.3 Maapu Iranti:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

O dara, jẹ ki a bẹrẹ:

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

Ṣii apakan 25.3.3 pẹlu akọle asọye ti ara ẹni “Ṣiṣeto SPI ni Ipo Titunto”:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

1. Ṣeto ni tẹlentẹle aago igbohunsafẹfẹ pẹlu die-die BR [2: 0] ni SPI_CR1 Forukọsilẹ.

Awọn iforukọsilẹ ni a gba ni apakan itọnisọna itọkasi ti orukọ kanna. Iyipada adirẹsi (Adirẹsi aiṣedeede) fun CR1 - 0x00, nipasẹ aiyipada gbogbo awọn die-die ti wa ni imukuro (Tun iye 0x0000):

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Awọn iwọn BR ṣeto olupin aago oluṣakoso, nitorinaa npinnu igbohunsafẹfẹ eyiti SPI yoo ṣiṣẹ. Igbohunsafẹfẹ STM32 wa yoo jẹ 72 MHz, awakọ LED, ni ibamu si iwe data rẹ, nṣiṣẹ pẹlu igbohunsafẹfẹ ti o to 25 MHz, nitorinaa a nilo lati pin nipasẹ mẹrin (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. Ṣeto awọn die-die CPOL ati CPHA lati ṣalaye ibatan laarin gbigbe data ati akoko aago ni tẹlentẹle (wo aworan ni oju-iwe 240)

Niwọn bi a ti n ka iwe data kan nibi ati pe a ko wo awọn eto eto-iṣe, jẹ ki a wo ni pẹkipẹki ni apejuwe ọrọ ti CPOL ati awọn die-die CPHA ni oju-iwe 704 (Apejuwe Gbogbogbo SPI):

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Aago alakoso ati polarity
Lilo awọn CPOL ati awọn die-die CPHA ti iforukọsilẹ SPI_CR1, o le ṣe eto yan awọn ibatan akoko mẹrin. CPOL (aago polarity) bit n ṣakoso ipo ti ifihan aago nigbati ko si data ti n gbejade. Eleyi bit išakoso titunto si ati ẹrú igbe. Ti CPOL ba tunto, PIN SCK kekere ni ipo isinmi. Ti o ba ṣeto bit CPOL, pin SCK ga lakoko ipo isinmi.
Nigba ti CPHA (aago alakoso) bit ti ṣeto, awọn ga bit pakute strobe keji eti ti SCK ifihan agbara (ja bo ti o ba ti CPOL jẹ ko o, nyara ti o ba ti CPOL ṣeto). Awọn data ti wa ni sile nipasẹ awọn keji ayipada ninu aago ifihan agbara. Ti o ba ti CPHA bit jẹ ko o, awọn ga bit pakute strobe ni awọn nyara eti ti SCK ifihan agbara (jabu eti ti o ba ti CPOL ti ṣeto, nyara eti ti o ba ti CPOL ti wa ni nso). A gba data ni iyipada akọkọ ninu ifihan agbara aago.

Lehin ti o ti gba imoye yii, a wa si ipari pe awọn ege mejeeji gbọdọ wa ni awọn odo, nitori A fẹ ki ifihan agbara SCK wa ni kekere nigbati o ko ba wa ni lilo, ati pe ki o tan data lori oke ti pulse (wo Ọpọtọ. Oke eti ninu iwe data DM634).

Nipa ọna, nibi a kọkọ pade ẹya kan ti awọn fokabulari ni awọn iwe data ST: ninu wọn a ti kọ gbolohun naa “tunto bit si odo” lati tun a bitsugbon ko lati ko diẹ, bi, fun apẹẹrẹ, Atmega.

3. Ṣeto DFF bit lati mọ boya awọn data Àkọsílẹ ni 8-bit tabi 16-bit kika

Mo mu DM16 634-bit pataki kan ki o má ba ṣe wahala pẹlu gbigbe data PWM 12-bit, bii DM633 naa. O jẹ oye lati ṣeto DFF si ọkan:

#define DFF         0x0800

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

4. Tunto LSBFIRST bit ni SPI_CR1 forukọsilẹ lati mọ awọn Àkọsílẹ kika

LSBFIRST, gẹgẹbi orukọ rẹ ṣe daba, tunto gbigbe pẹlu nkan pataki ti o kere ju akọkọ. Ṣugbọn DM634 fẹ lati gba data ti o bẹrẹ lati iwọn pataki julọ. Nitorina, a fi o si ipilẹ.

5. Ni hardware mode, ti o ba ti input lati NSS pin wa ni ti beere, waye kan to ga ifihan agbara si awọn NSS pin nigba gbogbo baiti gbigbe ọkọọkan. Ni ipo sọfitiwia NSS, ṣeto SSM ati SSI die-die ni iforukọsilẹ SPI_CR1. Ti o ba ti NSS pinni ni lati ṣee lo bi ohun o wu, nikan SSOE bit nilo lati ṣeto.

Fi SSM ati SSI sori ẹrọ lati gbagbe nipa ipo ohun elo NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. MSTR ati SPE die-die gbọdọ wa ni ṣeto (wọn wa ni ṣeto nikan ti ifihan NSS ba ga)

Lootọ, pẹlu awọn ege wọnyi a ṣe apẹrẹ SPI wa bi ọga ati tan-an:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI ti tunto, jẹ ki a kọ awọn iṣẹ lẹsẹkẹsẹ ti o firanṣẹ awọn baiti si awakọ naa. Tẹsiwaju kika 25.3.3 “Ṣiṣeto SPI ni ipo titunto si”:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Ibere ​​gbigbe data
Gbigbe bẹrẹ nigbati a ba kọ baiti kan si ifipamọ Tx.
Awọn baiti data ti wa ni ti kojọpọ sinu naficula Forukọsilẹ ni ni afiwe mode (lati awọn ti abẹnu akero) nigba awọn gbigbe ti akọkọ bit, lẹhin eyi ti o ti wa ni zqwq si lesese MOSI pin mode, akọkọ tabi kẹhin bit siwaju da lori awọn eto ti LSBFIRST bit ni CPI_CR1 Forukọsilẹ. Ti ṣeto asia TXE lẹhin gbigbe data lati ifipamọ Tx lati yi iforukọsilẹ, ati pe o tun ṣe idalọwọduro ti TXEIE bit ninu iforukọsilẹ CPI_CR1 ti ṣeto.

Mo ṣe afihan awọn ọrọ diẹ ninu itumọ lati fa ifojusi si ẹya kan ti imuse SPI ni awọn olutona STM. Lori Atmega asia TXE (Tx Sofo, Tx ti ṣofo ati setan lati gba data) ti ṣeto nikan lẹhin gbogbo baiti ti firanṣẹ ita. Ati ki o nibi yi Flag ti ṣeto lẹhin ti awọn baiti ti a ti fi sii sinu awọn ti abẹnu naficula Forukọsilẹ. Niwọn igba ti o ti tẹ sibẹ pẹlu gbogbo awọn ege ni akoko kanna (ni afiwe), ati lẹhinna data naa ti tan kaakiri, ti ṣeto TXE ṣaaju ki o to firanṣẹ patapata. Eleyi jẹ pataki nitori ninu ọran ti awakọ LED wa, a nilo lati fa PIN LAT lẹhin fifiranṣẹ всех data, i.e. Asia TXE nikan ko ni to fun wa.

Eyi tumọ si pe a nilo asia miiran. Jẹ ki a wo 25.3.7 - “Awọn asia ipo”:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
<…>
Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
ỌJỌ asia
Ti ṣeto asia BSY ati imukuro nipasẹ ohun elo (kikọ si ko ni ipa). Asia BSY tọkasi ipo ti Layer ibaraẹnisọrọ SPI.
O tun:
nigbati gbigbe ba ti pari (ayafi ni ipo titunto si ti gbigbe naa ba tẹsiwaju)
nigbati SPI jẹ alaabo
nigbati aṣiṣe ipo titunto si waye (MODF=1)
Ti gbigbe naa ko ba tẹsiwaju, asia BSY ti parẹ laarin gbigbe data kọọkan

O dara, eyi yoo wa ni ọwọ. Jẹ ki a wa ibi ti ifipamọ Tx wa. Lati ṣe eyi, ka "Iforukọsilẹ Data SPI":

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Bits 15: 0 DR [15: 0] Data Forukọsilẹ
Data ti o gba tabi data lati gbejade.
Iforukọsilẹ data ti pin si awọn buffers meji - ọkan fun kikọ (fifipamọ gbigbe) ati ọkan fun kika (gba ifipamọ). Kikọ si iforukọsilẹ data kọwe si ifipamọ Tx, ati kika lati iforukọsilẹ data yoo da iye ti o wa ninu ifipamọ Rx pada.

O dara, ati iforukọsilẹ ipo, nibiti a ti rii awọn asia TXE ati BSY:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

A kọ:

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

O dara, niwọn igba ti a nilo lati tan kaakiri awọn akoko 16 awọn baiti meji, ni ibamu si nọmba awọn abajade awakọ LED, nkan bii eyi:

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

Ṣugbọn a ko mọ bi a ṣe le fa PIN LAT sibẹsibẹ, nitorinaa a yoo pada si I/O.

Pipin awọn pinni

Ninu STM32F1, awọn iforukọsilẹ lodidi fun ipo awọn pinni jẹ ohun dani. O han gbangba pe ọpọlọpọ wọn wa ju Atmega lọ, ṣugbọn wọn tun yatọ si awọn eerun STM miiran. Abala 9.1 Apejuwe Gbogbogbo ti GPIO:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Kọọkan ti gbogboogbo idi ti mo ti / O ibudo (GPIO) ni o ni meji 32-bit iṣeto ni forukọsilẹ (GPIOx_CRL ati GPIOx_CRH), meji 32-bit data forukọsilẹ (GPIOx_IDR ati GPIOx_ODR), 32-bit ṣeto / tun Forukọsilẹ (GPIOx_BSRR), 16-bit tun Forukọsilẹ (GPIOx_BRR) ati ki o kan 32- Iforukọsilẹ ìdènà bit (GPIOx_LCKR).

Awọn iforukọsilẹ meji akọkọ jẹ dani, ati pe ko rọrun, nitori awọn pinni ibudo 16 ti tuka kaakiri wọn ni ọna kika “awọn iwọn mẹrin fun arakunrin”. Awon. pinni odo si meje wa ni CRL, ati awọn iyokù wa ni CRH. Ni akoko kanna, awọn iforukọsilẹ ti o ku ni aṣeyọri ni awọn ipin ti gbogbo awọn pinni ti ibudo naa - nigbagbogbo ti o ku idaji “ipamọ”.

Fun ayedero, jẹ ki ká bẹrẹ lati opin ti awọn akojọ.

A ko nilo iforukọsilẹ ìdènà.

Eto ati awọn iforukọsilẹ atunto jẹ ohun ti o dun ni pe wọn ṣe pidánpidán ara wọn: o le kọ ohun gbogbo nikan ni BSRR, nibiti awọn iwọn 16 ti o ga julọ yoo tun pin pin si odo, ati awọn isalẹ yoo ṣeto si 1, tabi o tun le tun. lo BRR, isalẹ 16 die-die ti eyi ti nikan tun awọn pin . Mo fẹran aṣayan keji. Awọn iforukọsilẹ wọnyi ṣe pataki nitori wọn pese iraye si atomiki si awọn pinni:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Atomic Ṣeto tabi Tunto
Ko si iwulo lati mu awọn idalọwọduro kuro nigbati siseto GPIOx_ODR ni ipele bit: ọkan tabi diẹ ẹ sii awọn die-die le yipada pẹlu iṣẹ kikọ atomiki kan ṣoṣo APB2. Eyi jẹ aṣeyọri nipa kikọ “1” si iforukọsilẹ ṣeto/tunto (GPIOx_BSRR tabi, fun atunto nikan, GPIOx_BRR) ti bit ti o nilo lati yipada. Awọn die-die miiran yoo wa ni iyipada.

Awọn iforukọsilẹ data ni awọn orukọ alaye ti ara ẹni - IDR = Input Iforukọsilẹ itọsọna, iforukọsilẹ titẹ sii; ODR = o wu Iforukọsilẹ itọsọna, iforukọsilẹ o wu. A kii yoo nilo wọn ninu iṣẹ akanṣe lọwọlọwọ.

Ati nikẹhin, awọn iforukọsilẹ iṣakoso. Niwọn bi a ti nifẹ si awọn pinni SPI keji, eyun PB13, PB14 ati PB15, a wo CRH lẹsẹkẹsẹ:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Ati pe a rii pe a yoo nilo lati kọ nkan ni awọn die-die lati 20 si 31.

A ti ṣayẹwo tẹlẹ loke ohun ti a fẹ lati awọn pinni, nitorinaa Emi yoo ṣe laisi sikirinifoto kan, Emi yoo kan sọ pe MODE n ṣalaye itọsọna naa (iwọle ti o ba ṣeto awọn iwọn mejeeji si 0) ati iyara pin (a nilo 50MHz, ie. mejeeji pin si "1"), ati CNF ṣeto ipo naa: deede "titari-fa" - 00, "yiyan" - 10. Nipa aiyipada, bi a ti ri loke, gbogbo awọn pinni ni bit kẹta lati isalẹ (CNF0), o ṣeto wọn si ipo lilefoofo input.

Niwọn igba ti Mo gbero lati ṣe nkan miiran pẹlu chirún yii, fun ayedero Mo ti ṣalaye gbogbo MODE ati awọn iye CNF ti o ṣeeṣe fun awọn iforukọsilẹ iṣakoso isalẹ ati oke.

Bakan bi eleyi

#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

Awọn pinni wa wa lori ibudo B (adirẹsi ipilẹ - 0x40010C00), koodu:

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

Ati pe, ni ibamu, o le kọ awọn asọye fun LAT, eyiti yoo yipada nipasẹ awọn iforukọsilẹ BRR ati 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 nikan nipasẹ inertia, o jẹ nigbagbogbo bẹ bẹ, jẹ ki o duro)

Bayi ohun gbogbo jẹ nla, ṣugbọn ko ṣiṣẹ. Nitori eyi jẹ STM32, wọn fipamọ ina mọnamọna, eyiti o tumọ si pe o nilo lati mu ṣiṣẹ clocking ti awọn agbeegbe ti o nilo.

Tan clocking

Aago naa, ti a tun mọ ni Aago, jẹ iduro fun clocking. Ati pe a le ṣe akiyesi abbreviation RCC tẹlẹ. A n wa ninu iwe: eyi ni Tunto ati Iṣakoso aago.

Gẹgẹbi a ti sọ loke, o da, apakan ti o nira julọ ti koko-ọrọ aago ni a ṣe fun wa nipasẹ awọn eniyan lati STM, fun eyiti a dupẹ lọwọ wọn pupọ (lẹẹkansi Emi yoo fun ọna asopọ kan si Di Halt ká aaye ayelujara, lati jẹ ki o ṣe alaye bi o ti jẹ airoju). A nilo awọn iforukọsilẹ nikan ti o ni iduro fun ṣiṣe clocking agbeegbe (Aago Agbeegbe Muu Awọn iforukọsilẹ ṣiṣẹ). Ni akọkọ, jẹ ki a wa adirẹsi ipilẹ ti RCC, o wa ni ibẹrẹ pupọ ti “Map Iranti”:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

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

Ati lẹhinna boya tẹ ọna asopọ nibiti o ti gbiyanju lati wa nkan kan ninu awo, tabi, pupọ julọ, lọ nipasẹ awọn apejuwe ti awọn iforukọsilẹ ti o muu lati awọn apakan nipa jeki awọn iforukọsilẹ. Nibo ni a yoo rii RCC_APB1ENR ati RCC_APB2ENR:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Ati pe wọn, ni ibamu, ni awọn ege ti o pẹlu clocking ti SPI2, IOPB (I/O Port B) ati awọn iṣẹ yiyan (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;

Ik koodu le ṣee ri nibi.

Ti o ba ni aye ati ifẹ lati ṣe idanwo, lẹhinna so DM634 pọ bii eyi: DAI si PB15, DCK si PB13, LAT si PB14. A fi agbara iwakọ lati 5 volts, maṣe gbagbe lati so awọn aaye.

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

STM8 PWM

PWM lori STM8

Nigbati Mo kan gbero nkan yii, Mo pinnu, gẹgẹbi apẹẹrẹ, lati gbiyanju lati ṣakoso diẹ ninu awọn iṣẹ ṣiṣe ti chirún ti ko mọ nipa lilo iwe data nikan, ki Emi ko le pari pẹlu alagidi bata laisi bata bata. STM8 jẹ apẹrẹ fun ipa yii: Ni akọkọ, Mo ni awọn igbimọ Kannada meji kan pẹlu STM8S103, ati ni ẹẹkeji, kii ṣe olokiki pupọ, ati nitori naa idanwo lati ka ati wa ojutu kan lori Intanẹẹti da lori aini awọn solusan pupọ wọnyi.

Awọn ërún tun ni iwe data и itọkasi Afowoyi RM0016, ni akọkọ nibẹ ni pinout ati awọn adirẹsi iforukọsilẹ, ni keji - ohun gbogbo miiran. STM8 ti ṣe eto ni C ni IDE ẹru ST Visual Development.

clocking ati I/O

Nipa aiyipada, STM8 nṣiṣẹ ni igbohunsafẹfẹ 2 MHz, eyi gbọdọ ṣe atunṣe lẹsẹkẹsẹ.

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
HSI (Iwọn Iyara ti abẹnu) Aago
Ifihan aago HSI ti wa lati inu 16 MHz RC oscillator pẹlu ipin ti o le ṣe eto (1 si 8). O ti ṣeto ni iforukọsilẹ aago pin (CLK_CKDIVR).
Akiyesi: ni ibẹrẹ, oscillator HSI RC kan ti o ni ipin 8 ni a yan bi orisun asiwaju ti ifihan aago.

A rii adirẹsi iforukọsilẹ ninu iwe data, apejuwe ni refman ati rii pe iforukọsilẹ nilo lati nu:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Niwọn igba ti a yoo ṣiṣẹ PWM ati so awọn LED pọ, jẹ ki a wo pinout:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Ni ërún ni kekere, ọpọlọpọ awọn iṣẹ ti wa ni ti daduro lori kanna pinni. Ohun ti o wa ninu awọn biraketi onigun mẹrin jẹ “iṣẹ-ṣiṣe omiiran”, o ti yipada nipasẹ “awọn baiti aṣayan” (aṣayan baiti) – nkankan bi Atmega fuses. O le yi awọn iye wọn pada ni eto, ṣugbọn kii ṣe dandan, nitori Iṣẹ-ṣiṣe tuntun ti mu ṣiṣẹ nikan lẹhin atunbere. O rọrun lati lo ST Visual Programmer (ti ṣe igbasilẹ pẹlu Idagbasoke wiwo), eyiti o le yi awọn baiti wọnyi pada. Pinout fihan pe awọn pinni CH1 ati CH2 ti aago akọkọ ti wa ni pamọ ni awọn biraketi onigun mẹrin; o jẹ dandan lati ṣeto awọn iwọn AFR1 ati AFR0 ni STVP, ati pe keji yoo tun gbejade CH1 ti aago keji lati PD4 si PC5.

Nitorinaa, awọn pinni 6 yoo ṣakoso awọn LED: PC6, PC7 ati PC3 fun akoko akọkọ, PC5, PD3 ati PA3 fun keji.

Ṣiṣeto awọn pinni I/O funrararẹ lori STM8 rọrun ati ọgbọn diẹ sii ju lori STM32:

  • faramọ lati iforukọsilẹ itọsọna data Atmega DDR (Iforukọsilẹ Itọsọna Itọsọna): 1 = àbájáde;
  • iforukọsilẹ iṣakoso akọkọ CR1, nigbati o ba jade, ṣeto ipo titari-fa (1) tabi ṣiṣan ṣiṣi (0); niwon Mo ti so awọn LED to awọn ërún pẹlu cathodes, Mo fi odo nibi;
  • awọn keji Iṣakoso Forukọsilẹ CR2, nigbati o wu, kn aago iyara: 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

Eto PWM

Ni akọkọ, jẹ ki a ṣalaye awọn ofin:

  • PWM Igbohunsafẹfẹ – igbohunsafẹfẹ pẹlu eyi ti aago ami;
  • Atunse laifọwọyi, AR - iye ti o ṣee gbe soke si eyiti aago yoo ka (akoko polusi);
  • Iṣẹlẹ imudojuiwọn, UEV - iṣẹlẹ ti o waye nigbati aago ti ka si AR;
  • PWM Ojuse ọmọ – PWM ojuse ọmọ, igba ti a npe ni "ojuse ifosiwewe";
  • Yaworan / Afiwe Iye – iye fun Yaworan / lafiwe, si eyi ti awọn aago ti ka yoo se nkankan (ninu ọran ti PWM, o yi ifihan agbara jade);
  • Iṣagbekalẹ Iye – a ti kojọpọ iye. Afiwe iye ko le yi nigba ti aago ti wa ni ticking, bibẹkọ ti awọn PWM ọmọ yoo fọ. Nitorinaa, awọn iye gbigbe tuntun ni a gbe sinu ifipamọ ati fa jade nigbati aago ba de opin kika rẹ ati tunto;
  • Idena-eti и Awọn ipo ibaramu aarin - titete lẹba aala ati ni aarin, kanna bi Atmel's Yara PWM и Alakoso-ti o tọ PWM.
  • OCiREF, Ijade Ifiweranṣẹ Ifiweranṣẹ Ifiweranṣẹ - ifihan agbara itọka, ni otitọ, kini o han lori PIN ti o baamu ni ipo PWM.

Gẹgẹbi o ti han tẹlẹ lati pinout, awọn aago meji ni awọn agbara PWM - akọkọ ati keji. Mejeji jẹ 16-bit, akọkọ ni ọpọlọpọ awọn ẹya afikun (ni pataki, o le ka mejeeji si oke ati isalẹ). A nilo awọn mejeeji lati ṣiṣẹ ni dọgbadọgba, nitorinaa Mo pinnu lati bẹrẹ pẹlu ẹni keji ti o jẹ talaka ti o han gedegbe, ki a ma ṣe lo nkan ti ko si nibẹ lairotẹlẹ. Diẹ ninu awọn iṣoro ni pe ijuwe ti iṣẹ ṣiṣe PWM ti gbogbo awọn akoko ti o wa ninu itọnisọna itọkasi wa ninu ipin nipa aago akọkọ (17.5.7 PWM Ipo), nitorina o ni lati fo sẹhin ati siwaju jakejado iwe naa ni gbogbo igba.

PWM lori STM8 ni anfani pataki lori PWM lori Atmega:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
PWM ti o ni ibamu si Aala
Iṣeto ni iroyin lati isalẹ si oke
Iṣiro-isalẹ n ṣiṣẹ ti DIR bit ninu iforukọsilẹ TIM_CR1 ba ti kuro
Apeere:
Apeere naa nlo ipo PWM akọkọ. Ifihan agbara itọkasi PWM OCIREF ti wa ni giga niwọn igba ti TIM1_CNT <TIM1_CCRi. Bibẹẹkọ o gba ipele kekere kan. Ti iye lafiwe ninu iforukọsilẹ TIM1_CCRi ba tobi ju iye autoload lọ (orukọ TIM1_ARR), ifihan OCIREF wa ni 1. Ti iye lafiwe ba jẹ 0, OCIREF wa ni idaduro ni odo....

STM8 aago nigba iṣẹlẹ imudojuiwọn sọwedowo akọkọ afiwe iye, ati ki o nikan ki o si gbe awọn kan itọkasi ifihan agbara. Aago Atmega kọkọ skru soke ati lẹhinna ṣe afiwe, ti o yọrisi compare value == 0 iṣẹjade jẹ abẹrẹ kan, eyiti o gbọdọ ṣe pẹlu bakan (fun apẹẹrẹ, nipa yiyipada ero inu eto).

Nitorina ohun ti a fẹ ṣe: 8-bit PWM (AR == 255), kika lati isalẹ si oke, titete lẹba aala. Niwọn igba ti awọn gilobu ina ti sopọ si ërún nipasẹ awọn cathodes, PWM yẹ ki o jade 0 (LED lori) titi di afiwe iye ati 1 lẹhin.

A ti ka nipa diẹ ninu awọn Ipo PWM, nitorinaa a rii iforukọsilẹ ti a beere fun ti aago keji nipa wiwa ninu itọnisọna itọkasi fun gbolohun yii (18.6.8 - TIMx_CCMR1):

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
110: Первый режим ШИМ – при счете снизу вверх, первый канал активен, пока TIMx_CNT < TIMx_CCR1. В противном случае первый канал неактивен. [дальше в документе ошибочный копипаст из таймера 1] 111: Второй режим ШИМ – при счете снизу вверх, первый канал неактивен, пока TIMx_CNT < TIMx_CCR1. В противном случае первый канал активен.

Niwọn igba ti awọn LED ti sopọ si MK nipasẹ awọn cathodes, ipo keji baamu wa (akọkọ paapaa, ṣugbọn a ko mọ iyẹn sibẹsibẹ).

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Bit 3 OC1PE: Mu pin 1 ṣiṣẹ iṣaju iṣaju
0: Iforukọsilẹ iṣaju iṣaju lori TIMx_CCR1 jẹ alaabo. O le kọ si TIMx_CCR1 nigbakugba. Awọn titun iye ṣiṣẹ lẹsẹkẹsẹ.
1: Iforukọsilẹ iṣaju iṣaju lori TIMx_CCR1 ti ṣiṣẹ. Ka/ki awọn iṣẹ ṣiṣe wọle si iforukọsilẹ iṣaaju. Iye ti a ti kojọpọ TIMx_CCR1 ti wa ni ikojọpọ sinu iforukọsilẹ ojiji lakoko iṣẹlẹ imudojuiwọn kọọkan.
* Akiyesi: Fun ipo PWM lati ṣiṣẹ daradara, awọn iforukọsilẹ iṣaju gbọdọ wa ni muu ṣiṣẹ. Eyi kii ṣe pataki ni ipo ifihan ẹyọkan (o ti ṣeto bit OPM ni iforukọsilẹ TIMx_CR1).

O dara, jẹ ki a tan ohun gbogbo ti a nilo fun awọn ikanni mẹta ti aago keji:

#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 ni awọn iforukọsilẹ mẹjọ-bit meji, ohun gbogbo rọrun:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Aago keji le ka nikan lati isalẹ si oke, titete lẹba aala, ko si ohun ti o nilo lati yipada. Jẹ ká ṣeto awọn igbohunsafẹfẹ divider, fun apẹẹrẹ, to 256. Fun awọn keji aago, awọn pin ti wa ni ṣeto ni TIM2_PSCR Forukọsilẹ ati ki o jẹ a agbara ti meji:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Gbogbo ohun ti o ku ni lati tan-an awọn ipari ati aago keji funrararẹ. Iṣoro akọkọ jẹ ipinnu nipasẹ awọn iforukọsilẹ Yaworan / Afiwera jeki: awọn ikanni meji wa, awọn ikanni mẹta ti o tuka kọja wọn ni aipe. Nibi a tun le kọ ẹkọ pe o ṣee ṣe lati yi polarity ti ifihan agbara, i.e. Ni opo, o ṣee ṣe lati lo Ipo PWM 1. A kọ:

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

Ati nikẹhin, a bẹrẹ aago ni iforukọsilẹ TIMx_CR1:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Jẹ ki a kọ afọwọṣe ti o rọrun ti AnalogWrite (), eyiti yoo gbe awọn iye gangan si aago fun lafiwe. Awọn iforukọsilẹ ni orukọ asọtẹlẹ Yaworan / Afiwe awọn iforukọsilẹ, meji ninu wọn wa fun ikanni kọọkan: aṣẹ-kekere 8 bits ni TIM2_CCRxL ati awọn aṣẹ-giga ni TIM2_CCRxH. Niwọn igba ti a ti ṣẹda PWM 8-bit kan, o to lati kọ awọn iwọn pataki ti o kere ju:

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

Oluka ti o tẹtisi yoo ṣe akiyesi pe a ni PWM ti o ni abawọn diẹ, ko lagbara lati gbejade 100% kun (ni iye ti o pọju ti 255, ifihan agbara ti yipada fun akoko aago kan). Fun awọn LED eyi ko ṣe pataki, ati pe oluka akiyesi le tẹlẹ gboju bi o ṣe le ṣatunṣe.

PWM lori aago keji n ṣiṣẹ, jẹ ki a lọ si akọkọ.

Aago akọkọ ni awọn die-die kanna ni awọn iforukọsilẹ kanna (o kan pe awọn die-die ti o wa “fipamọ” ni akoko keji ni a lo ni itara ni akọkọ fun gbogbo iru awọn nkan ilọsiwaju). Nitorinaa, o to lati wa awọn adirẹsi ti awọn iforukọsilẹ kanna ni iwe data ati daakọ koodu naa. O dara, yi iye ti pinpin igbohunsafẹfẹ pada, nitori... Aago akọkọ fẹ lati gba kii ṣe agbara ti meji, ṣugbọn iye 16-bit gangan ni awọn iforukọsilẹ meji Prescaler High и Low. A ṣe ohun gbogbo ati ... akoko akoko akọkọ ko ṣiṣẹ. Kin o nsele?

Iṣoro naa le ṣee yanju nikan nipasẹ wiwo nipasẹ gbogbo apakan nipa awọn iforukọsilẹ iṣakoso ti aago 1, nibiti a ti wa ọkan ti akoko keji ko ni. O maa wa nibe 17.7.30 Iforukọsilẹ adehun (TIM1_BKR), nibiti nkan yii wa:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Muu iṣẹjade akọkọ ṣiṣẹ

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Iyẹn ni gbogbo daju ni bayi, koodu naa Nibẹ.

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

STM8 Multiplex

Multiplexing on STM8

Ise agbese kekere kẹta ni lati so awọn LED RGB mẹjọ pọ si aago keji ni ipo PWM ati jẹ ki wọn ṣafihan awọn awọ oriṣiriṣi. O da lori ero ti multixing LED, eyiti o jẹ pe ti o ba tan ati pa awọn LED pupọ, yarayara, yoo dabi si wa pe wọn wa ni titan nigbagbogbo (itẹramọsẹ ti iran, inertia ti iwo wiwo). Mo ti ṣe ni ẹẹkan nkankan bi yi lori Arduino.

algorithm iṣẹ dabi eyi:

  • ti sopọ anode ti akọkọ RGB LED;
  • tan o, fifiranṣẹ awọn ifihan agbara pataki si awọn cathodes;
  • duro titi ti opin ti awọn PWM ọmọ;
  • ti sopọ anode ti LED RGB keji;
  • tan...

O dara, ati bẹbẹ lọ. Nitoribẹẹ, fun iṣẹ ṣiṣe ẹlẹwa o nilo pe anode ti sopọ ati pe LED “ti tan” ni akoko kanna. O dara, tabi fere. Ni eyikeyi ọran, a nilo lati kọ koodu kan ti yoo gbejade awọn iye ni awọn ikanni mẹta ti aago keji, yi wọn pada nigbati o ba de UEV, ati ni akoko kanna yipada RGB LED lọwọlọwọ lọwọlọwọ.

Niwọn igba ti iyipada LED jẹ aifọwọyi, a nilo lati ṣẹda “iranti fidio” lati eyiti oluṣakoso idalọwọduro yoo gba data. Eyi jẹ eto ti o rọrun:

uint8_t colors[8][3];

Lati yi awọ ti LED kan pato pada, yoo to lati kọ awọn iye ti a beere sinu titobi yii. Ati oniyipada yoo jẹ iduro fun nọmba ti LED ti nṣiṣe lọwọ

uint8_t cnt;

Demux

Fun multiplexing to dara, a nilo, oddly to, CD74HC238 demultiplexer. Demultiplexer - ërún ti o mu oniṣẹ ṣiṣẹ ni hardware <<. Nipasẹ awọn pinni titẹ sii mẹta (awọn die-die 0, 1 ati 2) a jẹ ifunni nọmba X-bit mẹta, ati ni idahun o mu nọmba abajade ṣiṣẹ (1<<X). Awọn igbewọle ti o ku ti ërún ni a lo lati ṣe iwọn gbogbo apẹrẹ. A nilo chirún yii kii ṣe lati dinku nọmba awọn pinni ti a tẹdo ti microcontroller, ṣugbọn tun fun ailewu - nitorinaa ki o maṣe tan-an awọn LED diẹ sii lairotẹlẹ ju ti ṣee ṣe ati ki o ma sun MK naa. Chirún naa jẹ owo idẹ kan ati pe o yẹ ki o wa ni ipamọ nigbagbogbo ninu minisita oogun ile rẹ.

CD74HC238 wa yoo jẹ iduro fun fifun foliteji si anode ti LED ti o fẹ. Ni multiplex ti o ni kikun, yoo pese foliteji si iwe nipasẹ P-MOSFET, ṣugbọn ninu demo yii o ṣee ṣe taara, nitori o fa 20 mA, gẹgẹ bi idi o pọju-wonsi ninu iwe data. Lati Iwe data CD74HC238 a nilo pinouts ati iwe iyanjẹ yii:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
H = ipele foliteji giga, L = ipele foliteji kekere, X – maṣe bikita

A so E2 ati E1 si ilẹ, E3, A0, A1 ati A3 si awọn pinni PD5, PC3, PC4 ati PC5 ti STM8. Niwọn igba ti tabili ti o wa loke ni awọn ipele kekere ati giga, a tunto awọn pinni wọnyi bi awọn pinni titari-fa.

PWM

PWM lori aago keji jẹ tunto ni ọna kanna bi ninu itan iṣaaju, pẹlu awọn iyatọ meji:

Ni akọkọ, a nilo lati mu idalọwọduro ṣiṣẹ Iṣẹlẹ imudojuiwọn (UEV) eyi ti yoo pe iṣẹ kan ti o toggles ti nṣiṣe lọwọ LED. Eyi ni a ṣe nipa yiyipada bit Ṣiṣe imudojuiwọn Idilọwọ ni a Forukọsilẹ pẹlu kan enikeji orukọ

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
Idilọwọ iforukọsilẹ ṣiṣẹ

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Iyatọ keji jẹ ibatan si iṣẹlẹ ti multiplexing, bii ghosting - parasitic alábá ti diodes. Ninu ọran wa, o le han nitori otitọ pe aago naa, ti o fa idalọwọduro lori UEV, tẹsiwaju lati fi ami si, ati oluṣakoso idalọwọduro ko ni akoko lati yi LED pada ṣaaju ki aago bẹrẹ lati kọ nkan si awọn pinni. Lati koju eyi, iwọ yoo ni lati yi imọ-ọrọ pada (0 = imọlẹ to pọ julọ, 255 = ko si ohun ti o tan) ati yago fun awọn iye akoko iṣẹ ṣiṣe to gaju. Awon. rii daju wipe lẹhin UEV awọn LED jade patapata fun ọkan PWM ọmọ.

Iyipada polarity:

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

Yago fun eto r, g ati b si 255 ki o ranti lati yi wọn pada nigba lilo wọn.

Idilọwọ

Koko-ọrọ ti idalọwọduro ni pe labẹ awọn ayidayida kan, chirún duro lati ṣiṣẹ eto akọkọ ati pe diẹ ninu iṣẹ ita. Idilọwọ waye nitori ita tabi awọn ipa inu, pẹlu aago.

Nigba ti a kọkọ ṣẹda iṣẹ akanṣe ni ST Visual Develop, ni afikun si main.c a gba ferese kan pẹlu faili aramada kan stm8_interrupt_vector.c, laifọwọyi to wa ninu ise agbese. Ninu faili yii, iṣẹ kan ti pin si idalọwọduro kọọkan NonHandledInterrupt. A nilo lati di iṣẹ wa mọ idalọwọduro ti o fẹ.

Iwe data naa ni tabili ti awọn olutọpa idalọwọduro, nibiti a ti rii awọn ti a nilo:

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8
13 TIM2 imudojuiwọn / aponsedanu
14 TIM2 Yaworan / afiwe

A nilo lati yi LED pada ni UEV, nitorinaa a nilo idalọwọduro #13.

Nitorinaa, ni akọkọ, ninu faili naa stm8_interrupt_vector.c yi orukọ aiyipada ti iṣẹ ti o ni idalọwọduro No.. 13 (IRQ13) pada si tirẹ:

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

Ni ẹẹkeji, a yoo ni lati ṣẹda faili kan main.h pẹlu akoonu wọnyi:

#ifndef __MAIN_H
#define __MAIN_H

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

Ati nikẹhin, kọ iṣẹ yii sinu rẹ 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;
}

Gbogbo ohun ti o ku ni lati mu awọn idilọwọ ṣiṣẹ. Eyi ni a ṣe nipa lilo aṣẹ assembler rim - iwọ yoo ni lati wa ninu rẹ Ilana Afowoyi:

//enable interrupts
_asm("rim");

Miiran assembler pipaṣẹ ni sim – pa awọn idilọwọ. Wọn gbọdọ wa ni pipa lakoko ti a ti kọ awọn iye tuntun si “iranti fidio”, nitorinaa idalọwọduro ti o ṣẹlẹ ni akoko ti ko tọ ko ba eto naa jẹ.

Gbogbo koodu - lori GitHub.

Kika awọn iwe data 2: SPI lori STM32; PWM, awọn aago ati awọn idalọwọduro lori STM8

Ti o ba kere ju ẹnikan rii pe nkan yii wulo, lẹhinna Emi ko kọ ni asan. Emi yoo dun lati gba awọn asọye ati awọn asọye, Emi yoo gbiyanju lati dahun ohun gbogbo.

orisun: www.habr.com

Fi ọrọìwòye kun