Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

В gawo loyamba Ndidayesa kuuza akatswiri opanga zamagetsi omwe adakulira kuchokera ku mathalauza a Arduino momwe ndi chifukwa chake ayenera kuwerenga ma datasheet ndi zolemba zina za microcontrollers. Nkhaniyo inakhala yaikulu, chotero ndinalonjeza kusonyeza zitsanzo zothandiza m’nkhani ina. Chabwino, adadzitcha bowa wamkaka ...

Lero ndikuwonetsani momwe mungagwiritsire ntchito ma datati kuti muthe kuthana ndi zosavuta, koma zofunika pama projekiti ambiri, ntchito pa STM32 (Piritsi la Blue) ndi owongolera a STM8. Mapulojekiti onse owonetsera amaperekedwa kwa ma LED omwe ndimawakonda; tidzawaunikira mochuluka, zomwe tidzayenera kugwiritsa ntchito mitundu yonse ya zotumphukira zosangalatsa.

Zolembazo zidakhalanso zazikulu, kotero kuti ndizosavuta ndikupanga zomwe zili:

Piritsi Labuluu la STM32: Ma LED 16 okhala ndi dalaivala wa DM634
STM8: Kukhazikitsa zikhomo zisanu ndi chimodzi za PWM
STM8: Ma LED a 8 RGB pamapini atatu, amasokoneza

Chodzikanira: Sindine mainjiniya, sindimayesa kukhala ndi chidziwitso chakuya pazamagetsi, nkhaniyi idapangidwira osachita masewera ngati ine. Ndipotu, ndinadziona ndekha zaka ziwiri zapitazo monga omvera omwe akufuna. Ngati wina anandiuza ndiye kuti datasheets pa chip zachilendo sanali wochititsa mantha kuwerenga, Ine sindikanati amathera nthawi yochuluka kufunafuna ena zidutswa za kachidindo pa Intaneti ndi kutulukira ndodo ndi lumo ndi zomatira tepi.

Cholinga cha nkhaniyi ndi pa datasheet, osati mapulojekiti, kotero kuti code ikhoza kukhala yosakhala bwino komanso yochepetsetsa. Ma projekitiwo ndi osavuta, ngakhale kuti ndi oyenera kudziwana koyamba ndi chip chatsopano.

Ndikukhulupirira kuti nkhani yanga ithandiza wina pamlingo wofananira wa kumizidwa muzokonda.

Chithunzi cha STM32

16 ma LED okhala ndi DM634 ndi SPI

Ntchito yaying'ono yogwiritsa ntchito Piritsi la Blue (STM32F103C8T6) ndi dalaivala wa DM634 LED. Pogwiritsa ntchito zidziwitso, tiwona dalaivala, madoko a STM IO ndikukhazikitsa SPI.

DM634

Chip cha ku Taiwan chokhala ndi zotulutsa 16 16-bit PWM, zitha kulumikizidwa ndi unyolo. Chitsanzo chotsika cha 12-bit chimadziwika kuchokera ku polojekiti yapakhomo Lightpack. Panthawi ina, posankha pakati pa DM63x ndi TLC5940 yodziwika bwino, ndinasankha DM pazifukwa zingapo: 1) TLC pa Aliexpress ndithudi ndi yabodza, koma iyi siili; 2) DM ili ndi PWM yodziyimira yokha yokhala ndi jenereta yake pafupipafupi; 3) zitha kugulidwa motsika mtengo ku Moscow, m'malo modikirira phukusi la Ali. Ndipo, ndithudi, zinali zosangalatsa kuphunzira momwe mungadzilamulire chip nokha, osati kugwiritsa ntchito laibulale yokonzedwa kale. Ma tchipisi tsopano amaperekedwa makamaka mu phukusi la SSOP24; ndizosavuta kugulitsa ku adaputala.

Popeza wopanga ndi waku Taiwan, tsamba lazambiri chip chinalembedwa mu Chinese English, kutanthauza kuti adzakhala osangalatsa. Choyamba timayang'ana pa pinout (Pin Connection) kumvetsetsa mwendo womwe ungalumikizane ndi chiyani, ndi kufotokozera zikhomo (Pin Kufotokozera). 16 pini:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
DC Sink Sources (Open Drain)

Chonde / Open-drain linanena bungwe - kumwa; gwero la madzi akulowa; zomwe zimatuluka zimagwirizanitsidwa ndi nthaka muzochitika zogwira ntchito - ma LED amagwirizanitsidwa ndi dalaivala ndi cathodes. Mwamagetsi, izi, ndithudi, si "kukhetsa kotseguka" (kutsegula kukhetsa), koma m'ma data, kutchulidwa kwa zikhomo mu drain mode kumapezeka nthawi zambiri.

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Zotsutsa zakunja pakati pa REXT ndi GND kuti muyike mtengo wapano

Reference resistor imayikidwa pakati pa pini ya REXT ndi nthaka, yomwe imayang'anira kukana kwamkati kwa zotuluka, onani chithunzi patsamba 9 la database. Mu DM634, kukana uku kungathenso kuwongoleredwa ndi mapulogalamu, kuyika kuwala konse (kuwala padziko lonse lapansi); Sindifotokoza mwatsatanetsatane m'nkhaniyi, ndingoyika 2.2 - 3 kOhm resistor apa.

Kuti timvetsetse momwe mungayang'anire chip, tiyeni tiwone kufotokozera kwa mawonekedwe a chipangizochi:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Inde, ndi izi, Chinese English mu ulemerero wake wonse. Kutanthauzira izi ndizovuta, mutha kuzimvetsa ngati mungafune, koma pali njira ina - onani momwe kulumikizana kwa TLC5940 yofananira kumafotokozedwera mu datasheet:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
... Zikhomo zitatu zokha ndizofunika kuti mulowetse deta mu chipangizocho. Mphepete mwa kukwera kwa chizindikiro cha SCLK imasuntha deta kuchokera ku pini ya SIN kupita ku kaundula wamkati. Deta yonse ikatsitsidwa, chizindikiro chachifupi cha XLAT chimalumikiza zomwe zimasamutsidwa motsatizana m'kaundula wamkati. Ma regista amkati ndi zipata zomwe zimayambitsidwa ndi mulingo wa chizindikiro cha XLAT. Deta yonse imafalitsidwa kwambiri poyambirira.

Latch - latch/latch/lock.
Kukwera m'mphepete - kutsogolera m'mphepete mwa kugunda
MSB poyamba - chofunika kwambiri (kumanzere) pang'onopang'ono.
kutseka data - kufalitsa deta motsatizana (pang'ono ndi pang'ono).

Mawu latch nthawi zambiri amapezeka muzolemba za tchipisi ndipo amamasuliridwa m'njira zosiyanasiyana, kotero kuti ndimvetsetse ndidzilola ndekha

