Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

В karolo ea pele Ke lekile ho bolella baenjiniere ba ho itlosa bolutu ba elektronike ba holileng ho tloha borikhoe ba Arduino hore na ke hobane'ng ha ba lokela ho bala li-database le litokomane tse ling bakeng sa li-microcontrollers. Taba e ngotsoeng e ile ea bonahala e le khōlō, kahoo ke ile ka tšepisa ho bontša mehlala e sebetsang sehloohong se fapaneng. Hantle, o ne a ipitsa lebese mushroom ...

Kajeno ke tla u bontša mokhoa oa ho sebelisa li-database ho rarolla bothata bo bonolo, empa bo hlokahalang bakeng sa merero e mengata, mesebetsi ho STM32 (Pill Blue) le balaoli ba STM8. Merero eohle ea demo e nehetsoe ho li-LED tseo ke li ratang haholo, re tla li khantša ka bongata, tseo re tla tlameha ho sebelisa mefuta eohle ea li-peripheral tse khahlisang.

Sengoloa se ile sa boela sa fetoha se seholo, kahoo molemong oa ho etsa litaba:

STM32 Blue Pill: Li-LED tse 16 tse nang le mokhanni oa DM634
STM8: Ho theha lithakhisa tse tšeletseng tsa PWM
STM8: Li-LED tsa 8 tsa RGB ka lithakhisa tse tharo, li sitisa

Boitlhotlhollo: Ha ke moenjiniere, ha ke iketse eka ke na le tsebo e tebileng ea lisebelisoa tsa elektroniki, sengoloa se etselitsoe batho ba sa tsebeng letho joalo ka nna. Ha e le hantle, ke ne ke inka lilemo tse peli tse fetileng ke le batho bao ho buuoang ka bona. Haeba motho e mong a ne a mpoleletse ka nako eo hore databases ka chip e sa tloaelehang e ne e sa tšabe ho bala, nka be ke sa qeta nako e ngata ke batla likarolo tse ling tsa khoutu Inthaneteng le ho qapa lithupa tse nang le lisekere le tepi e khomarelang.

Sepheo sa sengoloa sena se ho databases, eseng merero, kahoo khoutu e kanna ea se be makhethe ebile hangata e patisane. Merero ka boeona e bonolo haholo, le hoja e loketse ho tloaelana le chip e ncha ea pele.

Ke tšepa hore sehlooho sa ka se tla thusa motho ea boemong bo tšoanang ba ho qoelisoa mosebetsing oa ho itlosa bolutu.

STM32

Li-LED tse 16 tse nang le DM634 le SPI

Morero o monyane o sebelisang Blue Pill (STM32F103C8T6) le mokhanni oa LED oa DM634. Re sebelisa li-database, re tla fumana mokhanni, likou tsa STM IO le ho lokisa SPI.

DM634

Chip ea Taiwan e nang le liphetho tsa 16 16-bit PWM, e ka hokelloa ka liketane. Mohlala o tlase oa 12-bit o tsejoa ho tsoa morerong oa malapeng Lightpack. Ka nako e 'ngoe, ha ke khetha pakeng tsa DM63x le TLC5940 e tsebahalang, ke khethile DM ka mabaka a' maloa: 1) TLC ho Aliexpress ka sebele ke fake, empa ena ha e joalo; 2) DM e na le PWM e ikemetseng e nang le jenereithara ea eona ea maqhubu; 3) e ne e ka rekoa ka theko e tlaase Moscow, ho e-na le ho emela sephutheloana sa Ali. 'Me, ha e le hantle, ho ne ho thahasellisa ho ithuta ho laola chip ka bouena, ho e-na le ho sebelisa laebrari e lokiselitsoeng. Li-chips li se li hlahisoa haholo ka har'a sephutheloana sa SSOP24; li bonolo ho li rekisa ho adaptara.

Kaha moetsi ke Taiwanese, leqephe la lintlha chip e ngotsoe ka Sechaena Senyesemane, ho bolelang hore e tla ba monate. Pele re sheba pinout (Khokahano ea Pin) ho utloisisa hore na ke leoto lefe le hokahanyang seo, le tlhaloso ea lithakhisa (Tlhaloso ea Pin). Lithako tse 16:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Mehloli ea Sink ea DC (Open Drain)

Senya / Sehlahisoa se bulehileng - ho ntša metsi; mohloli oa metsi a phallang; tlhahiso e amana le fatše sebakeng se sebetsang - li-LED li kopantsoe le mokhanni ka li-cathodes. Ka motlakase, ha e le hantle, sena ha se "drain e bulehileng" (ho bulela metsi), empa ka har'a li-database lebitso lena la li-pin ka har'a drain mode hangata le fumanoa.

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Lihanyetsi tsa kantle lipakeng tsa REXT le GND ho beha boleng ba hona joale ba tlhahiso

Referense ea litšupiso e kentsoe pakeng tsa pinana ea REXT le fatše, e laolang khanyetso ea ka hare ea liphetho, bona kerafo leqepheng la 9 la database. Ho DM634, khanyetso ena e ka laoloa ke software, ho beha khanya ka kakaretso (kganya ya lefatshe lohle); Nke ke ka bua ka lintlha tse qaqileng sehloohong sena, ke tla beha mohanyetsi oa 2.2 - 3 kOhm mona.

Ho utloisisa mokhoa oa ho laola chip, a re shebeng tlhaloso ea sebopeho sa sesebelisoa:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

E, ke ena, Senyesemane sa Sechaena ka khanya eohle ea sona. Ho fetolela sena ho thata, u ka e utloisisa haeba u lakatsa, empa ho na le tsela e 'ngoe - sheba hore na khokahano ea TLC5940 e ts'oanang e hlalosoa joang ka har'a database:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
... Ke lithakhisa tse tharo feela tse hlokahalang ho kenya data ka har'a sesebelisoa. Moeli o ntseng o phahama oa lets'oao la SCLK o fetola data ho tloha ho pin ea SIN ho ea ho ngoliso ea ka hare. Ka mor'a hore boitsebiso bohle bo behoe, letšoao le lekhutšoanyane la XLAT le fetisetsoang ka tatellano ho lirekoto tsa ka hare. Lirekoto tsa ka hare ke liheke tse hlohlellelitsoeng ke boemo ba matšoao a XLAT. Lintlha tsohle li fetisoa tsa bohlokoa haholo pele.

Latch – latch/latch/lock.
Bophahamo ba ho phahama – ntlha e etellang pele ea ho otla ha pelo
MSB pele - bohlokoa ka ho fetisisa (ka ho le letšehali) ho ea pele.
ho koala data - fetisa data ka tatellano (hanyane ka hanyane).

Lentsoe latch hangata e fumanoa litokomaneng tsa li-chips mme e fetoleloa ka litsela tse sa tšoaneng, kahoo molemong oa kutloisiso ke tla itumella