pulogalamu yaying'ono yamaphunziroDalaivala wa LED kwenikweni ndi kaundula wosinthira. "Shift" (kosangalatsa) m'dzina - kusuntha kwa data mkati mwa chipangizocho: kachidutswa kakang'ono kalikonse kakankhidwira mkati kamakankhira unyolo wonse kutsogolo kwake. Popeza palibe amene akufuna kuwona kuthwanima kosokonekera kwa ma LED panthawi yosinthira, njirayi imachitika m'mabuku a buffer olekanitsidwa ndi zolembera zogwirira ntchito ndi damper (latch) ndi mtundu wa chipinda chodikirira pomwe tizidutswa tating'ono tating'onoting'ono timatsatizana. Zonse zikakonzeka, chotsekeracho chimatsegulidwa ndipo ma bits amapita kukagwira ntchito, m'malo mwa gulu lapitalo. Mawu latch muzolemba za microcircuits pafupifupi nthawi zonse zimatanthawuza damper yotere, ziribe kanthu kuti ikugwiritsidwa ntchito bwanji.

Kotero, kutumiza deta ku DM634 ikuchitika motere: ikani kulowetsa kwa DAI ku mtengo wofunikira kwambiri wa LED yakutali, kukoka DCK mmwamba ndi pansi; khazikitsani kulowetsa kwa DAI pamtengo wotsatira, kukoka DCK; ndi zina zotero mpaka zidutswa zonse zitatumizidwa (adalowetsedwa), pambuyo pake timakoka LAT. Izi zitha kuchitika pamanja (pang'onopang'ono), koma ndibwino kugwiritsa ntchito mawonekedwe a SPI opangidwira izi, chifukwa amawonetsedwa pa STM32 yathu m'makope awiri.

Piritsi ya Buluu STM32F103

Chiyambi: Owongolera a STM32 ndi ovuta kwambiri kuposa Atmega328 kuposa momwe angawonekere owopsa. Komanso, pazifukwa zopulumutsa mphamvu, pafupifupi zotumphukira zonse zimazimitsidwa poyambira, ndipo ma frequency a wotchi ndi 8 MHz kuchokera kugwero lamkati. Mwamwayi, opanga mapulogalamu a STM adalemba kachidindo kamene kamabweretsa chip ku 72 MHz "yowerengeka", ndipo olemba ma IDE onse omwe ndimawadziwa adayiphatikiza poyambira, kotero sitiyenera kutseka (koma mungathe ngati mukufunadi). Koma muyenera kuyatsa zotumphukira.

Zolemba: Piritsi la Buluu lili ndi chipangizo chodziwika bwino cha STM32F103C8T6, pali zolemba ziwiri zothandiza zake:

Patsambali titha kukhala ndi chidwi ndi:

  • Pinouts - chip pinouts - ngati tingasankhe kupanga matabwa tokha;
  • Memory Map - mapu okumbukira a chipangizo china. Buku Lofotokozera lili ndi mapu a mzere wonse, ndipo limatchula zolembera zomwe athu alibe.
  • Gome la Tanthauzo la Pin - kutchula ntchito zazikulu ndi zina za pini; pa "mapiritsi a buluu" mungapeze zithunzi zosavuta kwambiri pa intaneti ndi mndandanda wa zikhomo ndi ntchito zawo. Chifukwa chake, nthawi yomweyo timayika google Blue Pill pinout ndikusunga chithunzichi pafupi:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
NB: panali cholakwika pachithunzichi kuchokera pa intaneti, chomwe chidalembedwa mu ndemanga, zikomo chifukwa cha izi. Chithunzicho chasinthidwa, koma ichi ndi phunziro - ndi bwino kufufuza zambiri osati kuchokera ku datasheets.

Timachotsa deta, kutsegula Buku Lothandizira, ndipo kuyambira pano timagwiritsa ntchito kokha.
Kachitidwe: timachita ndi zolowetsa / zotulutsa, sinthani SPI, siyani zotumphukira zofunika.

Zotulutsa

Pa Atmega328, I/O ikugwiritsidwa ntchito mophweka kwambiri, ndichifukwa chake kuchuluka kwa zosankha za STM32 kumatha kukhala kosokoneza. Tsopano timangofunikira ziganizo, koma ngakhale izi zili ndi zosankha zinayi:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
kutsegula kukhetsa, kukankha-koka, kukankha-koka kwina, kukhetsa kwina kotsegula

"Kokani-kankha" (kukankha-koka) ndizomwe zimatuluka kuchokera ku Arduino, pini ikhoza kutenga mtengo wa HIGH kapena LOW. Koma ndi "kukhetsa kotseguka" pali zovuta, ngakhale kuti zonse ndi zophweka apa:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kukonzekera kwa zotuluka / pamene doko laperekedwa kuti litulutse: / buffer yotulutsa yayatsidwa: / - njira yotsegula yotsegula: "0" muzolembera zotulutsa zimathandiza N-MOS, "1" muzolembera zotuluka zimachoka padoko mu Hi-Z mode ( P-MOS sinatsegulidwe) / - kankha-chikoka mode: "0" mu kaundula wotuluka imayatsa N-MOS, "1" mu zolembera zotulutsa imayatsa P-MOS.

Kusiyana konse pakati pa open drain (kutsegula kukhetsa) kuchokera ku “kukankha-koka” (kukankha-koka) ndikuti mu pini yoyamba silingavomereze chikhalidwe CHAKULU: polemba imodzi ku regista yotulutsa, imapita kumayendedwe apamwamba (mkulu impedance, Hi-Z). Polemba zero, pini imachita chimodzimodzi munjira zonse ziwiri, momveka komanso mwamagetsi.

M'mawonekedwe abwinobwino, piniyo imangowulutsa zomwe zili mu kaundula. Mu "m'malo" imayendetsedwa ndi zotumphukira zofananira (onani 9.1.4):

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Ngati chipini cha doko chisinthidwa kukhala pini yamtundu wina, cholembera cha pini chimayimitsidwa ndipo piniyo imalumikizidwa ndi pini yotumphukira.

Ntchito ina ya pini iliyonse ikufotokozedwa mu Matanthauzo a Pin Tsambali lili pachithunzi chomwe chatsitsidwa. Pafunso la choti muchite ngati pini ili ndi ntchito zingapo zina, yankho limaperekedwa ndi mawu am'munsi mu datasheet:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Ngati zotumphukira zingapo zimagwiritsa ntchito pini yomweyi, kuti mupewe mkangano pakati pa ntchito zina, cholumikizira chimodzi chokha chiyenera kugwiritsidwa ntchito nthawi imodzi, chosinthidwa pogwiritsa ntchito wotchi yolumikizira batani (mu regista yoyenera ya RCC).

Pomaliza, mapini mumachitidwe otulutsa amakhalanso ndi liwiro la wotchi. Ichi ndi chinthu china chopulumutsa mphamvu; kwa ife, timangoyiyika kwambiri ndikuyiwala.

Kotero: tikugwiritsa ntchito SPI, zomwe zikutanthauza kuti zikhomo ziwiri (zokhala ndi deta ndi chizindikiro cha wotchi) ziyenera kukhala "njira ina yokankhira-kukoka", ndipo ina (LAT) iyenera kukhala "kukankhira nthawi zonse". Koma tisanawagawire, tiyeni tithane ndi SPI.

SPI

Pulogalamu ina yaying'ono yamaphunziro

SPI kapena Serial Peripheral Interface (serial peripheral interface) ndi njira yosavuta komanso yothandiza kwambiri yolumikizira MK ndi ma MK ena komanso mayiko ena onse. Mfundo ya ntchito yake yafotokozedwa kale pamwambapa, ponena za dalaivala wa LED waku China (mu bukhu lofotokozera, onani gawo 25). SPI imatha kugwira ntchito mu master ("bwana") ndi kapolo ("kapolo"). SPI ili ndi njira zinayi zoyambira, zomwe sizingagwiritsidwe ntchito zonse:

  • MOSI, Master Output / Slave Input: pini iyi imatumiza deta mumayendedwe apamwamba, ndipo imalandira deta muakapolo;
  • MISO, Master Input / Output Kapolo: m'malo mwake, imalandira mwa mbuye, ndipo imatumiza mwa kapolo;
  • SCK, Seri Clock: imayika mafupipafupi a kufalitsa deta mwa mbuye kapena kulandira chizindikiro cha wotchi mu kapolo. Kwenikweni kumenya ma beats;
  • SS, Slave Select: mothandizidwa ndi njira iyi, kapoloyo amadziwa kuti chinachake chikufunidwa kwa iye. Pa STM32 imatchedwa NSS, pomwe N = negative, i.e. wolamulira amakhala kapolo ngati pali nthaka mu njira iyi. Zimaphatikizana bwino ndi Open Drain Output mode, koma iyi ndi nkhani ina.

Monga china chilichonse, SPI pa STM32 imakhala ndi magwiridwe antchito, zomwe zimapangitsa kuti zikhale zovuta kumvetsetsa. Mwachitsanzo, sizingagwire ntchito ndi SPI kokha, komanso ndi mawonekedwe a I2S, ndipo m'zolemba zomwe amafotokozera zimasakanizidwa, m'pofunika kudula mopitirira muyeso panthawi yake. Ntchito yathu ndi yophweka kwambiri: timangofunika kutumiza deta pogwiritsa ntchito MOSI ndi SCK yokha. Timapita ku gawo 25.3.4 (kulumikizana kwa theka-duplex, kulumikizana ndi theka-duplex), komwe timapeza 1 wotchi ndi 1 unidirectional data waya (chizindikiro cha wotchi 1 ndi mtsinje wa data 1 wapadziko lonse):

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Munjira iyi, pulogalamuyo imagwiritsa ntchito SPI mumachitidwe otumizira okha kapena olandila okha. / Njira yotumizira yokha ndiyofanana ndi mawonekedwe a duplex: deta imatumizidwa pa pini yotumizira (MOSI mumayendedwe apamwamba kapena MISO mumayendedwe akapolo), ndipo pini yolandila (MISO kapena MOSI motsatana) itha kugwiritsidwa ntchito ngati pini ya I/O wamba. . Pamenepa, ntchitoyo imangofunika kunyalanyaza buffer ya Rx (ngati iwerengedwa, sipadzakhala deta yosinthidwa pamenepo).

Zabwino, pini ya MISO ndi yaulere, tiyeni tilumikizane nayo chizindikiro cha LAT. Tiyeni tiwone Slave Select, yomwe pa STM32 imatha kuyendetsedwa mwadongosolo, yomwe ndi yabwino kwambiri. Timawerenga ndime ya dzina lomweli mu gawo 25.3.1 SPI General Description:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kuwongolera mapulogalamu a NSS (SSM = 1) / Zambiri zosankhidwa ndi akapolo zili mu SSI bit ya SPI_CR1 registry. Pini yakunja ya NSS imakhalabe yaulere pazosowa zina zamapulogalamu.

Yakwana nthawi yolembera ma registry. Ndinaganiza zogwiritsa ntchito SPI2, yang'anani maadiresi ake pamasamba - mu gawo 3.3 Memory Map:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Chabwino, tiyeni tiyambe:

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

Tsegulani gawo 25.3.3 ndi mutu wodzifotokozera nokha "Kukonza SPI mu Master Mode":

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

1. Khazikitsani kuchuluka kwa wotchi ndi ma bits BR[2:0] mu kaundula wa SPI_CR1.

Ma regista amasonkhanitsidwa mu gawo lolozera la dzina lomwelo. Kusintha adilesi (Adilesi yotsitsa) kwa CR1 - 0x00, mwachisawawa ma bits onse amachotsedwa (Bwezeretsani mtengo 0x0000):

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Ma bits a BR amayika chogawira wotchi yowongolera, motero amazindikira ma frequency omwe SPI idzagwira ntchito. Mafupipafupi athu a STM32 adzakhala 72 MHz, dalaivala wa LED, malinga ndi deta yake, amagwira ntchito pafupipafupi mpaka 25 MHz, kotero tiyenera kugawaniza anayi (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. Khazikitsani ma CPOL ndi CPHA bits kuti afotokoze ubale pakati pa kusamutsa deta ndi nthawi ya wotchi (onani chithunzi patsamba 240)

Popeza tikuwerenga ndandanda pano osayang'ana ma schematics, tiyeni tiwone mwatsatanetsatane mafotokozedwe a CPOL ndi CPHA bits patsamba 704 (SPI General Description):

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Gawo la wotchi ndi polarity
Pogwiritsa ntchito magawo a CPOL ndi CPHA a kaundula wa SPI_CR1, mutha kusankha mwadongosolo maubale anayi otengera nthawi. CPOL (wotchi polarity) imayang'anira mawonekedwe a wotchi pomwe palibe deta yomwe ikutumizidwa. Izi pang'ono amalamulira mbuye ndi akapolo modes. Ngati CPOL yakhazikitsidwanso, pini ya SCK imakhala yotsika popuma. Ngati kachidutswa ka CPOL kakhazikitsidwa, pini ya SCK imakhala yokwera panthawi yopuma.
Pamene CPHA (gawo la wotchi) imayikidwa, strobe yapamwamba kwambiri ndi m'mphepete mwachiwiri wa chizindikiro cha SCK (kugwa ngati CPOL ikuwonekera, ikukwera ngati CPOL yakhazikitsidwa). Deta imatengedwa ndi kusintha kwachiwiri kwa chizindikiro cha wotchi. Ngati CPHA pang'onopang'ono ikuwonekera bwino, strobe yapamwamba kwambiri ndiyo kukwera kwa chizindikiro cha SCK (kugwa ngati CPOL yakhazikitsidwa, kukwera m'mphepete ngati CPOL yachotsedwa). Deta imatengedwa pakusintha koyamba kwa chizindikiro cha wotchi.