lenaneo le lenyenyane la thutoMokhanni oa LED ha e le hantle ke ngoliso ea li-shift. "Shift" (battlefield) lebitsong - motsamao o fokolang oa data ka har'a sesebelisoa: karolo e 'ngoe le e 'ngoe e ncha e sutumetsoang ka hare e sutumelletsa ketane kaofela ka pele ka pel'a eona. Kaha ha ho motho ea batlang ho bona ho panya ha pherekano ha li-LED nakong ea phetoho, ts'ebetso e etsahala ka har'a li-buffer tse arohaneng le li-registe tse sebetsang ka damper (latch) ke mofuta oa kamore ea ho leta moo likotoana li hlophisoang ka tatellano e batloang. Ha ntho e 'ngoe le e' ngoe e se e loketse, shutter e bula 'me likotoana li ea mosebetsing, li nkela sehlopha se fetileng sebaka. Lentsoe latch litokomaneng tsa li-microcircuits hoo e ka bang kamehla ho bolela damper e joalo, ho sa tsotelehe hore na e sebelisoa ka mefuta efe.

Kahoo, ho fetisetsoa ha data ho DM634 ho etsoa ka tsela ena: beha tlhahiso ea DAI ho boleng ba karolo ea bohlokoa ka ho fetisisa ea LED e hōle, hula DCK holimo le tlaase; beha tlhahiso ea DAI ho boleng ba karolo e latelang, hula DCK; joalo-joalo ho fihlela likarolo tsohle li fetisitsoe (kenelletse), ka mor'a moo re hula LAT. Sena se ka etsoa ka letsoho (bit-bang), empa ho molemo ho sebelisa sebopeho sa SPI se etselitsoeng sena ka ho khetheha, kaha se hlahisoa ho STM32 ea rona ka likopi tse peli.

Pilisi e Putsoa STM32F103

Selelekela: Lilaoli tsa STM32 li rarahane haholo ho feta Atmega328 ho feta kamoo li ka bonahalang li tšosa. Ho feta moo, ka mabaka a ho boloka matla, hoo e batlang e le lisebelisoa tsohle li tima qalong, 'me maqhubu a oache ke 8 MHz ho tloha mohloling o ka hare. Ka lehlohonolo, baetsi ba li-program tsa STM ba ngotse khoutu e tlisang chip ho 72 MHz e "baliloeng", mme bangoli ba li-IDE tsohle tseo ke li tsebang ba li kenyelelitse ts'ebetsong ea ho qala, kahoo ha ho hlokahale hore re e tšoare (empa u ka khona haeba u hlile u batla). Empa u tla tlameha ho bulela li-peripherals.

Litokomane: pilisi e putsoa e na le chip e tsebahalang ea STM32F103C8T6, ho na le litokomane tse peli tsa bohlokoa bakeng sa eona:

Re ka khahloa ke:

  • Li-pinouts - li-chip pinouts - haeba re etsa qeto ea ho iketsetsa liboto;
  • Mmapa wa memori – mmapa wa memori bakeng sa chip e itseng. Bukana ea Litšupiso e na le 'mapa oa mohala kaofela, 'me e bua ka lirekoto tseo ea rona e se nang tsona.
  • Tafole ea Litlhaloso tsa Pin - e thathamisang mesebetsi ea mantlha le e meng ea liphini; bakeng sa "pilisi e putsoa" u ka fumana litšoantšo tse bonolo haholoanyane Inthaneteng ka lethathamo la lipini le mesebetsi ea tsona. Ka hona, hang-hang re google Pill Pill pinout mme re boloka setšoantšo sena se le haufi:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
NB: ho ne ho e-na le phoso setšoantšong se tsoang Inthaneteng, se neng se hlokometsoe maikutlong, kea leboha ka seo. Setšoantšo se nkeloe sebaka, empa sena ke thuto - ho molemo ho hlahloba tlhahisoleseding eseng ho tswa ho databases.

Re tlosa database, re bula Bukana ea Reference, 'me ho tloha joale ho ea pele re e sebelisa feela.
Ts'ebetso: re sebetsana le mokhoa o tloaelehileng oa ho kenya / ho tsoa, ​​re lokisa SPI, re bulela li-peripheral tse hlokahalang.

Kenyeletso

Ho Atmega328, I/O e kengoa ts'ebetsong ka mokhoa o bonolo haholo, ke ka lebaka leo bongata ba likhetho tsa STM32 bo ka ferekanyang. Hona joale re hloka feela liqeto, empa le tsena li na le likhetho tse 'ne:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
bula draina, sututsa-hula, sututsa-hula ka tsela e 'ngoe, ho hula ka mokhoa o mong

"Ho sutumetsa" (Sututsa) ke sehlahisoa se tloaelehileng se tsoang ho Arduino, pinana e ka nka boleng ba HIGH kapa LOW. Empa ka "drain e bulehileng" ho na le mathata, le hoja ha e le hantle ntho e 'ngoe le e' ngoe e bonolo mona:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Phetoho ea tlhahiso / ha boema-kepe bo abetsoe ho hlahisa: / buffer ea tlhahiso e nolofalitsoe: / - mokhoa o bulehileng oa ho hula: "0" ka har'a registara ea tlhahiso e thusa N-MOS, "1" bukeng ea tlhahiso e siea boema-kepe ka mokhoa oa Hi-Z ( P-MOS ha e sebetse ) / – push-pull mode: “0” ho registara ea tlhahiso e kenya tšebetsong N-MOS, “1” ho registara ea tlhahiso e kenya tšebetsong P-MOS.

Phapang eohle lipakeng tsa drain e bulehileng (ho bulela metsi) ho tsoa ho “push-pull” (Sututsa) ke hore pineng ea pele e ke ke ea amohela boemo ba HIGH: ha u ngola e 'ngoe ho registara ea tlhahiso, e kena ka mokhoa o phahameng oa ho hanyetsa (phahameng impedance, Hi-Z). Ha u ngola zero, pinana e sebetsa ka mokhoa o ts'oanang ka mekhoa e 'meli, ka mokhoa o utloahalang le oa motlakase.

Ka mokhoa o tloaelehileng oa tlhahiso, phini e phatlalatsa feela likahare tsa rejisetara ea tlhahiso. Ho "alternative" e laoloa ke li-peripherals tse lumellanang (sheba 9.1.4):

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Haeba port bit e hlophisitsoe joalo ka phini e 'ngoe ea ts'ebetso, pin register ea tima 'me phini e hokeloa ho peripheral pin.

Ts'ebetso e 'ngoe ea phini e' ngoe le e 'ngoe e hlalositsoe ho Litlhaloso tsa Pin Letlapa le teng setšoantšong se kopilitsoeng. Potsong ea seo u lokelang ho se etsa haeba pini e na le mesebetsi e 'maloa e fapaneng, karabo e fanoa ke mongolo o botlaaseng ba leqephe ho database:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Haeba li-peripherals tse ngata li sebelisa pinana e le 'ngoe, ho qoba likhohlano lipakeng tsa mesebetsi e meng, ke karolo e le 'ngoe feela e lokelang ho sebelisoa ka nako e le ngoe, e fetoletsoeng ho sebelisoa oache ea peripheral enable bit (registering e nepahetseng ea RCC).