Titatenga chidziwitso ichi, timafika pomaliza kuti magawo onse awiri ayenera kukhala ziro, chifukwa Tikufuna kuti chizindikiro cha SCK chikhalebe chotsika pamene sichikugwiritsidwa ntchito, ndipo deta iyenera kufalitsidwa pamphepete mwa kukwera kwa phokoso (onani mkuyu. Rising Edge Zithunzi za DM634

Mwa njira, apa tidayamba kukumana ndi gawo la mawu mu ST datasheets: mwa iwo mawu akuti "bwererani pang'ono kukhala zero" alembedwa. kukhazikitsanso pang'ono, osati kuchotsa pang'ono, monga, mwachitsanzo, Atmega.

3. Khazikitsani kachidutswa ka DFF kuti muwone ngati chipika cha data ndi mtundu wa 8-bit kapena 16-bit

Ndinatenga 16-bit DM634 kuti ndisavutike ndi kutumiza deta ya 12-bit PWM, monga DM633. Ndizomveka kukhazikitsa DFF kukhala imodzi:

#define DFF         0x0800

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

4. Konzani LSBFIRST bit mu SPI_CR1 register kuti mudziwe mtundu wa block

LSBFIRST, monga momwe dzina lake likusonyezera, imakonza kufalikira ndi kofunikira kwambiri poyamba. Koma DM634 ikufuna kulandira deta kuyambira pamtengo wofunikira kwambiri. Chifukwa chake, timasiya kuyambiranso.

5. Mu mawonekedwe a hardware, ngati kulowetsa kuchokera ku pin ya NSS kukufunika, gwiritsani ntchito chizindikiro chapamwamba pa pini ya NSS panthawi yonse yotsatizana ya byte. Mu mapulogalamu a NSS, ikani ma SSM ndi SSI bits mu SPI_CR1 registry. Ngati pini ya NSS iyenera kugwiritsidwa ntchito ngati chotuluka, pang'ono chabe ya SSOE iyenera kukhazikitsidwa.

Ikani SSM ndi SSI kuti muiwale za mawonekedwe a hardware a NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Zigawo za MSTR ndi SPE ziyenera kukhazikitsidwa (zimakhalabe ngati chizindikiro cha NSS chili pamwamba)

Kwenikweni, ndi ma bits awa timasankha SPI yathu ngati mbuye ndikuyatsa:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI idakonzedwa, tiyeni tilembe nthawi yomweyo ntchito zomwe zimatumiza ma byte kwa dalaivala. Pitilizani kuwerenga 25.3.3 "Kukonza SPI mumayendedwe apamwamba":

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kutumiza kwa data
Kutumiza kumayamba pomwe baiti yalembedwa ku Tx buffer.
Data byte imayikidwa mu registry ya shift pa kufanana mode (kuchokera m'basi mkati) pa kufala kwa pang'ono pang'ono, kenako imafalitsidwa kwa zotsatizana MOSI pin mode, yoyamba kapena yotsiriza pang'ono kutsogolo kutengera makonzedwe a LSBFIRST bit mu CPI_CR1 register. Mbendera ya TXE imayikidwa pambuyo potumiza deta kuchokera ku Tx buffer kupita ku registry yosinthira, komanso kupangitsa kusokoneza ngati TXEIE pang'ono mu CPI_CR1 registry yakhazikitsidwa.

Ndinaunikira mawu ochepa pomasulira kuti ndiwonetsere chidwi cha gawo limodzi la kukhazikitsidwa kwa SPI mu olamulira a STM. Pa Atmega mbendera ya TXE (Tx Palibe, Tx ilibe kanthu ndipo ikukonzekera kulandira deta) imayikidwa pokhapokha baiti yonse itatumizidwa kunja. Ndipo apa mbendera iyi imayikidwa pambuyo poti byte yayikidwa mu kaundula wamkati. Popeza imakankhidwira pamenepo ndi ma bits onse nthawi imodzi (mofanana), ndiyeno deta imafalitsidwa motsatizana, TXE imayikidwa kuti byte isanatumizidwe kwathunthu. Izi ndizofunikira chifukwa pankhani ya dalaivala wathu wa LED, tiyenera kukoka pini ya LAT pambuyo potumiza всех data, i.e. Mbendera ya TXE yokha siidzakwanira kwa ife.

Izi zikutanthauza kuti tikufuna mbendera ina. Tiyeni tiwone 25.3.7 - "Mbendera za Status":

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
<…>
Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
BUSY mbendera
Mbendera ya BSY imayikidwa ndikuyeretsedwa ndi hardware (kulembera kulibe mphamvu). Mbendera ya BSY ikuwonetsa momwe gawo la kulumikizana kwa SPI lilili.
Imayambiranso:
kutumiza kukamalizidwa (kupatula mu master mode ngati kusamutsa kumapitilira)
pamene SPI yazimitsidwa
pamene vuto la master mode lichitika (MODF=1)
Ngati kusamutsa sikupitilira, mbendera ya BSY imachotsedwa pakati pa kusamutsa deta iliyonse

Chabwino, izi zidzathandiza. Tiyeni tipeze komwe Tx buffer ili. Kuti muchite izi, werengani "SPI Data Register":

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Bits 15: 0 DR[15: 0] Kaundula wa Data
Zomwe zalandilidwa kapena zotumizidwa.
Kaundula wa deta amagawidwa m'mabafa awiri - imodzi yolembera (kutumiza buffer) ndi imodzi yowerengera (kulandira buffer). Kulembera ku registry ya data kumalembera ku Tx buffer, ndipo kuwerenga kuchokera ku registry deta kudzabwezera mtengo womwe uli mu Rx buffer.

Chabwino, ndi kaundula wamakhalidwe, komwe mbendera za TXE ndi BSY zimapezeka:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Timalemba:

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

Chabwino, popeza tiyenera kufalitsa 16 kuwirikiza kawiri mabayiti, malinga ndi kuchuluka kwa zotulutsa zoyendetsa za LED, monga chonchi:

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

Koma sitikudziwa momwe tingakokere pini ya LAT, kotero tibwerera ku I / O.

Kupereka zikhomo

Mu STM32F1, zolembera zomwe zimayang'anira malo a pini ndizosazolowereka. Zikuwonekeratu kuti pali ochulukirapo kuposa Atmega, koma amasiyananso ndi tchipisi ta STM. Gawo 9.1 Kufotokozera Zazikulu za GPIO:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Iliyonse mwa madoko a I/O a cholinga (GPIO) ili ndi ma regista awiri a 32-bit configuration (GPIOx_CRL ndi GPIOx_CRH), zolembera ziwiri za 32-bit (GPIOx_IDR ndi GPIOx_ODR), 32-bit set/reset registry (GPIOx_BSRR), 16-bit reset registry (GPIOx_BRR) ndi 32- kaundula wotsekereza pang'ono (GPIOx_LCKR).

Zolembera ziwiri zoyambirira ndizosazolowereka, komanso ndizosasangalatsa, chifukwa zikhomo 16 zimamwazikana mumtundu wa "ma bits anayi pa m'bale". Iwo. mapini ziro mpaka zisanu ndi ziwiri ali mu CRL, ndipo ena onse ali mu CRH. Panthawi imodzimodziyo, zolembera zotsalazo zimakhala bwino ndi zikhomo zonse za doko - nthawi zambiri zotsalira theka "zosungidwa".

Kuti zikhale zosavuta, tiyeni tiyambire kumapeto kwa mndandanda.

Sitikufuna kaundula wotsekereza.

Zolemba zokhazikitsidwa ndi kukonzanso ndizoseketsa kwambiri chifukwa zimabwerezana pang'ono: mutha kulemba chilichonse mu BSRR, pomwe ma bits 16 apamwamba adzakhazikitsanso pini mpaka zero, ndipo otsika adzakhazikitsidwa ku 1, kapena muthanso gwiritsani ntchito BRR, ma bits 16 otsika omwe amangokhazikitsanso pini . Ndimakonda njira yachiwiri. Zolembera izi ndizofunikira chifukwa zimapereka mwayi wopeza ma atomiki pamapini:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Atomic Set kapena Bwezeraninso
Palibe chifukwa choletsa kusokoneza mukamakonza GPIOx_ODR pamlingo wocheperako: nthiti imodzi kapena zingapo zitha kusinthidwa ndi ntchito imodzi yolemba atomiki APB2. Izi zimatheka polemba "1" ku registry yokhazikitsidwa/kukonzanso (GPIOx_BSRR kapena, pakukonzanso kokha, GPIOx_BRR) ya pang'ono yomwe ikufunika kusinthidwa. Ma bits ena adzakhala osasinthika.

Zolembera za data zili ndi mayina odzifotokozera okha - IDR = Lowetsani Kaundula wa Direction, kaundula wolowetsa; ODR = linanena bungwe Kaundula wa Direction, kaundula wa zotuluka. Sitidzawafuna mu pulojekiti yamakono.

Ndipo potsiriza, zolembera zowongolera. Popeza tili ndi chidwi ndi zikhomo zachiwiri za SPI, zomwe ndi PB13, PB14 ndi PB15, nthawi yomweyo timayang'ana CRH:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Ndipo tikuwona kuti tidzafunika kulemba china chake pang'ono kuyambira 20 mpaka 31.

Talingalira kale zomwe tikufuna pazikhomo, kotero apa ndichita popanda chithunzi, ndingonena kuti MODE imatchula mayendedwe (zolowera ngati zonse ziwiri ziyikidwa ku 0) ndi liwiro la pini (tikufunika 50MHz, i.e. onse pini ku "1"), ndipo CNF imayika mawonekedwe: nthawi zonse "kukankha-kukoka" - 00, "njira ina" - 10. Mwachikhazikitso, monga momwe tikuonera pamwambapa, zikhomo zonse zimakhala ndi gawo lachitatu kuchokera pansi (CNF0), zimawayika kukhala mode cholowera choyandama.

Popeza ndikukonzekera kuchita china ndi chip ichi, kuphweka ndafotokozera zonse zomwe zingatheke za MODE ndi CNF pazolembetsa zapansi ndi zapamwamba.

Mwanjira iyi

#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

Zikhomo zathu zili padoko B (adilesi yoyambira - 0x40010C00), code:

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

Ndipo, motere, mutha kulemba matanthauzo a LAT, omwe angasinthidwe ndi zolembera za BRR ndi 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 ndi inertia, zakhala choncho nthawi zonse, zisiyeni zikhale)

Tsopano zonse nzabwino, koma sizikugwira ntchito. Chifukwa iyi ndi STM32, amapulumutsa magetsi, zomwe zikutanthauza kuti muyenera kuyatsa zotumphukira zofunika.

Yatsani wotchi

Wotchiyo, yomwe imadziwikanso kuti Clock, ndiyomwe imayang'anira mawotchi. Ndipo titha kuzindikira kale chidule cha RCC. Timaziyang'ana muzolemba: izi ndi Reset ndi Clock Control.

Monga tanenera pamwambapa, mwamwayi, gawo lovuta kwambiri la mutu wa wotchiyo lidachitidwa kwa ife ndi anthu ochokera ku STM, zomwe timawathokoza kwambiri (kachiwirinso ndipereka ulalo ku Webusayiti ya Di Halt, kuti ziwonekere momwe zilili zosokoneza). Timangofunikira ma register omwe ali ndi udindo wowongolera mawotchi ozungulira (Peripheral Clock Enable Registers). Choyamba, tiyeni tipeze adilesi yoyambira ya RCC, ili koyambirira kwa "Memory Map":

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

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

Kenako dinani ulalo womwe mumayesa kupeza china mu mbale, kapena, bwino kwambiri, dutsani mafotokozedwe a zolembera zomwe zimathandizira kuchokera m'magawo a yambitsani zolembetsa. Komwe tidzapeza RCC_APB1ENR ndi RCC_APB2ENR:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Ndipo iwo, motere, ali ndi ma bits omwe amaphatikizapo mawotchi a SPI2, IOPB (I/O Port B) ndi ntchito zina (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;

Khodi yomaliza ingapezeke apa.

Ngati muli ndi mwayi komanso chikhumbo choyesa, gwirizanitsani DM634 motere: DAI ku PB15, DCK ku PB13, LAT ku PB14. Timayendetsa dalaivala kuchokera ku 5 volts, musaiwale kulumikiza malo.

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Chithunzi cha STM8 PWM

PWM pa STM8

Pamene ndikungokonzekera nkhaniyi, ndinaganiza, mwachitsanzo, kuyesa kudziŵa bwino ntchito ya chip yosadziwika bwino pogwiritsa ntchito deta yokha, kuti ndisathe kukhala ndi nsapato popanda nsapato. STM8 inali yabwino pa ntchitoyi: choyamba, ndinali ndi matabwa angapo achi China omwe ali ndi STM8S103, ndipo kachiwiri, sizodziwika kwambiri, choncho chiyeso chowerenga ndi kupeza yankho pa intaneti chikudalira kusowa kwa mayankho omwewo.

Chip nayenso tsamba lazambiri и Chithunzi cha RM0016, poyamba pali pinout ndi ma adilesi olembetsa, chachiwiri - china chirichonse. STM8 idakonzedwa mu C mu IDE yoyipa ST Visual Development.

Kutseka ndi I/O

Mwachikhazikitso, STM8 imagwira ntchito pafupipafupi 2 MHz, izi ziyenera kukonzedwa nthawi yomweyo.

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
HSI (High Speed ​​​​Internal) Clock
Chizindikiro cha wotchi ya HSI chimachokera ku oscillator yamkati ya 16 MHz RC yokhala ndi chogawa chotheka (1 mpaka 8). Imayikidwa mu kaundula wogawa mawotchi (CLK_CKDVR).
Zindikirani: poyambira, oscillator ya HSI RC yokhala ndi gawo la 8 imasankhidwa kukhala gwero lotsogola la chizindikiro cha wotchi.

Timapeza adilesi yolembetsa mu datasheet, malongosoledwe mu refman ndikuwona kuti zolembera ziyenera kuchotsedwa:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Popeza tiyendetsa PWM ndikulumikiza ma LED, tiyeni tiwone pinout:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Chip ndi chaching'ono, ntchito zambiri zimayimitsidwa pazikhomo zomwezo. Zomwe zili m'mabulaketi masikweya ndi "njira zina", zimasinthidwa ndi "option byte" (njira mabayiti) - china chake ngati ma fuse a Atmega. Mutha kusintha zikhalidwe zawo mwadongosolo, koma sikofunikira, chifukwa Ntchito yatsopanoyi imatsegulidwa pokhapokha mutayambiranso. Ndizosavuta kugwiritsa ntchito ST Visual Programmer (yotsitsidwa ndi Visual Develop), yomwe ingasinthe ma byte awa. Pinout ikuwonetsa kuti CH1 ndi CH2 zikhomo za nthawi yoyamba zimabisika m'mabulaketi apakati; ndikofunikira kukhazikitsa ma bits a AFR1 ndi AFR0 mu STVP, ndipo yachiwiri idzasamutsanso kutulutsa kwa CH1 kwa nthawi yachiwiri kuchokera ku PD4 kupita ku PC5.

Choncho, zikhomo 6 zidzalamulira ma LED: PC6, PC7 ndi PC3 kwa nthawi yoyamba, PC5, PD3 ndi PA3 yachiwiri.

Kukhazikitsa zikhomo za I/O pa STM8 ndikosavuta komanso komveka kuposa pa STM32:

  • zodziwika bwino kuchokera ku registry ya data ya Atmega DDR (Data Direction Register): 1 = zotuluka;
  • kaundula woyamba wowongolera CR1, ikatuluka, imayika njira yokankha (1) kapena kutsegulira (0); popeza ndimalumikiza ma LED ku chip ndi cathodes, ndimasiya zero pano;
  • kaundula wachiwiri wowongolera CR2, ikatuluka, imayika liwiro la wotchi: 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

Kusintha kwa PWM

Choyamba, tiyeni tifotokoze mawuwa:

  • PWM pafupipafupi - pafupipafupi momwe chowerengera nthawi chimakhalira;
  • Kutsegulanso, AR - mtengo wodziyimira pawokha mpaka pomwe chowerengera chidzawerengera (nthawi yakugunda);
  • Kusintha Zochitika, UEV - chochitika chomwe chimachitika pomwe chowerengera chawerengera mpaka AR;
  • PWM Duty Cycle - Kuzungulira kwa ntchito ya PWM, yomwe nthawi zambiri imatchedwa "duty factor";
  • Jambulani / Fananizani Mtengo - mtengo wojambulira / kufananitsa, komwe chowerengera chawerengera adzachita chinachake (pankhani ya PWM, imatembenuza chizindikiro);
  • Mtengo Wowonjezera - mtengo wodzaza. Fananizani mtengo sichingasinthe pomwe chowerengera chikugwedeza, apo ayi kuzungulira kwa PWM kutha. Chifukwa chake, zikhalidwe zatsopano zopatsirana zimayikidwa mu buffer ndikutulutsidwa pomwe chowerengera chikafika kumapeto kwa kuwerengera kwake ndikuyambiranso;
  • Zogwirizana m'mphepete и Zogwirizana pakati - kugwirizanitsa m'malire ndi pakati, mofanana ndi Atmel's PWM mwachangu и Gawo-lolondola PWM.
  • OCiREF, Output Compare Reference Signal - chizindikiro chotulutsa mawu, zomwe zimawoneka pa pini yofananira mu PWM mode.

Monga zikuwonekera kale kuchokera ku pinout, zowerengera ziwiri zili ndi kuthekera kwa PWM - yoyamba ndi yachiwiri. Zonsezi ndi 16-bit, yoyamba ili ndi zowonjezera zambiri (makamaka, imatha kuwerengera mmwamba ndi pansi). Tifunika tonse kuti tigwire ntchito mofanana, choncho ndinaganiza zoyamba ndi yachiwiri yosauka kwambiri, kuti ndisagwiritse ntchito mwangozi chinthu chomwe palibe. Vuto lina ndilakuti kufotokozera kwa magwiridwe antchito a PWM a nthawi zonse mu bukhu lofotokozera kuli mumutu wonena za nthawi yoyamba (17.5.7 PWM Mode), kotero muyenera kudumpha mmbuyo ndi mtsogolo muzolembazo nthawi zonse.

PWM pa STM8 ili ndi mwayi wofunikira kuposa PWM pa Atmega:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Zogwirizana ndi malire PWM
Kusintha kwa akaunti kuchokera pansi mpaka pamwamba
Kuwerengera pansi kumagwira ntchito ngati DIR bit mu kaundula wa TIM_CR1 wachotsedwa
Chitsanzo:
Chitsanzo chimagwiritsa ntchito njira yoyamba ya PWM. Chizindikiro cha PWM cha OCiREF chimakhala chokwera mpaka TIM1_CNT <TIM1_CCRi. Apo ayi zimatenga mlingo wochepa. Ngati mtengo wofananitsa mu kaundula wa TIM1_CCRi ndi waukulu kuposa mtengo wa autoload (TIM1_ARR register), chizindikiro cha OCiREF chimakhala pa 1. Ngati mtengo wofananitsa ndi 0, OCiREF imakhala paziro....

STM8 nthawi sinthani chochitika amafufuza kaye yerekezerani mtengo, ndipo pokhapo pamapanga chizindikiro cholozera. Nthawi yoyamba ya Atmega imayamba ndikufanizira, zomwe zimapangitsa compare value == 0 zomwe zimatuluka ndi singano, zomwe ziyenera kuchitidwa mwanjira ina (mwachitsanzo, posintha malingaliro).

Ndiye zomwe tikufuna kuchita: 8-bit PWM (AR == 255), kuwerengera kuchokera pansi mpaka pamwamba, kugwirizanitsa m'malire. Popeza mababu amalumikizidwa ndi chip ndi ma cathode, PWM iyenera kutulutsa 0 (LED) mpaka yerekezerani mtengo ndi 1 pambuyo.

Tawerenga kale za ena Njira ya PWM, kotero timapeza kaundula wofunikira wa chowerengera chachiwiri pofufuza mu bukhu lolozera mawuwa (18.6.8 - TIMx_CCMR1):

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
110: Njira yoyamba ya PWM - powerengera kuchokera pansi kupita pamwamba, njira yoyamba ikugwira ntchito pamene TIMx_CNT <TIMx_CCR1. Apo ayi, tchanelo choyamba sichikugwira ntchito. [kupitilira muzolembazo pali cholakwika cholemba-paste kuchokera ku timer 1] 111: Njira yachiwiri ya PWM - powerengera kuchokera pansi kupita pamwamba, njira yoyamba sikugwira ntchito pomwe TIMx_CNT <TIMx_CCR1. Apo ayi, njira yoyamba ikugwira ntchito.

Popeza ma LED amalumikizidwa ndi MK ndi ma cathode, njira yachiwiri imatiyenerera (yoyamba nayonso, koma sitikudziwabe).

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Bit 3 OC1PE: Yambitsani pin 1 preload
0: Register yojambulitsa pa TIMx_CCR1 ndiyozimitsa. Mutha kulemba ku TIMx_CCR1 nthawi iliyonse. Mtengo watsopano umagwira ntchito nthawi yomweyo.
1: Register yotsegula pa TIMx_CCR1 ndiyoyatsidwa. Werengani/lembani ntchito zofikira ku regista yojambulitsa. Mtengo wolowetsedwa TIMx_CCR1 umayikidwa mu kaundula wazithunzi pazochitika zilizonse zosintha.
*Zindikirani: Kuti mawonekedwe a PWM agwire bwino ntchito, zolembera zojambuliratu ziyenera kuyatsidwa. Izi sizofunika mumayendedwe a siginecha imodzi (chinthu cha OPM chimayikidwa mu regista ya TIMx_CR1).

Chabwino, tiyeni tiyatse chilichonse chomwe tingafune pamayendedwe atatu a chowerengera chachiwiri:

#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 imakhala ndi zolembera ziwiri zisanu ndi zitatu, zonse ndi zophweka:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Nthawi yachiwiri imatha kuwerengera kuchokera pansi mpaka pamwamba, kugwirizanitsa pamalire, palibe chomwe chiyenera kusinthidwa. Tiyeni tiyike chogawa pafupipafupi, mwachitsanzo, ku 256. Kwa nthawi yachiwiri, chogawa chimayikidwa mu kaundula wa TIM2_PSCR ndipo ndi mphamvu ziwiri:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Chotsalira ndikutsegula zomaliza ndi nthawi yachiwiri yokha. Vuto loyamba limathetsedwa ndi olembetsa Jambulani/Yerekezerani Thandizani: pali njira ziwiri, zitatu zomwazika mozungulira mozungulira. Pano tingaphunzirenso kuti n'zotheka kusintha polarity ya chizindikiro, i.e. kwenikweni, zinali zotheka kugwiritsa ntchito PWM Mode 1. Timalemba:

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

Ndipo pomaliza, timayamba chowerengera mu TIMx_CR1 kaundula:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Tiyeni tilembe analogue yosavuta ya AnalogWrite (), yomwe ingasamutsire zikhalidwe zenizeni ku timer kuti tiyerekeze. Ma registry amatchulidwa momveka bwino Jambulani / Fananizani zolembetsa, pali awiri mwa njira iliyonse: ma bits 8 otsika mu TIM2_CCRxL ndi apamwamba mu TIM2_CCRxH. Popeza tapanga 8-bit PWM, ndikokwanira kulemba zocheperako zokha:

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

Wowerenga mwachidwi adzazindikira kuti tili ndi PWM yofooka pang'ono, yomwe sitingathe kudzaza 100% (pamtengo wokwanira 255, chizindikirocho chimasinthidwa nthawi imodzi). Kwa ma LED izi zilibe kanthu, ndipo wowerenga mwachidwi amatha kuganiza kale momwe angakonzere.

PWM pa nthawi yachiwiri imagwira ntchito, tiyeni tipite ku yoyamba.

Nthawi yoyamba imakhala ndi ma bits omwewo pamakaundula omwewo (kungoti ma bits omwe adatsalira "osungidwa" mu chowerengera chachiwiri amagwiritsidwa ntchito mwachangu poyambira pazinthu zamtundu uliwonse). Choncho, ndikwanira kupeza maadiresi a zolembera zomwezo mu datasheet ndi kukopera code. Chabwino, sinthani mtengo wa frequency divider, chifukwa ... woyamba akufuna kulandira osati mphamvu ziwiri, koma mtengo weniweni wa 16-bit m'marejista awiri Prescaler High и Low. Timachita zonse ndipo ... nthawi yoyamba sikugwira ntchito. Vuto ndi chiyani?

Vutoli litha kuthetsedwa poyang'ana gawo lonse la zolembera zowongolera za timer 1, pomwe timayang'ana yomwe nthawi yachiwiri ilibe. Kudzakhala 17.7.30 Register yopuma (TIM1_BKR), pamene pali pang'ono izi:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Yambitsani kutulutsa kwakukulu

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Ndizo zonse motsimikiza tsopano, kachidindo Apo.

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Chithunzi cha STM8

Zambiri pa STM8

Ntchito yachitatu yaying'ono ndikulumikiza ma LED asanu ndi atatu a RGB ku nthawi yachiwiri mu PWM mode ndikuwapangitsa kuti aziwonetsa mitundu yosiyanasiyana. Zimatengera lingaliro la LED multiplexing, kutanthauza kuti ngati muyatsa ndi kuzimitsa ma LED kwambiri, mofulumira kwambiri, zidzawoneka kwa ife kuti akuyatsa nthawi zonse (kulimbikira kwa masomphenya, inertia ya masomphenya). Nthawi ina ndinatero chinthu chonga ichi pa Arduino.

Algorithm yogwira ntchito ikuwoneka motere:

  • adalumikiza anode ya RGB LED yoyamba;
  • kuyatsa, kutumiza zizindikiro zofunika kwa cathodes;
  • dikirani mpaka kumapeto kwa kuzungulira kwa PWM;
  • adalumikiza anode yachiwiri ya RGB LED;
  • kuyatsa...

Chabwino, etc. Inde, chifukwa cha ntchito yokongola imafunika kuti anode ikhale yolumikizidwa ndipo LED "yoyaka" nthawi yomweyo. Chabwino, kapena pafupifupi. Mulimonsemo, tiyenera kulemba kachidindo kuti linanena bungwe mayendedwe atatu cha nthawi yachiwiri, kusintha pamene UEV afika, ndipo nthawi yomweyo kusintha panopa yogwira RGB LED.

Popeza kusintha kwa LED kumakhala kodziwikiratu, tifunika kupanga "memory video" pomwe wosokoneza adzalandira deta. Ili ndi gulu losavuta:

uint8_t colors[8][3];

Kuti musinthe mtundu wa LED inayake, zidzakhala zokwanira kulemba zofunikira pagulu ili. Ndipo kusinthika kudzakhala ndi udindo pa chiwerengero cha LED yogwira

uint8_t cnt;

Demux

Kuti muchulukitse koyenera, tikufuna, modabwitsa, CD74HC238 demultiplexer. Demultiplexer - chipangizo chomwe chimagwiritsa ntchito wogwiritsa ntchito mu hardware <<. Kupyolera mu mapini atatu olowetsa (bits 0, 1 ndi 2) timayidyetsa nambala ya-bit X, ndipo poyankha imatsegula nambala yotuluka (1<<X). Zolowera zotsalira za chip zimagwiritsidwa ntchito kukulitsa mapangidwe onse. Tifunika chip ichi osati kuchepetsa chiwerengero cha zikhomo za microcontroller, komanso chitetezo - kuti musatsegule ma LED ambiri kuposa momwe mungathere komanso osawotcha MK. Chipchi chimawononga khobiri ndipo nthawi zonse chiyenera kusungidwa mu kabati yanu yamankhwala kunyumba.

CD74HC238 yathu idzakhala ndi udindo wopereka magetsi ku anode ya LED yomwe mukufuna. Mu multiplex yodzaza, imatha kupereka magetsi pamndandanda kudzera pa P-MOSFET, koma pachiwonetsero ichi ndizotheka mwachindunji, chifukwa. imakoka 20 mA, malinga ndi mtheradi pazipita mavoti mu datasheet. Kuchokera Chithunzi cha CD74HC238 tikufuna mapinouts ndi pepala lachinyengo ili:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
H = mulingo wapamwamba wamagetsi, L = otsika voteji, X - osasamala

Timalumikiza E2 ndi E1 pansi, E3, A0, A1 ndi A3 ku mapini PD5, PC3, PC4 ndi PC5 ya STM8. Popeza tebulo pamwambapa lili ndi magawo otsika komanso apamwamba, timakonza zikhomozi ngati zikhomo zokoka.

Zithunzi za PWM

PWM pa nthawi yachiwiri imakonzedwa mofanana ndi nkhani yapitayi, ndi zosiyana ziwiri:

Choyamba, tiyenera kuyatsa kusokoneza Kusintha Chochitika (UEV) yomwe idzayitanitse ntchito yomwe imasintha LED yogwira. Izi zimachitika ndikusintha pang'ono Sinthani Kusokoneza Yambitsani mu kaundula wokhala ndi dzina

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
Kusokoneza yambitsani registry

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Kusiyana kwachiwiri kumagwirizana ndi zochitika za multiplexing, monga mzukwa - kuwala kwa parasitic kwa diode. Kwa ife, zikhoza kuwoneka chifukwa chakuti chowerengera, chomwe chinayambitsa kusokoneza kwa UEV, chikupitirizabe kugwedezeka, ndipo wothandizira alibe nthawi yosinthira LED isanayambe kulemba chinachake ku zikhomo. Kuti muthane ndi izi, muyenera kutembenuza malingaliro (0 = kuwala kwakukulu, 255 = palibe chomwe chayatsidwa) ndikupewa kuwongolera kwanthawi yayitali. Iwo. onetsetsani kuti pambuyo pa UEV ma LED atuluka kwathunthu paulendo umodzi wa PWM.

Kusintha polarity:

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

Pewani kuyika r, g ndi b mpaka 255 ndipo kumbukirani kuwatembenuza mukamagwiritsa ntchito.

Zosokoneza

Chofunikira pakusokoneza ndikuti nthawi zina chip imasiya kugwiritsa ntchito pulogalamu yayikulu ndikuyimba ntchito yakunja. Zosokoneza zimachitika chifukwa cha zikoka zakunja kapena zamkati, kuphatikiza chowerengera nthawi.

Pamene tidayamba kupanga polojekiti mu ST Visual Develop, kuwonjezera pa main.c tinalandira zenera ndi fayilo yodabwitsa stm8_interrupt_vector.c, yophatikizidwa ndi polojekitiyi. Mu fayilo iyi, ntchito imaperekedwa kusokoneza kulikonse NonHandledInterrupt. Tiyenera kumangirira ntchito yathu kusokoneza komwe tikufuna.

Tsambali lili ndi tebulo la zosokoneza zosokoneza, pomwe timapeza zomwe tikufuna:

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8
13 TIM2 kusintha/kusefukira
14 TIM2 kujambula / yerekezerani

Tiyenera kusintha LED ku UEV, kotero tifunika kusokoneza #13.

Chifukwa chake, choyamba, mu fayilo stm8_interrupt_vector.c sinthani dzina losakhazikika la ntchito yomwe imayambitsa kusokoneza No. 13 (IRQ13) kukhala lanu:

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

Chachiwiri, tiyenera kupanga fayilo main.h ndi izi:

#ifndef __MAIN_H
#define __MAIN_H

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

Ndipo potsiriza, lembani ntchitoyi mu yanu 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;
}

Chotsalira ndikutsegula zosokoneza. Izi zimachitika pogwiritsa ntchito assembler command rim - muyenera kuzifufuza Buku Lopanga Mapulogalamu:

//enable interrupts
_asm("rim");

Lamulo lina la assembler ndi sim - amazimitsa zosokoneza. Ayenera kuzimitsidwa pomwe zatsopano zikulembedwa ku "video memory", kuti kusokoneza komwe kumachitika panthawi yolakwika kusawononge gululo.

Kodi zonse - pa GitHub.

Kuwerenga zikalata 2: SPI pa STM32; PWM, zowerengera nthawi ndi zosokoneza pa STM8

Ngati wina apeza kuti nkhaniyi ndi yothandiza, ndiye kuti sindinailembe pachabe. Ndidzakhala wokondwa kulandira ndemanga ndi ndemanga, ndiyesera kuyankha chirichonse.

Source: www.habr.com

Kuwonjezera ndemanga