Qetellong, lithakhisa tsa mokhoa oa tlhahiso li boetse li na le lebelo la oache. Ena ke tšobotsi e 'ngoe ea ho boloka matla; molemong oa rona, re e beha ka holimo ebe rea e lebala.

Kahoo: re sebelisa SPI, e bolelang hore lithakhisa tse peli (tse nang le data le letšoao la oache) e lokela ho ba "mosebetsi o mong oa ho sutumetsa", 'me e' ngoe (LAT) e lokela ho ba "pull-pull" kamehla. Empa pele re ba abela, ha re sebetsaneng le SPI.

SPI

Lenaneo le leng le lenyenyane la thuto

SPI kapa Serial Peripheral Interface (serial peripheral interface) ke sebopeho se bonolo le se sebetsang haholo sa ho hokahanya MK le li-MK tse ling le lefatše le kantle ka kakaretso. Molao-motheo oa ts'ebetso ea oona o se o hlalositsoe ka holimo, moo mabapi le mokhanni oa LED oa Chaena (ka bukeng ea boitsebiso, bona karolo ea 25). SPI e ka sebetsa ka mokhoa oa master ("master") le lekhoba ("lekhoba"). SPI e na le likanale tse 'ne tsa mantlha, tseo e seng kaofela ha tsona tse ka sebelisoang:

  • MOSI, Master Output / Slave Input: pini ena e fetisetsa data ka mokhoa o ka sehloohong, 'me e amohela data ka mokhoa oa makhoba;
  • MISO, Master Input / Sehlahisoa sa Lekhoba: ho fapana le hoo, se amohela mong'a sona, 'me se fetisetsa lekhoba;
  • SCK, Serial Clock: e beha khafetsa phetisetso ea data ho monghali kapa e amohela lets'oao la oache ho lekhoba. Ha e le hantle ho otla li-beats;
  • SS, Khetho ea Makhoba: ka thuso ea mocha ona, lekhoba lea tseba hore ho na le ntho e batloang ho eena. Ho STM32 e bitsoa NSS, moo N = negative, i.e. molaoli o fetoha lekhoba haeba ho na le fatše mocha ona. E hokahana hantle le mokhoa oa Open Drain Output, empa ke pale e 'ngoe.

Joalo ka ntho e ngoe le e ngoe, SPI ho STM32 e na le ts'ebetso e ngata, e etsang hore ho be thata ho e utloisisa. Ka mohlala, e ke ke ea sebetsa feela ka SPI, empa hape le sebopeho sa I2S, 'me litokomaneng litlhaloso tsa bona li kopane, ho hlokahala ho khaola ho feteletseng ka nako e loketseng. Mosebetsi oa rona o bonolo haholo: re hloka feela ho romella data re sebelisa MOSI le SCK feela. Re ea karolong ea 25.3.4 (half-duplex communication, half-duplex communication), moo re fumanang Oache e 1 le terata e le 'ngoe ea data e fapaneng (Lets'oao la oache e le 1 le phallo e le 'ngoe ea data e fapaneng):

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Ka mokhoa ona, sesebelisoa se sebelisa SPI ka mokhoa oa ho fetisa feela kapa oa ho amohela feela. / Mokhoa oa ho fetisa feela o tšoana le mokhoa oa duplex: data e fetisetsoa pineng ea ho fetisa (MOSI ka mokhoa o phahameng kapa MISO ka mokhoa oa makhoba), 'me pinana ea ho amohela (MISO kapa MOSI ka ho latellana) e ka sebelisoa e le pini ea kamehla ea I/O. . Tabeng ena, kopo e hloka feela ho hlokomoloha Rx buffer (haeba e baloa, ho ke ke ha e-ba le data e fetisitsoeng moo).

E kholo, phini ea MISO e lokolohile, a re hokeleng letšoao la LAT ho eona. Ha re shebeng Slave Select, eo ho STM32 e ka laoloang ka mokhoa o hlophisitsoeng, e leng bonolo haholo. Re bala serapa sa lebitso le tšoanang karolong ea 25.3.1 SPI Tlhaloso e Akaretsang:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Taolo ea software ea NSS (SSM = 1) / Tlhahisoleseding ea khetho ea makhoba e fumaneha karolong ea SSI ea rejisetara ea SPI_CR1. Pini ea kantle ea NSS e lula e sa lefelloe litlhoko tse ling tsa ts'ebeliso.

Ke nako ea ho ngolla li-registas. Ke nkile qeto ea ho sebelisa SPI2, ho batla aterese ea eona ea mantlha ho database - karolong ea 3.3 Memory Map:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

Joale, ha re qaleng:

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

Bula karolo ea 25.3.3 e nang le sehlooho se itlhalosang "Ho Hlophisa SPI ka Mokhoa o Motle":

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

1. Beha lebelo la seriale la oache ka li-bits BR[2:0] ho registara ea SPI_CR1.

Lirejiseta li bokelloa karolong ea bukana ea litšupiso ea lebitso le le leng. Phetoho ea aterese (Phetoho ea aterese) bakeng sa CR1 - 0x00, ka ho sa feleng likotoana tsohle lia hlakoloa (Seta boleng bocha 0x0000):

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

Li-bits tsa BR li beha sekhethoa sa oache ea taolo, ka hona ho lekanya hore na SPI e tla sebetsa hangata hakae. Leqhubu la rona la STM32 le tla ba 72 MHz, mokhanni oa LED, ho ea ka database ea eona, o sebetsa ka makhetlo a ho fihlela ho 25 MHz, kahoo re hloka ho arola ka tse 'nè (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. Beha li-bits tsa CPOL le CPHA ho hlalosa kamano pakeng tsa phetiso ea data le nako ea serial oache (sheba setšoantšo se leqepheng la 240)

Kaha re bala datha mona mme re sa shebe meralo, ha re shebisiseng tlhaloso ea mongolo oa likotoana tsa CPOL le CPHA leqepheng la 704 (SPI General Description):

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Mokhahlelo oa oache le polarity
U sebelisa likaroloana tsa CPOL le CPHA tsa ngoliso ea SPI_CR1, u ka khetha likamano tse 'ne tsa nako. CPOL (polarity ea oache) e laola boemo ba lets'oao la oache ha ho se na data e fetisoang. Sekhechana sena se laola mekhoa ea monghali le ea makhoba. Haeba CPOL e setiloe bocha, phini ea SCK e tlase ka mokhoa oa ho phomola. Haeba bonyane ba CPOL bo setiloe, phini ea SCK e phahame nakong ea ho phomola.
Ha CPHA (mohato oa oache) e behiloe, sekhahla se phahameng sa trap strobe ke moeli oa bobeli oa letšoao la SCK (ho oa haeba CPOL e hlakile, e phahama haeba CPOL e behiloe). Lintlha li nkuoa ke phetoho ea bobeli ea lets'oao la oache. Haeba karolo ea CPHA e hlakile, sekhahla se phahameng sa trap strobe ke moeli o ntseng o phahama oa letšoao la SCK (moeli o oelang haeba CPOL e behiloe, ho phahama ha CPOL e tlosoa). Lintlha li nkuoa phetohong ea pele ea lets'oao la oache.

Ha re se re nkile tsebo ena, re fihlela qeto ea hore likotoana ka bobeli li tlameha ho lula li le zeros, hobane Re batla hore lets'oao la SCK le lule le le tlase ha le sa sebelisoe, 'me data e fetisoe pheletsong e ntseng e phahama ea sekhahla (bona Fig. Phahamiso e Phallang Lethathamo la lintlha tsa DM634

Ka tsela, mona re ile ra qala ho kopana le karolo ea pokello ea mantsoe ho li-database tsa ST: ho tsona poleloana e reng "reset bit to zero" e ngotsoe. ho seta hanyane, eseng ho hleka hanyane, joalo ka mohlala, Atmega.

3. Beha biti ea DFF ho ​​fumana hore na data block ke 8-bit kapa 16-bit format

Ka ho khetheha ke ile ka nka DM16 ea 634-bit e le hore ke se ke ka ikhathatsa ka ho fetisetsa data ea 12-bit PWM, joaloka DM633. Hoa utloahala ho beha DFF ho ​​e 'ngoe:

#define DFF         0x0800

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

4. Lokisa karoloana ea LSBFIRST ho rejisetara ea SPI_CR1 ho fumana sebopeho sa block

LSBFIRST, joalo ka ha lebitso la eona le fana ka maikutlo, e hlophisa phetisetso ka bonyane ba bohlokoa pele. Empa DM634 e batla ho fumana data ho qala ka karolo ea bohlokoahali. Ka hona, re e tlohela e tsosolositsoe.

5. Ka mokhoa oa hardware, haeba ho kenya letsoho ho tsoa pineng ea NSS ho hlokahala, sebelisa letšoao le phahameng ho pin ea NSS nakong ea tatellano eohle ea phetisetso ea byte. Ka mokhoa oa software oa NSS, seta likotoana tsa SSM le SSI bukeng ea SPI_CR1. Haeba phini ea NSS e tla sebelisoa e le tlhahiso, ke karoloana feela ea SSOE e lokelang ho hlophisoa.

Kenya SSM le SSI ho lebala ka mokhoa oa hardware oa NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Li-bits tsa MSTR le SPE li tlameha ho hlophisoa (li lula li setiloe ha feela lets'oao la NSS le le holimo)

Haele hantle, ka likotoana tsena re khetha SPI ea rona e le setsebi ebe re e bulela:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI e hlophisitsoe, hang-hang re ngole mesebetsi e romellang li-byte ho mokhanni. Tsoela pele ho bala 25.3.3 "Ho lokisa SPI ka mokhoa o ka sehloohong":

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Taelo ea phetiso ea data
Phetiso e qala ha byte e ngolloa ho Tx buffer.
Data byte e kentsoe ho shift registering ho bapile mokhoa (ho tloha ka bese e ka hare) nakong ea phetiso ea karoloana ea pele, ka mor'a moo e fetisetsoa ho sequential Mokhoa oa phini oa MOSI, oa pele kapa oa ho qetela o ea pele ho latela tlhophiso ea biti ea LSBFIRST bukeng ea CPI_CR1. Folakha ea TXE e behiloe kamora phetisetso ea data ho tloha Tx buffer ho ea ho shift registering, hape e hlahisa tšitiso haeba hanyane ea TXEIE ho rejisetara ea CPI_CR1 e setiloe.

Ke ile ka totobatsa mantsoe a seng makae phetolelong ho lebisa tlhokomelo tšobotsing e 'ngoe ea ts'ebetsong ea SPI ho balaoli ba STM. Ho Atmega folakha ea TXE (Tx Ha e na letho, Tx ha e na letho 'me e loketse ho amohela data) e behiloe feela ka mor'a hore byte eohle e rometsoe kantle. 'Me mona folakha ena e behiloe ka mor'a hore li-byte li kenngoe ka har'a rejisetara ea li- shift ka hare. Kaha e sutumetsoa moo ka likotoana tsohle ka nako e le 'ngoe (ka ho ts'oana), ebe data e fetisetsoa ka tatellano, TXE e behiloe pele byte e romelloa ka ho feletseng. Sena se bohlokoa hobane tabeng ea mokhanni oa rona oa LED, re hloka ho hula pinana ea LAT ka mor'a ho romela всех data, i.e. Folakha ea TXE feela e ke ke ea re lekana.

Sena se bolela hore re hloka folakha e 'ngoe. Ha re shebeng 25.3.7 - "Lifolakha tsa Boemo":

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
<…>
Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
PHATHABANG folakha
Letlapa la BSY le behiloe le ho hlakoloa ke hardware (ho e ngolla ha ho na phello). Folakha ea BSY e bontša boemo ba lera la puisano la SPI.
E tsosolosa:
ha phetisetso e phethiloe (ntle le ka mokhoa oa master haeba phetiso e ntse e tsoela pele)
ha SPI e holofetse
ha phoso ea master mode e etsahala (MODF=1)
Haeba phetisetso e sa tsoele pele, folakha ea BSY e hlakotsoe pakeng tsa phetiso e 'ngoe le e' ngoe ea data

Ho lokile, sena se tla sebetsa. Ha re fumane moo Tx buffer e leng teng. Ho etsa sena, bala "SPI Data Register":

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Bits 15:0 DR[15:0] Ngoliso ea Boitsebiso
Lintlha tse fumanoeng kapa lintlha tse lokelang ho fetisoa.
Rejistara ea data e arotsoe ka li-buffer tse peli - e 'ngoe ea ho ngola (phetisetsa buffer) le e' ngoe bakeng sa ho bala (fumana buffer). Ho ngolla rejistara ea data ho ngolla Tx buffer, 'me ho bala ho tsoa ho rejisetara ea data ho tla khutlisa boleng bo fumanehang ho Rx buffer.

Che, le ngoliso ea maemo, moo lifolakha tsa TXE le BSY li fumanoang:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

Re ngola:

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

Joale, kaha re hloka ho fetisa makhetlo a 16 ka li-byte tse peli, ho latela palo ea liphetho tsa mokhanni oa LED, ntho e kang ena:

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

Empa ha re tsebe ho hula pinana ea LAT leha ho le joalo, kahoo re tla khutlela ho I/O.

Ho fana ka lithapo

Ho STM32F1, lirejistara tse ikarabellang bakeng sa boemo ba lithapo ha li tloaelehe. Ho hlakile hore ho na le tse ngata ho feta Atmega, empa hape li fapane le li-chips tse ling tsa STM. Karolo ea 9.1 Tlhaloso e Akaretsang ea GPIO:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Boema-kepe bo bong le bo bong ba sepheo se akaretsang sa I/O (GPIO) e na le lirekoto tse peli tsa 32-bit configuration (GPIOx_CRL le GPIOx_CRH), lirekoto tse peli tsa data tsa 32-bit (GPIOx_IDR le GPIOx_ODR), 32-bit set/reset register (GPIOx_BSRR), 16-bit reset reset (GPIOx_BRR) le 32- Registara e thibelang hanyane (GPIOx_LCKR).

Lingoliloeng tse peli tsa pele ha li tloaelehe, hape ha li na tšitiso, hobane li-port 16 li hasane ho tsona ka mokhoa oa "likotoana tse 'ne ka mor'abo rona". Tseo. Lipini tsa zero ho isa ho tse supileng li ho CRL, 'me tse ling kaofela li ho CRH. Ka nako e ts'oanang, lirekoto tse setseng li na le likotoana tsa lithapo tsohle tsa boema-kepe - hangata halofo e "behelitsoe".

Ho nolofatsa, ha re qaleng ho tloha qetellong ea lenane.

Ha re hloke rejisetara e thibelang.

Lirekoto tse behiloeng le ho seta bocha li qabola haholo hobane li pheta-pheta: o ka ngola ntho e ngoe le e ngoe feela ho BSRR, moo li-bits tse 16 tse holimo li tla khutlisetsa pinana ho zero, 'me tse tlase li tla hlophisoa ho 1, kapa u ka boela ua ngola. sebelisa BRR, li-bits tse 16 tse ka tlase ho tsona tse setang phini bocha. Ke rata khetho ea bobeli. Lirekoto tsena li bohlokoa hobane li fana ka phihlello ea athomo ho liphini:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Atomic Seta kapa Reset hape
Ha ho na tlhoko ea ho tima litšitiso ha u etsa lenaneo la GPIOx_ODR boemong bo tlase: likotoana tse le 'ngoe kapa ho feta li ka fetoloa ka ts'ebetso e le 'ngoe ea ho ngola atomic APB2. Sena se finyelloa ka ho ngola "1" ho registara ea ho seta/seta bocha (GPIOx_BSRR kapa, bakeng sa ho seta bocha feela, GPIOx_BRR) ea biti e hlokang ho fetoloa. Likarolo tse ling li tla lula li sa fetohe.

Lirekoto tsa data li na le mabitso a itlhalosang - IDR = input Rejisetara ea Tataiso, rejisetara ea ho kenya; ODR = khumo Ngoliso ea tataiso, rejisetara ea tlhahiso. Re ke ke ra li hloka morerong oa hajoale.

'Me qetellong, li-registe tsa taolo. Kaha re thahasella lithakhisa tsa bobeli tsa SPI, e leng PB13, PB14 le PB15, hang-hang re sheba CRH:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

'Me rea bona hore re tla hloka ho ngola ho hong ka likotoana ho tloha ho 20 ho isa ho 31.

Re se re nahanne ka holimo seo re se batlang ho tloha ho li-pin, kahoo mona ke tla etsa ntle le skrini, ke tla re feela MODE e hlalosa tataiso (kenyo haeba likotoana ka bobeli li behiloe ho 0) le lebelo la pin (re hloka 50MHz, ke hore. ka bobeli pini ho "1"), 'me CNF e beha mokhoa: kamehla "push-pull" - 00, "alternative" - ​​10. Ka ho feletseng, joalokaha re bona ka holimo, lithapo tsohle li na le karolo ea boraro ho tloha tlase (CNF0), e ba beha mokgweng keno e phaphametseng.

Kaha ke rera ho etsa ho hong ka chip ena, bakeng sa ho nolofatsa ke hlalositse litekanyetso tsohle tse ka khonehang tsa MODE le CNF bakeng sa lirejistara tse tlase le tse holimo.

Ka tsela e itseng tjena

#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

Lithakhisa tsa rona li boema-kepe B (aterese ea motheo - 0x40010C00), khoutu:

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

'Me, ka hona, u ka ngola litlhaloso tsa LAT, tse tla nyenyefatsoa ke lirejistara tsa BRR le 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 feela ka inertia, esale ho le joalo, e ke e lule)

Hona joale ntho e 'ngoe le e' ngoe e ntle, empa ha e sebetse. Hobane sena ke STM32, ba boloka motlakase, ho bolelang hore o hloka ho etsa hore li-peripherals tse hlokahalang li be teng.

Bulela sesupa-tshupanako

Oache, eo hape e tsejoang e le Clock, e ikarabella bakeng sa ho ts'oara. Mme re se re hlokometse khutsufatso ea RCC. Re e batla litokomaneng: ena ke Reset le Clock Control.

Joalokaha ho boletsoe ka holimo, ka lehlohonolo, karolo e thata ka ho fetisisa ea sehlooho sa clocking e entsoe bakeng sa rona ke batho ba tsoang ho STM, eo re ba lebohang haholo ka eona (hape ke tla fana ka sehokelo ho Webosaete ea Di Halt, ho hlakisa hore na pherekano e kae). Re hloka feela lirejisete tse ikarabellang bakeng sa ho nolofaletsa li-clocking (Peripheral Clock Enable Registers). Taba ea pele, a re fumaneng aterese ea motheo ea RCC, e qalong ea "Memory Map":

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

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

Ebe o tobetsa sehokelo moo o lekang ho fumana ho hong ka poleiti, kapa, ho betere, o fete ka litlhaloso tsa li-registas tse nolofalletsang ho tsoa likarolong tse mabapi le etsa hore rejisetara. Moo re tla fumana RCC_APB1ENR le RCC_APB2ENR:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

'Me ka hona, li na le likotoana tse kenyelletsang nako ea SPI2, IOPB (I/O Port B) le mesebetsi e meng (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;

Khoutu ea ho qetela e ka fumanoa mona.

Haeba u na le monyetla le takatso ea ho etsa tlhahlobo, joale hokela DM634 ka tsela ena: DAI ho PB15, DCK ho PB13, LAT ho PB14. Re matlafatsa mokhanni ho tloha ho 5 volts, u se ke ua lebala ho hokahanya mabaka.

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

STM8 PWM

PWM ho STM8

Ha ke ntse ke rera sehlooho sena, ke ile ka etsa qeto, ka mohlala, ho leka ho tseba ts'ebetso e itseng ea chip e sa tloaelehang ho sebelisa database feela, e le hore ke se ke ka qetella ke e-na le shoemaker ntle le lieta. STM8 e ne e loketse karolo ena: pele, ke ne ke e-na le liboto tse 'maloa tsa Sechaena tse nang le STM8S103,' me ea bobeli, ha e ratoe haholo, 'me ka hona moleko oa ho bala le ho fumana tharollo Inthaneteng o itšetlehile ka ho haella ha litharollo tsena.

Chip e boetse e na le leqephe la lintlha и Setšoantšo sa RM0016, ka lekhetlo la pele ho na le pinout le liaterese tsa ngoliso, ka bobeli - ntho e 'ngoe le e' ngoe. STM8 e hlophisitsoe ka C ka IDE e mpe ST Visual Ntlafatsa.

Ho koala le I/O

Ka ho feletseng, STM8 e sebetsa ka makhetlo a 2 MHz, sena se tlameha ho lokisoa hang-hang.

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
HSI (High Speed ​​​​Internal) Clock
Letšoao la oache ea HSI le tsoa ho oscillator ea kahare ea 16 MHz RC e nang le karohano e hlophisehileng (1 ho isa ho 8). E behiloe bukeng ea ho arola oache (CLK_CKDIVR).
Tlhokomeliso: qalong, oscillator ea HSI RC e nang le karohano ea 8 e khethoa e le mohloli o ka sehloohong oa lets'oao la oache.

Re fumana aterese ea ngoliso ho database, tlhaloso ho refman mme re bona hore rejisete e hloka ho hlakoloa:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Kaha re tlo tsamaisa PWM le ho hokela li-LED, ha re shebeng pinout:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

The chip e nyane, mesebetsi e mengata e emisitsoe holim'a lithakhisa tse tšoanang. Se ka har'a masakaneng a sekoere ke "ts'ebetso e 'ngoe", e fetoloa ke "option byte" (li-byte tsa khetho) - ntho e kang li-fuse tsa Atmega. U ka fetola litekanyetso tsa bona ka lenaneo, empa ha ho hlokahale, hobane Ts'ebetso e ncha e etsoa feela ka mor'a ho qala bocha. Ho bonolo ho sebelisa ST Visual Programmer (e jarollotsoeng ka Visual Develop), e ka fetolang li-byte tsena. Pinout e bonts'a hore lithakhisa tsa CH1 le CH2 tsa nako ea pele li patiloe ka har'a masakaneng a lisekoere; hoa hlokahala ho beha li-bits tsa AFR1 le AFR0 ho STVP, 'me ea bobeli e tla boela e fetise tlhahiso ea CH1 ea nako ea bobeli ho tloha PD4 ho ea ho PC5.

Kahoo, li-pin tse 6 li tla laola li-LED: PC6, PC7 le PC3 bakeng sa nako ea pele, PC5, PD3 le PA3 bakeng sa bobeli.

Ho theha lithapo tsa I/O ka botsona ho STM8 ho bonolo ebile hoa utloahala ho feta ho STM32:

  • e tsebahalang ho tsoa ho rejisetara ea tataiso ea data ea Atmega DDR (Ngoliso ea Tsamaiso ea Lintlha): 1 = tlhahiso;
  • rejista ea pele ea taolo ea CR1, ha e hlahisoa, e beha mokhoa oa push-pull (1) kapa drain e bulehileng (0); kaha ke kopanya li-LED ho chip le cathodes, ke siea zero mona;
  • rejista ea bobeli ea taolo ea CR2, ha e hlahisoa, e beha lebelo la oache: 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

Tlhophiso ea PWM

Pele, a re hlaloseng mantsoe ana:

  • Maqhubu a PWM - makhetlo ao sebali sa nako se ts'oarang ka sona;
  • Kenya bocha, AR - boleng ba autoloadable ho fihlela moo sebali sa nako se tla baloa (nako ea pulse);
  • Ketsahalo ea ntlafatso, UEV - ketsahalo e etsahalang ha sebali sa nako se balile ho AR;
  • PWM Duty Cycle - Potoloho ea mosebetsi oa PWM, eo hangata e bitsoang "duty factor";
  • Tšoara/Bapisa Boleng - boleng ba ho hapa / papiso, eo sebali sa nako se balileng ho sona tla etsa ho hong (tabeng ea PWM, e khelosa lets'oao la tlhahiso);
  • Phatlalatso ea Boleng - boleng bo kentsoeng pele. Bapisa boleng e ke ke ea fetoha ha sebali sa nako se ntse se ts'oara, ho seng joalo potoloho ea PWM e tla robeha. Ka hona, litekanyetso tse ncha tse fetisoang li beoa ka har'a buffer ebe li ntšoa ha sebali sa nako se fihla pheletsong ea nako ea ho bala ebe se hlophisoa bocha;
  • E tsamaellane le moeli и Mekhoa e tsepamisitsoeng bohareng - ho tsamaisana le moeli le bohareng, ho tšoana le Atmel's Potlako PWM и PWM e nepahetseng ea mohato.
  • OCiREF, Output Bapisa Reference Signal - lets'oao la tlhahiso ea litšupiso, ha e le hantle, se hlahang pineng e lumellanang le mokhoa oa PWM.

Joalokaha ho se ho hlakile ho pinout, li-timers tse peli li na le bokhoni ba PWM - ea pele le ea bobeli. Ka bobeli ke 16-bit, ea pele e na le likarolo tse ngata tsa tlatsetso (haholo-holo, e ka balla holimo le tlase). Re hloka ho sebetsa ka bobeli ka ho lekana, kahoo ke ile ka etsa qeto ea ho qala ka ea bobeli e futsanehileng haholoanyane, e le hore ka phoso ke se sebelise ntho e sieo. Bothata bo bong ke hore tlhaloso ea ts'ebetso ea PWM ea linako tsohle bukeng ea litšupiso e khaolong e mabapi le sebali sa nako sa pele (17.5.7 PWM Mode), kahoo u tlameha ho qhomela pele le morao ho pholletsa le tokomane ka linako tsohle.

PWM ho STM8 e na le molemo oa bohlokoa ho feta PWM ho Atmega:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
PWM e Tsepamisitsoeng Moeli
Tlhophiso ea akhaonto ho tloha tlase ho ea holimo
Ho bala ho ea holimo hoa sebetsa haeba bonyane ba DIR ho rejisetara ea TIM_CR1 e hlakotsoe
Mohlala:
Mohlala o sebelisa mokhoa oa pele oa PWM. Letšoao la referense la PWM OCiREF le tšoaretsoe holimo ha feela TIM1_CNT <TIM1_CCRi. Ho seng joalo ho nka boemo bo tlaase. Haeba boleng ba papiso ho rejisetara ea TIM1_CCRi e le kholo ho feta boleng ba autoload (TIM1_ARR ngoliso), lets'oao la OCiREF le ts'oaroa ho 1. Haeba boleng ba papiso ke 0, OCiREF e tšoaretsoe ho zero....

STM8 timer nakong ea ketsahalo ea ntlafatso hlahloba pele bapisa boleng, 'me feela ka mor'a moo ho hlahisa letšoao la litšupiso. Sebali sa nako sa Atmega se qala ka sekhechana ebe se bapisa, se fella ka compare value == 0 tlhahiso ke nale, e lokelang ho sebetsanoa le eona ka tsela e itseng (mohlala, ka ho fetola mohopolo ka mokhoa o hlophisitsoeng).

Kahoo seo re batlang ho se etsa: 8-bit PWM (AR == 255), ho bala ho tloha tlase ho ea holimo, ho tsamaisana le moeli. Kaha mabone a hokahantsoe le chip ka li-cathode, PWM e lokela ho ntša 0 (LED on) ho fihlela bapisa boleng le 1 kamora.

Re se re balile ka tse ling Mokhoa oa PWM, kahoo re fumana rejisetara e hlokahalang ea sebali sa nako ea bobeli ka ho batlisisa bukeng ea litšupiso bakeng sa poleloana ena (18.6.8 - TIMx_CCMR1):

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
110: Mokhoa oa pele oa PWM - ha u bala ho tloha tlase ho ea holimo, kanale ea pele e sebetsa ha TIMx_CNT <TIMx_CCR1. Ho seng joalo, mocha oa pele ha o sebetse. [ho feta ka har'a tokomane ho na le kopi-paste e fosahetseng ho tloha ho timer 1] 111: Mokhoa oa bobeli oa PWM - ha u bala ho tloha tlase ho ea holimo, mocha oa pele ha o sebetse ha TIMx_CNT <TIMx_CCR1. Ho seng joalo, mocha oa pele oa sebetsa.

Kaha li-LED li hokahane le MK ka li-cathode, mokhoa oa bobeli o re tšoanela (oa pele le ona, empa ha re e tsebe).

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Bit 3 OC1PE: Lumella pin 1 ho kenya pele
0: Ngoliso ea ho kenya pele ho TIMx_CCR1 e koetsoe. O ka ngolla TIMx_CCR1 ka nako efe kapa efe. Boleng bo bocha bo sebetsa hang-hang.
1: Registara ea ho kenya esale pele ho TIMx_CCR1 e lumelletsoe. Lits'ebetso tsa ho bala/ngola kena ho rejisetara ea tse romelloang esale pele. Boleng bo kentsoeng pele TIMx_CCR1 bo kentsoe ka har'a rejistara ea moriti nakong ea ketsahalo e 'ngoe le e 'ngoe ea ntlafatso.
*Tlhokomeliso: Hore mokhoa oa PWM o sebetse hantle, lirejisetara tse romelloang esale pele li tlameha ho sebetsoa. Sena ha se hlokahale ka mokhoa oa lets'oao le le leng (mokhoa oa OPM o behiloe ho rejisetara ea TIMx_CR1).

Ho lokile, ha re buleng tsohle tseo re li hlokang bakeng sa liteishene tse tharo tsa sebali sa bobeli:

#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 e na le lirekoto tse peli tsa li-bit, tsohle li bonolo:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Nako ea bobeli e ka bala feela ho tloha tlase ho ea holimo, ho tsamaisana le moeli, ha ho letho le lokelang ho fetoloa. Ha re behelle "frequency divider", mohlala, ho 256. Bakeng sa nako ea bobeli, karohano e behiloe ho rejisetara ea TIM2_PSCR mme ke matla a tse peli:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Ho setseng ke ho bula liqeto le nako ea bobeli ka boeona. Bothata ba pele bo rarolloa ke li-registas Tshwara/Bapisa kgontsha: ho na le likanale tse peli, tse tharo tse hasaneng hohle ho tsona ka mokhoa o sa tsitsang. Mona re ka boela ra ithuta hore hoa khoneha ho fetola polarity ea pontšo, i.e. ha e le hantle, ho ne ho ka khoneha ho sebelisa PWM Mode 1. Re ngola:

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

Qetellong, re qala sebali sa nako ho ngoliso ea TIMx_CR1:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Ha re ngoleng analog e bonolo ea AnalogWrite (), e tla fetisetsa boleng ba 'nete ho sebali sa nako bakeng sa papiso. Lirejiseta li rehiloe mabitso a sa lebelloang Tšoara/Bapisa lirejistara, ho na le tse peli tsa tsona bakeng sa mocha ka mong: li-bits tse 8 tsa boemo bo tlaase ho TIM2_CCRxL le tse phahameng ka ho fetisisa ho TIM2_CCRxH. Kaha re thehile 8-bit PWM, ho lekane ho ngola likaroloana tsa bohlokoa haholo:

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

'Mali ea hlokolosi o tla hlokomela hore re na le PWM e fokolang, e sa khoneng ho hlahisa 100% ho tlatsa (ka boleng bo phahameng ba 255, letšoao le fetotsoe bakeng sa potoloho e le' ngoe ea nako). Bakeng sa li-LED sena ha se na taba, 'me 'mali ea hlokolosi a ka se a ntse a hakanya hore na a ka e lokisa joang.

PWM ka nako ea bobeli e sebetsa, ha re feteleng ho ea pele.

Nako ea pele e na le likotoana tse tšoanang hantle liregiseng tse tšoanang (ke feela hore likotoana tse ileng tsa sala li "behelitsoe" ka nako ea bobeli li sebelisoa ka mafolofolo ho ea pele bakeng sa mefuta eohle ea lintho tse tsoetseng pele). Ka hona, ho lekane ho fumana liaterese tsa lirekoto tse tšoanang ka har'a database le ho kopitsa khoutu. Che, fetola boleng ba frequency divider, hobane ... nako ea pele e batla ho fumana eseng matla a tse peli, empa boleng bo nepahetseng ba 16-bit lirejiseteng tse peli Prescaler High и Low. Re etsa ntho e 'ngoe le e' ngoe 'me ... nako ea pele ha e sebetse. Bothata ke bofe?

Bothata bo ka rarolloa feela ka ho sheba karolo eohle mabapi le li-registerer tsa taolo ea timer 1, moo re batlang eo nako ea bobeli e se nang eona. Ho tla ba le 17.7.30 Rejisetara ea ho robeha (TIM1_BKR), moo ho nang le karoloana ena:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Numella tlhahiso ea mantlha

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Ke hantle feela jwale, khoutu Mono.

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

STM8 Multiplex

Multiplexing ho STM8

Morero oa boraro oa mini ke ho hokahanya li-LED tse robeli tsa RGB ho nako ea bobeli ka mokhoa oa PWM le ho etsa hore li bonts'e mebala e fapaneng. E ipapisitse le mohopolo oa "multiplexing ea LED", e leng hore ha o bulela le ho tima li-LED ka potlako haholo, ho rona ho tla bonahala eka li lula li le teng.phehello ya pono, inertia ea pono ea pono). Ke kile ka etsa joalo ntho e kang ena ho Arduino.

Algorithm ea mosebetsi e shebahala tjena:

  • o hokahane le anode ea RGB ea pele ea LED;
  • ho e khantša, ho romela matšoao a hlokahalang ho li-cathodes;
  • ho ema ho fihlela qetellong ea potoloho ea PWM;
  • e hokahane le anode ea LED ea bobeli ea RGB;
  • e bonesa...

Joale, joalo-joalo. Ha e le hantle, bakeng sa ts'ebetso e ntle ho hlokahala hore anode e kopane 'me LED e "chesoa" ka nako e le' ngoe. Hantle, kapa hoo e ka bang. Leha ho le joalo, re hloka ho ngola khoutu e tla hlahisa boleng ka liteishene tse tharo tsa nako ea bobeli, e fetole ha UEV e fihletsoe, 'me ka nako e ts'oanang e fetole RGB LED e sebetsang hona joale.

Kaha ho fetoha ha LED ho iketselitse, re hloka ho theha "memori ea video" eo ho eona motho ea sitisang a tla fumana data. Ena ke lethathamo le bonolo:

uint8_t colors[8][3];

E le hore u fetole 'mala oa LED e itseng, ho tla lekana ho ngola litekanyetso tse hlokahalang ka har'a sehlopha sena. 'Me phapang e tla ikarabella bakeng sa palo ea LED e sebetsang

uint8_t cnt;

Demux

Bakeng sa multiplexing e nepahetseng, re hloka, ka mokhoa o makatsang, CD74HC238 demultiplexer. Demultiplexer - chip e sebelisang opareitara ho hardware <<. Ka likhoele tse tharo tsa ho kenya (bits 0, 1 le 2) re e fepa nomoro ea li-bit tse tharo X, 'me ha e arabela e kenya nomoro ea tlhahiso (1<<X). Lisebelisoa tse setseng tsa chip li sebelisetsoa ho lekanya moralo oohle. Re hloka chip ena eseng feela ho fokotsa palo ea lithakhisa tse hapiloeng tsa microcontroller, empa hape bakeng sa polokeho - e le hore ka phoso re se ke ra bulela li-LED tse ngata ho feta kamoo ho ka khonehang mme o se ke oa chesa MK. Chip e bitsa penny 'me e lokela ho lula e bolokiloe ka kamoreng ea hau ea meriana ea lapeng.

CD74HC238 ea rona e tla ikarabella bakeng sa ho fana ka motlakase ho anode ea LED e lakatsehang. Ka multiplex e tletseng ka ho feletseng, e ne e tla fana ka voltage ho kholomo ka P-MOSFET, empa ho demo ena e ka khoneha ka ho toba, hobane e hula 20 mA, ho latela lintlha tse phahameng ka ho fetisisa ka har'a database. Ho tloha Lethathamo la lintlha tsa CD74HC238 re hloka li-pinouts le leqephe lena la ho qhekella:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
H = boemo ba motlakase o phahameng, L = boemo ba motlakase o tlase, X - se tsotelle

Re hokahanya E2 le E1 fatše, E3, A0, A1 le A3 ho lithapo tsa PD5, PC3, PC4 le PC5 ea STM8. Kaha tafole e kaholimo e na le maemo a tlase le a holimo, re hlophisa lithakhisa tsena e le li-push-pull pins.

PWM

PWM ka nako ea bobeli e hlophisitsoe ka tsela e ts'oanang le pale e fetileng, ka liphapang tse peli:

Ntlha ea pele, re lokela ho lumella hore ho be le khaoho Ketsahalo ea ntlafatso (UEV) e tla bitsa ts'ebetso e fetolang LED e sebetsang. Sena se etsoa ka ho fetola sebaka Nchafatsa Khaotsa Noble bukeng e nang le lebitso le bolelang

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
Thibela rejisetara ea ho nolofalletsa

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Phapang ea bobeli e amana le ketsahalo ea multiplexing, joalo ka ghost - khanya ea parasitic ea diode. Tabeng ea rona, e ka 'na ea hlaha ka lebaka la hore sebali sa nako, se bakileng tšitiso ho UEV, se ntse se tsoela pele ho tšoaea,' me mochine oa ho kena-kenana ha a na nako ea ho fetola LED pele timer e qala ho ngola ho hong ho lipini. Ho loants'a sena, o tla tlameha ho khelosa logic (0 = khanya e phahameng, 255 = ha ho letho le khantšitsoeng) 'me u qobe boleng bo feteletseng ba potoloho ea mosebetsi. Tseo. etsa bonnete ba hore kamora UEV li-LED li tsoa ka botlalo bakeng sa potoloho e le 'ngoe ea PWM.

Ho fetola polarity:

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

Qoba ho seta r, g le b ho 255 'me u hopole ho li khelosa ha u li sebelisa.

E sitisa

Moko oa ho sitisa ke hore tlas'a maemo a itseng chip e emisa ho phethahatsa lenaneo le ka sehloohong mme e bitsa mosebetsi o mong oa ka ntle. Litšitiso li etsahala ka lebaka la tšusumetso ea kantle kapa ea kahare, ho kenyelletsa le nako.

Ha re qala ho theha morero ho ST Visual Develop, ho phaella ho main.c re amohetse fensetere e nang le faele e makatsang stm8_interrupt_vector.c, e kenyellelitsoe ka bo eona morerong. Faeleng ena, mosebetsi o abeloa tšitiso e 'ngoe le e 'ngoe NonHandledInterrupt. Re hloka ho tlama mosebetsi oa rona ho tšitiso e lakatsehang.

Letlapa le na le tafole ea li-vector tse sitisang, moo re fumanang tseo re li hlokang:

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8
13 TIM2 e nchafatsoa/e khaphatseha
14 TIM2 ho hapa/bapisa

Re hloka ho fetola LED ho UEV, kahoo re hloka tšitiso #13.

Ka hona, pele, ho file stm8_interrupt_vector.c fetola lebitso la kamehla la tšebetso e ikarabellang bakeng sa tšitiso ea No. 13 (IRQ13) hore e be ea hau:

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

Taba ea bobeli, re tla tlameha ho theha faele main.h ka litaba tse latelang:

#ifndef __MAIN_H
#define __MAIN_H

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

'Me qetellong, ngola tshebetso ena ho hao 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;
}

Ho setseng feela ke ho nolofalletsa litšitiso. Sena se etsoa ho sebelisoa taelo ea assembler rim - o tla tlameha ho e batla Buka ea mananeo:

//enable interrupts
_asm("rim");

Taelo e 'ngoe ea assembler ke sim – tima ditshitiso. Li tlameha ho tima ha litekanyetso tse ncha li ntse li ngolloa "memori ea video", e le hore tšitiso e bakiloeng ka nako e fosahetseng e se ke ea senya sehlopha.

Khoutu eohle - ho GitHub.

Lipalo-palo tsa ho bala 2: SPI ho STM32; PWM, li-timers le litšitiso ho STM8

Haeba bonyane motho a fumana sehlooho sena se le molemo, joale ha kea se ngola lefeela. Ke tla thabela ho amohela maikutlo le litlhaloso, ke tla leka ho araba tsohle.

Source: www.habr.com

Eketsa ka tlhaloso