Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

В bangare na farko Na yi ƙoƙarin gaya wa injiniyoyin lantarki na sha'awa waɗanda suka girma daga Arduino wando ta yaya da kuma dalilin da ya sa ya kamata su karanta takaddun bayanai da sauran takaddun don masu sarrafa microcontroller. Rubutun ya zama babba, don haka na yi alkawari zan nuna misalai masu amfani a wata talifi dabam. To, ya kira kansa da naman kaza madara ...

A yau zan nuna muku yadda ake amfani da takaddun bayanai don warwarewa mai sauƙi, amma wajibi ne don ayyuka da yawa, ayyuka akan STM32 (Blue Pill) da masu kula da STM8. Dukkan ayyukan demo an sadaukar da su ga LEDs na fi so, za mu haskaka su da yawa, wanda dole ne mu yi amfani da kowane nau'ikan abubuwan ban sha'awa.

Rubutun ya sake zama babba, don haka don dacewa ina yin abun ciki:

STM32 Blue Pill: LEDs 16 tare da direban DM634
STM8: Saita filayen PWM guda shida
STM8: 8 RGB LEDs akan fil uku, katsewa

Disclaimer: Ni ba injiniya ba ne, ba na yin riya cewa ina da zurfin ilimi a cikin kayan lantarki, labarin an yi shi ne don masu son son ni. A gaskiya ma, na ɗauki kaina shekaru biyu da suka wuce a matsayin masu sauraro. Idan da wani ya gaya mani a lokacin cewa bayanan da ke kan guntu da ba a sani ba ba su tsoratar da karantawa ba, da ban shafe lokaci mai tsawo ina neman wasu nau'ikan code a Intanet da ƙirƙira ƙuƙuka tare da almakashi da tef ɗin m.

Manufar wannan labarin yana kan takaddun bayanai, ba ayyuka ba, don haka lambar ƙila ba ta da kyau sosai kuma sau da yawa ƙunci. Ayyukan da kansu suna da sauƙi, kodayake sun dace da sanin farko tare da sabon guntu.

Ina fatan cewa labarin na zai taimaka wa wani a irin wannan mataki na nutsewa a cikin sha'awa.

Saukewa: STM32

16 LEDs tare da DM634 da SPI

Ƙananan aikin ta amfani da Blue Pill (STM32F103C8T6) da direban LED DM634. Yin amfani da takaddun bayanai, za mu gano direban, tashar jiragen ruwa na STM IO da daidaita SPI.

DM634

Guntu ta Taiwan tare da abubuwan 16 16-bit PWM, ana iya haɗa su cikin sarƙoƙi. An san ƙirar ƙarancin ƙarancin 12-bit daga aikin gida Kunshin haske. A wani lokaci, zabar tsakanin DM63x da sanannen TLC5940, na zaɓi DM don dalilai da yawa: 1) TLC akan Aliexpress tabbas karya ne, amma wannan ba; 2) DM yana da PWM mai cin gashin kansa tare da janareta na mitar ta; 3) Ana iya siyan shi mara tsada a Moscow, maimakon jiran fakiti daga Ali. Kuma, ba shakka, yana da ban sha'awa don koyon yadda ake sarrafa guntu da kanku, maimakon yin amfani da ɗakin karatu da aka shirya. Yanzu ana gabatar da kwakwalwan kwamfuta a cikin kunshin SSOP24; suna da sauƙin siyarwa zuwa adaftar.

Tun da manufacturer ta Taiwanese, takardar bayanai an rubuta guntu a cikin Ingilishi na Sinanci, wanda ke nufin zai zama abin daɗi. Da farko muna duban pinout (Haɗin Pin) don fahimtar wace ƙafar da za a haɗa abin da za a yi, da kuma bayanin fil ɗin (Bayanin fil). 16 fil:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Tushen Ruwan Ruwa na DC (Buɗe Ruwa)

Yi tsalle / Bude-magudanar fitarwa - lambatu; tushen shigar halin yanzu; an haɗa fitarwa zuwa ƙasa a cikin yanayin aiki - ana haɗa LEDs zuwa direba ta hanyar cathodes. Ta hanyar lantarki, wannan, ba shakka, ba “buɗaɗɗen magudanar ruwa ba ne” (bude magudanar ruwa), amma a cikin takaddun bayanai ana samun wannan nadi don fil a yanayin magudanar ruwa.

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Resistors na waje tsakanin REXT da GND don saita ƙimar fitarwa na yanzu

Ana shigar da resistor a tsakanin fil ɗin REXT da ƙasa, wanda ke sarrafa juriya na ciki na abubuwan, duba jadawali a shafi na 9 na bayanan. A cikin DM634, wannan juriya kuma ana iya sarrafa shi ta software, yana saita haske gabaɗaya (haske na duniya); Ba zan shiga cikin cikakkun bayanai ba a cikin wannan labarin, kawai zan sanya resistor 2.2 - 3 kOhm anan.

Don fahimtar yadda ake sarrafa guntu, bari mu dubi bayanin ƙirar na'urar:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Ee, ga shi, Sinanci Turanci a cikin dukan daukaka. Fassara wannan yana da matsala, zaku iya fahimtar shi idan kuna so, amma akwai wata hanya - duba yadda aka kwatanta haɗin da aiki mai kama da TLC5940 a cikin takaddar bayanan:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
... Ana buƙatar fil uku kawai don shigar da bayanai cikin na'urar. Hawan gefen siginar SCLK yana canza bayanai daga fil ɗin SIN zuwa rijistar ciki. Bayan an ɗora duk bayanai, ɗan gajeren siginar XLAT mai girma yana ɗaukar bayanan da aka jera a cikin rajista na ciki. Rijista na ciki ƙofofin da aka kunna ta matakin siginar XLAT. Ana watsa duk bayanai mafi mahimmanci da farko.

Latch - latch/latch/kulle.
Tashi gefen – kai baki na bugun jini
MSB na farko - mafi mahimmanci (na hagu) ɗan gaba.
da clock data - watsa bayanai a jere (bit by bit).

kalma sakata ana samun sau da yawa a cikin takaddun ga kwakwalwan kwamfuta kuma ana fassara su ta hanyoyi daban-daban, don haka don fahimtar zan ba da damar kaina.

karamin shirin ilimiDireban LED ainihin rijistar motsi ne. "Shift" (shift) a cikin sunan - motsi na bayanai a cikin na'urar: kowane sabon bit da aka tura a ciki yana tura dukkan sarkar gaba a gabanta. Tun da babu wanda yake so ya lura da ƙyalli na LEDs yayin motsi, tsarin yana faruwa a cikin rajistar buffer da aka raba daga rajistar masu aiki ta damper (sakata) wani nau'in dakin jira ne inda aka jera ramuka a cikin jerin da ake so. Lokacin da komai ya shirya, rufewa yana buɗewa kuma raƙuman suna zuwa aiki, suna maye gurbin rukunin baya. Kalma sakata a cikin takaddun microcircuits kusan koyaushe yana nuna irin wannan damper, komai a cikin waɗanne haɗe-haɗe da aka yi amfani da su.

Don haka, ana aiwatar da canja wurin bayanai zuwa DM634 kamar haka: saita shigarwar DAI zuwa ƙimar mafi mahimmancin bit na LED mai nisa, ja DCK sama da ƙasa; saita shigarwar DAI zuwa ƙimar bit na gaba, ja DCK; da sauransu har sai an watsa dukkan sassan (a kulle), bayan haka muna ja LAT. Ana iya yin wannan da hannu (bit-bang), amma yana da kyau a yi amfani da ƙirar SPI musamman wanda aka keɓe don wannan, tunda an gabatar da shi akan STM32 ɗinmu a cikin kwafi biyu.

Blue Pill STM32F103

Gabatarwa: Masu kula da STM32 sun fi Atmega328 rikitarwa fiye da yadda za su iya zama abin ban tsoro. Haka kuma, saboda dalilai na ceton makamashi, kusan dukkanin abubuwan da ke kewaye suna kashe a farkon, kuma mitar agogo shine 8 MHz daga tushen ciki. Abin farin ciki, masu shirye-shiryen STM sun rubuta lambar da ke kawo guntu har zuwa "ƙididdigar" 72 MHz, kuma marubutan duk IDEs da na sani sun haɗa da shi a cikin tsarin farawa, don haka ba ma buƙatar agogo (amma zaka iya idan da gaske kake so). Amma dole ne ku kunna kayan aiki.

Takaddun shaida: Blue Pill sanye take da mashahurin guntu STM32F103C8T6, akwai takaddun amfani guda biyu don shi:

A cikin takardar bayanan za mu iya sha'awar:

  • Pinouts - guntu pinouts - idan mun yanke shawarar yin allunan da kanmu;
  • Taswirar ƙwaƙwalwa – taswirar ƙwaƙwalwar ajiya don takamaiman guntu. Littafin Magana yana da taswirar layin gaba ɗaya, kuma ya ambaci rajistar da namu ba shi da shi.
  • Teburin ma'anar fil - jera manyan ayyuka da madadin fil; don "kwayar shuɗi" za ku iya samun ƙarin hotuna masu dacewa akan Intanet tare da jerin fil da ayyukan su. Don haka, nan da nan za mu yi Google Pill pinout kuma mu ajiye wannan hoton a hannu:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
NB: Akwai kuskure a cikin hoton daga Intanet, wanda aka lura a cikin sharhi, na gode da hakan. An maye gurbin hoton, amma wannan darasi ne - yana da kyau a duba bayanai ba daga takardun bayanai ba.

Muna cire bayanan bayanan, buɗe Manual Reference, kuma daga yanzu muna amfani da shi kawai.
Tsari: muna hulɗa da daidaitaccen shigarwa/fitarwa, saita SPI, kunna abubuwan da suka dace.

Fitowar shigarwa

A kan Atmega328, I/O ana aiwatar da shi cikin sauƙi, wanda shine dalilin da ya sa yawan zaɓuɓɓukan STM32 na iya zama da ruɗani. Yanzu muna buƙatar ƙarshe kawai, amma ko da waɗannan suna da zaɓuɓɓuka guda huɗu:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
buɗaɗɗen magudanar ruwa, ja-guda, madadin turawa, madadin buɗaɗɗen magudanar ruwa

"Ja-tura" (tura-ja) shine fitowar da aka saba daga Arduino, fil ɗin na iya ɗaukar ƙimar ko dai HIGH ko LOW. Amma tare da "bude magudana" akwai matsaloli, kodayake a gaskiya komai yana da sauki a nan:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Tsarin fitarwa / lokacin da aka sanya tashar tashar jiragen ruwa don fitarwa: / buffer fitarwa ya kunna: / - yanayin buɗe magudanar ruwa: “0” a cikin rajistar fitarwa yana ba da damar N-MOS, “1” a cikin rajistar fitarwa ya bar tashar jiragen ruwa a yanayin Hi-Z ( P-MOS ba a kunna ba) / - Yanayin tura-pull: "0" a cikin rijistar fitarwa yana kunna N-MOS, "1" a cikin rajistar fitarwa yana kunna P-MOS.

Duk bambanci tsakanin buɗaɗɗen magudanar ruwa (bude magudanar ruwadaga "push-pull" (tura-ja) shine cewa a cikin fil na farko ba zai iya karɓar yanayin HIGH ba: lokacin rubuta ɗaya zuwa rajistar fitarwa, yana shiga cikin yanayin juriya mai girma (high impedance, Hi-Z). Lokacin rubuta sifili, fil ɗin yana aiki iri ɗaya a cikin hanyoyi biyu, duka a hankali da lantarki.

A yanayin fitarwa na yau da kullun, fil ɗin yana watsa abubuwan da ke cikin rajistar fitarwa kawai. A cikin "madadin" ana sarrafa shi ta hanyoyin da suka dace (duba 9.1.4):

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Idan an saita bit ta tashar jiragen ruwa azaman fil ɗin madadin aiki, an kashe rajistar fil kuma an haɗa fil ɗin zuwa fil ɗin gefe.

Ana bayyana madadin aikin kowane fil a ciki Fassara Ma'anar Takardar bayanan yana kan hoton da aka zazzage. Ga tambayar abin da za a yi idan fil yana da madadin ayyuka da yawa, ana ba da amsar ta bayanin rubutu a cikin bayanan:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Idan maɓalli da yawa suna amfani da fil iri ɗaya, don guje wa rikici tsakanin madadin ayyuka, sai a yi amfani da na gefe ɗaya kawai a lokaci guda, ana jujjuyawa ta amfani da agogon da ke gefen gefe (a cikin rajistar RCC da ta dace).

A ƙarshe, fil a yanayin fitarwa kuma suna da saurin agogo. Wannan wata alama ce ta ceton makamashi; a cikin yanayinmu, mun saita shi zuwa iyakar kuma mu manta da shi.

Don haka: muna amfani da SPI, wanda ke nufin cewa fil biyu (tare da bayanai da siginar agogo) ya kamata su zama "madadin aikin turawa", wani kuma (LAT) ya zama "pull-pull na yau da kullun". Amma kafin sanya su, bari mu magance SPI.

SPI

Wani karamin shirin ilimi

SPI ko Serial Peripheral Interface (serial interface interface) abu ne mai sauƙi kuma mai tasiri sosai don haɗa MK tare da sauran MKs da duniyar waje gaba ɗaya. An riga an kwatanta ka'idar aikinsa a sama, inda game da direban LED na kasar Sin (a cikin littafin tunani, duba sashe na 25). SPI na iya aiki a yanayin maigidan ("maigida") da bawa ("bawa"). SPI tana da tashoshi na asali guda huɗu, waɗanda ba za a iya amfani da su duka ba:

  • MOSI, Jagorar Fitarwa / Shigar Bawan: wannan fil ɗin yana watsa bayanai a cikin babban yanayin, kuma yana karɓar bayanai cikin yanayin bawa;
  • MISO, Jagorar Input / Bawa: akasin haka, yana karɓa a cikin maigidan, kuma yana watsawa a cikin bawa;
  • SCK, Serial Clock: yana saita mitar watsa bayanai a cikin maigidan ko karɓar siginar agogo a cikin bawa. Ainihin bugun bugun;
  • SS, Bawan Zabi: tare da taimakon wannan tashar, bawa ya san cewa ana neman wani abu daga gare shi. A kan STM32 ana kiransa NSS, inda N = korau, watau. mai sarrafawa ya zama bawa idan akwai ƙasa a cikin wannan tashar. Ya haɗu da kyau tare da Yanayin Buɗe Magudanar ruwa, amma wannan wani labari ne.

Kamar kowane abu, SPI akan STM32 yana da wadatar aiki, wanda ya sa ya ɗan ɗan wahala fahimta. Alal misali, yana iya aiki ba kawai tare da SPI ba, amma har ma tare da haɗin gwiwar I2S, kuma a cikin takardun an haɗa bayanin su, ya zama dole don yanke abin da ya wuce a cikin lokaci. Ayyukanmu yana da sauƙin gaske: kawai muna buƙatar aika bayanai ta amfani da MOSI da SCK kawai. Mun je sashe na 25.3.4 (sadar da rabi-duplex, sadarwar rabin duplex), inda muka samu. Agogo 1 da waya data unidirectional 1 (Siginar agogo 1 da rafin bayanan unidirectional 1):

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
A cikin wannan yanayin, aikace-aikacen yana amfani da SPI a ko dai watsa-kawai ko yanayin karɓa-kawai. / Yanayin watsawa kawai yana kama da yanayin duplex: ana watsa bayanai akan fil ɗin watsawa (MOSI a cikin yanayin babban ko MISO a yanayin bawa), kuma ana iya amfani da fil ɗin karɓa (MISO ko MOSI bi da bi) azaman fil na I/O na yau da kullun. . A wannan yanayin, aikace-aikacen yana buƙatar kawai yin watsi da buffer Rx (idan an karanta shi, ba za a sami bayanan da aka canjawa wuri a can ba).

Mai girma, fil ɗin MISO kyauta ne, bari mu haɗa siginar LAT zuwa gare shi. Bari mu dubi Slave Select, wanda akan STM32 za a iya sarrafa shi ta hanyar shirye-shirye, wanda ya dace sosai. Mun karanta sakin layi na suna ɗaya a cikin sashe na 25.3.1 SPI Gabaɗaya Bayani:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Ikon software NSS (SSM = 1) / Bayanin zaɓin bawa yana ƙunshe a cikin SSI bit na rajistar SPI_CR1. Fitin NSS na waje ya kasance kyauta don sauran buƙatun aikace-aikacen.

Lokaci ya yi da za a rubuta wa masu rajista. Na yanke shawarar yin amfani da SPI2, nemo adireshin tushe a cikin bayanan bayanai - a cikin sashe na 3.3 Taswirar ƙwaƙwalwa:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

To, bari mu fara:

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

Bude sashe na 25.3.3 tare da taken bayanin kai "Hanyar da SPI a Yanayin Jagora":

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

1. Sanya mitar agogon serial tare da bits BR[2:0] a cikin rajistar SPI_CR1.

Ana tattara rajistar a cikin sashin jagorar suna iri ɗaya. Canjin adireshi (Adadin adireshi) don CR1 - 0x00, ta tsohuwa an share duk raguwa (Sake saita ƙima 0x0000:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Rarraba BR suna saita mai rarraba agogo, don haka ƙayyade mitar da SPI zata yi aiki. Mitar mu ta STM32 za ta zama 72 MHz, direban LED, bisa ga takardar bayanansa, yana aiki da mitar har zuwa 25 MHz, don haka muna buƙatar raba ta huɗu (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. Saita ragowar CPOL da CPHA don ayyana alakar canja wurin bayanai da lokacin agogon serial (duba zane a shafi na 240)

Tun da muna karanta takardar bayanai a nan kuma ba mu duba tsarin ƙira, bari mu ɗan duba bayanin kwatancen CPOL da CPHA a shafi na 704 (SPI General Description):

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Lokacin agogo da polarity
Yin amfani da raƙuman CPOL da CPHA na rajistar SPI_CR1, zaku iya zaɓar alaƙar lokaci guda huɗu ta tsari. CPOL (agogon agogo) bit yana sarrafa yanayin siginar agogo lokacin da ba a watsa bayanai ba. Wannan bit yana sarrafa tsarin maigida da bawa. Idan an sake saita CPOL, fil ɗin SCK yayi ƙasa a yanayin hutu. Idan an saita bit CPOL, fil ɗin SCK yana da girma yayin yanayin hutu.
Lokacin da aka saita CPHA (lokacin agogo) bit, babban bit trap strobe shine gefen na biyu na siginar SCK (fadowa idan CPOL ya bayyana, yana tashi idan an saita CPOL). Ana ɗaukar bayanan ta canji na biyu a siginar agogo. Idan CPHA bit ya bayyana a sarari, babban bit tarkon strobe shi ne tasowar gefen siginar SCK (faɗuwar gefen idan an saita CPOL, tashin gefen idan an share CPOL). Ana ɗaukar bayanai a farkon canjin siginar agogo.

Bayan da muka sha wannan ilimin, mun zo ga ƙarshe cewa duka ragowa dole ne su kasance sifili, saboda Muna son siginar SCK ta kasance ƙasa da ƙasa lokacin da ba a amfani da ita, kuma za a watsa bayanai akan gefen bugun bugun jini (duba siffa. Tashi Edge Bayanan Bayani na DM634

Af, a nan mun fara ci karo da fasalin ƙamus a cikin ST datasheets: a cikinsu an rubuta kalmar "sake saita bit zuwa sifili" don sake saitawa kaɗan, kuma ba don share kadan, kamar, misali, Atmega.

3. Saita DFF bit don sanin ko block data kasance 8-bit ko 16-bit format

Na ɗauki 16-bit DM634 musamman don kada in damu da watsa bayanan PWM 12-bit, kamar DM633. Yana da ma'ana don saita DFF zuwa ɗaya:

#define DFF         0x0800

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

4. Sanya bit ɗin LSBFIRST a cikin rajistar SPI_CR1 don tantance tsarin toshe

LSBFIRST, kamar yadda sunansa ya nuna, yana saita watsawa tare da mafi ƙarancin mahimmanci da farko. Amma DM634 yana son karɓar bayanai da suka fara daga mafi mahimmancin bit. Saboda haka, mun bar shi sake saiti.

5. A yanayin hardware, idan ana buƙatar shigarwa daga fil ɗin NSS, yi amfani da babban sigina zuwa fil ɗin NSS yayin duk jerin canja wurin byte. A cikin yanayin software na NSS, saita SSM da SSI bits a cikin rajistar SPI_CR1. Idan za a yi amfani da fil ɗin NSS azaman fitarwa, kawai SSOE bit yana buƙatar saita shi.

Sanya SSM da SSI don manta da yanayin kayan aikin NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Dole ne a saita MSTR da SPE bits (sun kasance a saita kawai idan siginar NSS ya yi girma)

A haƙiƙa, tare da waɗannan ragowa muna zayyana SPI ɗin mu a matsayin jagora kuma muna kunna ta:

#define MSTR        0x0004
#define SPE         0x0040

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

An saita SPI, bari mu rubuta ayyukan da ke aika bytes zuwa direba. Ci gaba da karanta 25.3.3 "Tsarin SPI a cikin babban yanayin":

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
odar canja wurin bayanai
Watsawa yana farawa lokacin da aka rubuta byte zuwa Tx buffer.
Ana loda bayanan byte a cikin rajistar motsi a a layi daya yanayin (daga bas na ciki) yayin watsawar bit na farko, bayan haka ana watsa shi zuwa na jerin gwano Yanayin fil MOSI, na farko ko na ƙarshe ɗan gaba ya danganta da saitin LSBFIRST bit a cikin rijistar CPI_CR1. An saita tutar TXE bayan watsa bayanai daga Tx buffer don canza rajista, kuma yana haifar da katsewa idan an saita bit TXEIE a cikin rijistar CPI_CR1.

Na haskaka wasu kalmomi a cikin fassarar don jawo hankali ga fasalin guda ɗaya na aiwatar da SPI a cikin masu kula da STM. A kan Atmega tutar TXE (Tx Babu, Tx fanko ne kuma yana shirye don karɓar bayanai) an saita shi kawai bayan an aika duka byte fita. Kuma a nan an saita wannan tutar bayan an shigar da byte a cikin rajistar motsi na ciki. Tun da an tura shi a can tare da duk raƙuman ruwa a lokaci guda (a cikin layi daya), sannan kuma ana canja wurin bayanan a jere, ana saita TXE kafin a aika da byte gaba ɗaya. Wannan yana da mahimmanci saboda a yanayin direbanmu na LED, muna buƙatar ja fil ɗin LAT bayan aikawa всех data, i.e. Tutar TXE kadai ba za ta ishe mu ba.

Wannan yana nufin muna buƙatar wata tuta. Bari mu dubi 25.3.7 - "Yanayin Tuta":

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
<…>
Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Tuta BUSY
An saita tutar BSY kuma an share ta ta kayan aiki (rubutu zuwa gare shi ba shi da wani tasiri). Tutar BSY tana nuna yanayin layin sadarwar SPI.
Yana sake saitawa:
lokacin da aka gama canja wuri (sai dai a yanayin babban idan an ci gaba da canja wurin)
lokacin da aka kashe SPI
lokacin da kuskuren yanayin yanayin ya faru (MODF=1)
Idan ba a ci gaba da canja wurin ba, ana share tutar BSY tsakanin kowace canja wurin bayanai

To, wannan zai zo da amfani. Bari mu gano inda Tx buffer yake. Don yin wannan, karanta "SPI Data Register":

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Bits 15:0 DR[15:0] Rijistar Bayanai
Bayanan da aka karɓa ko bayanan da za a watsa.
An raba rajistar bayanan gida biyu - ɗaya don rubutawa (buffer watsawa) da ɗaya don karantawa (karɓi buffer). Rubutu zuwa rajistar bayanai yana rubutawa zuwa ga buffer Tx, kuma karantawa daga rajistar bayanan zai dawo da ƙimar da ke cikin buffer Rx.

Da kyau, da rajistar matsayi, inda aka samo tutocin TXE da BSY:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Mun rubuta:

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

To, tun da muna buƙatar watsa sau 16 sau biyu bytes, bisa ga adadin fitowar direban LED, wani abu kamar haka:

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

Amma ba mu san yadda ake ja fil ɗin LAT ba tukuna, don haka za mu koma I/O.

Sanya fil

A cikin STM32F1, rijistar da ke da alhakin yanayin fil ba sabon abu bane. A bayyane yake cewa akwai fiye da su fiye da Atmega, amma kuma sun bambanta da sauran kwakwalwan STM. Sashe na 9.1 Gabaɗaya Bayanin GPIO:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Kowane maƙasudin I/O gabaɗaya (GPIO) yana da rajistan daidaitawa guda biyu na 32-bit (GPIOx_CRL da GPIOx_CRH), rajistar bayanan 32-bit guda biyu (GPIOx_IDR da GPIOx_ODR), rijistar saiti/sake saitin 32-bit (GPIOx_BSRR), rajistar sake saiti 16-bit (GPIOx_BRR) da 32- rajistar blocking bit (GPIOx_LCKR).

Rijista biyu na farko ba sabon abu ba ne, kuma ba su da daɗi sosai, saboda filayen tashar jiragen ruwa 16 suna warwatse a cikin su a cikin tsarin “rago huɗu kowane ɗan’uwa”. Wadancan. fil sifili zuwa bakwai suna cikin CRL, sauran kuma suna cikin CRH. A lokaci guda, sauran rajistan ayyukan sun sami nasarar ƙunsar ragowar dukkan fil na tashar jiragen ruwa - sau da yawa saura rabin "ajiye".

Don sauƙi, bari mu fara daga ƙarshen jerin.

Ba ma buƙatar rajistar toshewa.

Saitin saiti da sake saiti suna da ban dariya saboda sun kwafi juna: zaku iya rubuta komai kawai a cikin BSRR, inda mafi girman 16 rago za su sake saita fil zuwa sifili, kuma ƙananan za a saita su zuwa 1, ko kuma zaku iya. Yi amfani da BRR, ƙananan 16 ragowa waɗanda kawai ke sake saita fil. Ina son zabi na biyu. Waɗannan rajistar suna da mahimmanci saboda suna ba da damar atomic zuwa fil:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Saitin Atomic ko Sake saitin
Babu buƙatar kashe katsewa lokacin da ake shirya GPIOx_ODR a matakin bit: ana iya canza rago ɗaya ko fiye tare da aikin rubutaccen atomic guda ɗaya APB2. Ana samun wannan ta hanyar rubuta "1" zuwa rijistar saiti/sake saiti (GPIOx_BSRR ko, don sake saiti kawai, GPIOx_BRR) na bit ɗin da ake buƙatar canzawa. Sauran ragowa ba za su canza ba.

Rijistar bayanan suna da sunaye masu bayyana kansu - IDR = Input Rijistar Jagora, rajistar shigarwa; ODR = Output Direction Register, fitarwa rajista. Ba za mu buƙaci su a cikin aikin na yanzu ba.

Kuma a ƙarshe, kula da rajista. Tun da muna sha'awar SPI na biyu, wato PB13, PB14 da PB15, nan da nan za mu kalli CRH:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Kuma mun ga cewa za mu buƙaci rubuta wani abu a cikin ragowa daga 20 zuwa 31.

Mun riga mun zayyana sama da abin da muke so daga fil, don haka a nan zan yi ba tare da hoton allo ba, kawai zan ce MODE yana ƙayyadaddun shugabanci (shigarwar idan an saita ragowa biyu zuwa 0) da saurin fil (muna buƙatar 50MHz, watau. duka fil zuwa "1"), kuma CNF yana saita yanayin: "push-pull" na yau da kullum - 00, "madadin" - 10. Ta hanyar tsoho, kamar yadda muka gani a sama, duk fil suna da kashi na uku daga kasa (CNF0), yana saita su zuwa yanayin shigar da iyo.

Tun da na yi shirin yin wani abu dabam tare da wannan guntu, don sauƙi na bayyana duk yiwuwar MODE da ƙimar CNF duka biyun ƙananan da na sama.

Ko ta yaya kamar wannan

#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

Filan mu suna kan tashar jiragen ruwa B (adireshin tushe - 0x40010C00), lambar:

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

Kuma, bisa ga haka, zaku iya rubuta ma'anoni don LAT, waɗanda rajistar BRR da BSRR za su canza:

/*** 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 kawai ta inertia, koyaushe haka yake, bari ya zauna)

Yanzu komai yana da kyau, amma ba ya aiki. Saboda wannan shine STM32, suna adana wutar lantarki, wanda ke nufin kuna buƙatar kunna agogon abubuwan da ake buƙata.

Kunna agogo

Agogon, wanda kuma aka sani da Clock, yana da alhakin yin agogo. Kuma mun riga mun lura da raguwar RCC. Muna neman ta a cikin takaddun: wannan shine Sake saiti da Sarrafa agogo.

Kamar yadda aka fada a sama, an yi sa'a, mutane daga STM sun yi mana mafi wahala daga cikin batun clocking, wanda muke gode musu sosai (kuma zan sake ba da hanyar haɗi zuwa Gidan yanar gizon Di Halt, don bayyana yadda yake da rudani). Muna buƙatar rajista kawai da ke da alhakin ba da damar agogon gefe (Agogon Ƙarƙashin Ƙarƙashin Ƙarƙashin Rijista). Da farko, bari mu nemo tushen adireshin RCC, yana a farkon “Taswirar Tunatarwa”:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

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

Sannan ko dai danna hanyar haɗin yanar gizon da kake ƙoƙarin nemo wani abu a cikin farantin, ko, mafi kyau, shiga cikin kwatancin rajistar masu ba da izini daga sassan game da. kunna rajista. Inda zamu sami RCC_APB1ENR da RCC_APB2ENR:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Kuma su, saboda haka, sun ƙunshi raƙuman ruwa waɗanda suka haɗa da clocking na SPI2, IOPB (I/O Port B) da madadin ayyuka (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;

Ana iya samun lambar ƙarshe a nan.

Idan kuna da dama da sha'awar gwadawa, to ku haɗa DM634 kamar haka: DAI zuwa PB15, DCK zuwa PB13, LAT zuwa PB14. Muna kunna direba daga 5 volts, kar a manta da haɗa filaye.

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Saukewa: STM8 PWM

PWM a kan STM8

Lokacin da nake shirin wannan labarin kawai, na yanke shawarar, a matsayin misali, don ƙoƙarin gwada wasu ayyuka na guntu da ba a sani ba ta amfani da takaddun bayanai kawai, don kada in ƙare tare da mai yin takalma ba tare da takalma ba. STM8 ya dace da wannan rawar: na farko, ina da allunan Sinawa guda biyu masu dauke da STM8S103, na biyu kuma, ba shi da farin jini sosai, sabili da haka jarabar karantawa da neman mafita a Intanet ta dogara ne kan rashin wadannan hanyoyin magance su.

Hakanan guntu yana da takardar bayanai и Bayanan Bayani na RM0016, a cikin farko akwai pinout da adiresoshin rajista, a cikin na biyu - duk abin da. An tsara STM8 a cikin C a cikin mummunan IDE ST Kayayyakin Haɓaka.

Clocking da I/O

Ta hanyar tsoho, STM8 yana aiki a mitar 2 MHz, dole ne a gyara wannan nan da nan.

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
HSI (High Speed ​​​​Internal) agogo
An samo siginar agogon HSI daga oscillator na 16 MHz RC na ciki tare da mai raba shirye-shirye (1 zuwa 8). An saita shi a cikin rajistar mai raba agogo (CLK_CKDIVR).
Lura: a farkon, an zaɓi HSI RC oscillator tare da mai raba 8 azaman jagorar tushen siginar agogo.

Mun sami adireshin rajista a cikin takaddar bayanan, bayanin a cikin refman kuma ga cewa rajistar yana buƙatar sharewa:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Tun da za mu gudanar da PWM kuma mu haɗa LEDs, bari mu dubi pinout:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Guntu yana ƙarami, ayyuka da yawa ana dakatar da su akan fil guda ɗaya. Abin da ke cikin maƙallan murabba'i shine "madadin ayyuka", ana canza shi ta "bayanin zaɓi" (zabin bytes) - wani abu kamar Atmega fuses. Kuna iya canza ƙimar su ta hanyar shirye-shirye, amma ba lallai ba ne, saboda Ana kunna sabon aikin bayan sake kunnawa. Ya fi sauƙi don amfani da ST Visual Programmer (wanda aka zazzage tare da Haɓaka Kayayyakin gani), wanda zai iya canza waɗannan bytes. Ƙididdiga ya nuna cewa CH1 da CH2 fil na farkon mai ƙidayar lokaci suna ɓoye a cikin madaidaicin madauri; ya zama dole a saita ragowar AFR1 da AFR0 a cikin STVP, na biyun kuma zai canza wurin fitar da CH1 na lokaci na biyu daga PD4 zuwa PC5.

Don haka, 6 fil za su sarrafa LEDs: PC6, PC7 da PC3 don farkon lokaci, PC5, PD3 da PA3 na biyu.

Saita fil ɗin I/O da kansu akan STM8 ya fi sauƙi kuma mafi ma'ana fiye da na STM32:

  • saba daga Atmega DDR data rajistar shugabanci (Rijistar Hanyar Bayanai): 1 = fitarwa;
  • rajistar sarrafawa ta farko CR1, lokacin fitarwa, saita yanayin tura-pull (1) ko buɗe magudanar ruwa (0); tun da na haɗa LEDs zuwa guntu tare da cathodes, na bar sifili a nan;
  • rajistar sarrafawa ta biyu CR2, lokacin fitarwa, saita saurin agogo: 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

Saitin PWM

Da farko, bari mu ayyana sharuɗɗan:

  • Yanayin PWM – yawan abin da mai ƙidayar lokaci ya kaskanta;
  • Sake kunnawa ta atomatik, AR - ƙimar da za a iya ɗauka ta atomatik wanda mai ƙidayar lokaci zai ƙidaya (lokacin bugun jini);
  • Sabunta taron, UEV - lamarin da ke faruwa lokacin da mai ƙidayar lokaci ya ƙidaya zuwa AR;
  • Zagayowar Aikin PWM - Zagayowar wajibi na PWM, galibi ana kiranta “factor factor”;
  • Ɗaukar / Kwatanta Ƙimar - ƙimar kama/kwatancen, wanda mai ƙidayar lokaci ya ƙidaya zai yi wani abu (a cikin yanayin PWM, yana jujjuya siginar fitarwa);
  • Preload Darajar - ƙimar da aka riga aka ɗora. Kwatanta ƙima ba zai iya canzawa yayin da mai ƙidayar lokaci ke yin ticking, in ba haka ba zagayowar PWM zata karye. Don haka, ana sanya sabbin dabi'u da aka watsa a cikin ma'auni kuma a fitar da su lokacin da mai ƙidayar lokaci ya kai ƙarshen ƙirgawa kuma aka sake saita shi;
  • Gefen-daidaitacce и Hanyoyin daidaitawa a tsakiya - daidaitawa tare da iyaka da kuma a tsakiya, daidai da na Atmel PWM mai sauri и PWM daidai-lokaci.
  • OCiREF, Fitarwa Kwatanta Siginar Magana – siginar fitarwa na tunani, a zahiri, abin da ke bayyana akan madaidaicin fil a yanayin PWM.

Kamar yadda ya riga ya bayyana daga pinout, masu ƙidayar lokaci biyu suna da damar PWM - na farko da na biyu. Dukansu 16-bit ne, na farko yana da ƙarin ƙarin fasali (musamman, yana iya ƙirga duka sama da ƙasa). Muna buƙatar duka biyu suyi aiki daidai, don haka na yanke shawarar farawa tare da mafi talauci na biyu, don kada in yi amfani da wani abu da ba a can ba da gangan. Wasu matsala ita ce bayanin aikin PWM na duk masu ƙidayar lokaci a cikin littafin tunani yana cikin babi game da mai ƙidayar lokaci (17.5.7 PWM Mode), don haka dole ne ku yi tsalle da baya da baya a cikin takaddar koyaushe.

PWM akan STM8 yana da muhimmiyar fa'ida akan PWM akan Atmega:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
PWM mai iyaka
Tsarin lissafi daga ƙasa zuwa sama
Ƙididdigar ƙasa tana aiki idan an share bit DIR a cikin rajistar TIM_CR1
Alal misali:
Misali yana amfani da yanayin PWM na farko. Siginar tunani na PWM OCIREF yana riƙe da tsayi muddin TIM1_CNT <TIM1_CCRi. In ba haka ba yana ɗaukar ƙananan matakin. Idan darajar kwatankwacin a cikin rajistar TIM1_CCRi ta fi ƙimar ɗaukar nauyi ta atomatik ( rijistar TIM1_ARR), siginar OciREF yana riƙe a 1. Idan ƙimar kwatancen ita ce 0, OciREF ana riƙe da sifili....

lokacin STM8 sabunta taron cak na farko kwatanta darajar, sannan kawai yana samar da siginar tunani. Mai ƙidayar lokaci na Atmega ya fara zazzagewa sannan ya kwatanta, yana haifar da hakan compare value == 0 fitarwar allura ce, wacce dole ne a yi maganin ta ko ta yaya (misali, ta hanyar juyar da dabaru).

Don haka abin da muke so mu yi: 8-bit PWM (AR == 255), ƙidaya daga ƙasa zuwa sama, daidaitawa tare da iyaka. Tun da fitilun fitilu an haɗa su zuwa guntu ta hanyar cathodes, PWM ya kamata ya fitar da 0 (LED akan) har sai kwatanta darajar da 1 bayan.

Mun riga mun karanta game da wasu Yanayin PWM, don haka mun sami rajistar da ake buƙata na mai ƙidayar lokaci ta biyu ta hanyar bincike a cikin littafin tunani na wannan jumla (18.6.8 - TIMx_CCMR1):

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
110: Yanayin PWM na farko - lokacin ƙidaya daga ƙasa zuwa sama, tashar farko tana aiki yayin da TIMx_CNT <TIMx_CCR1. In ba haka ba, tashar farko ba ta aiki. 1: Yanayin PWM na biyu - lokacin ƙidaya daga ƙasa zuwa sama, tashar farko ba ta aiki yayin da TIMx_CNT <TIMx_CCR111. In ba haka ba, tashar farko tana aiki.

Tun da LEDs sun haɗa da MK ta hanyar cathodes, yanayin na biyu ya dace da mu (na farko kuma, amma ba mu san hakan ba tukuna).

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Bit 3 OC1PE: Kunna fil 1 preload
0: Rijista riga-kafi akan TIMx_CCR1 an kashe. Kuna iya rubutawa zuwa TIMx_CCR1 a kowane lokaci. Sabuwar ƙimar tana aiki nan da nan.
1: An kunna rijistar riga-kafi akan TIMx_CCR1. Ayyukan karantawa/rubutu suna samun damar yin rijistar riga-kafi. Ana loda ƙimar da aka riga aka ɗorawa TIMx_CCR1 a cikin rajistar inuwa yayin kowane taron sabuntawa.
* Lura: Domin yanayin PWM yayi aiki da kyau, dole ne a kunna rajistar da aka rigaya. Wannan ba lallai ba ne a yanayin sigina ɗaya (an saita bit OPM a cikin rajistar TIMx_CR1).

To, bari mu kunna duk abin da muke buƙata don tashoshi uku na lokaci na biyu:

#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 ya ƙunshi rajista biyu-bit takwas, komai mai sauƙi ne:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Mai ƙidayar ƙidayar lokaci na biyu zai iya ƙidaya kawai daga ƙasa zuwa sama, daidaitawa tare da iyaka, babu abin da ke buƙatar canzawa. Bari mu saita mai rarraba mita, alal misali, zuwa 256. A karo na biyu, ana saita mai rarraba a cikin rajistar TIM2_PSCR kuma yana da iko na biyu:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Duk abin da ya rage shi ne kunna ƙarshe da mai ƙidayar lokaci na biyu kanta. Ana magance matsalar farko ta hanyar rajista Ɗaukar / Kwatanta Enable: akwai tashoshi biyu, uku sun warwatse a cikin su asymmetrically. Anan kuma zamu iya koya cewa yana yiwuwa a canza polarity na siginar, watau. bisa ƙa'ida, yana yiwuwa a yi amfani da PWM Mode 1. Mun rubuta:

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

Kuma a ƙarshe, mun fara mai ƙidayar lokaci a cikin rajistar TIMx_CR1:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Bari mu rubuta analog mai sauƙi na AnalogWrite (), wanda zai canza ainihin ƙimar zuwa mai ƙidayar lokaci don kwatanta. Ana iya faɗin sunayen masu rijistar Ɗaukar / Kwatanta rajista, akwai guda biyu daga cikinsu ga kowane tashoshi: ƙananan oda 8 a cikin TIM2_CCRxL da masu girma a cikin TIM2_CCRxH. Tun da mun ƙirƙiri PWM 8-bit, ya isa mu rubuta kawai ƙananan ƙananan ragi:

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

Mai karatu mai hankali zai lura cewa muna da ƙarancin PWM kaɗan, ba za mu iya samar da cika 100% ba (a iyakar ƙimar 255, ana jujjuya siginar don sake zagayowar lokaci ɗaya). Don LEDs wannan ba kome ba ne, kuma mai karatu mai hankali zai iya riga ya yi tunanin yadda za a gyara shi.

PWM akan mai ƙidayar lokaci na biyu yana aiki, bari mu matsa zuwa na farko.

Mai ƙidayar lokaci na farko yana da daidai guda ɗaya a cikin rajista iri ɗaya (kawai cewa waɗancan raƙuman da suka rage “ajiya” a cikin mai ƙidayar lokaci na biyu ana amfani da su sosai a farkon don kowane nau'ikan abubuwan ci gaba). Saboda haka, ya isa nemo adiresoshin rajista iri ɗaya a cikin bayanan bayanan kuma kwafi lambar. To, canza darajar mitar mai rarrabawa, saboda... mai ƙidayar lokaci na farko yana so ya karɓi ba ikon biyu ba, amma ainihin ƙimar 16-bit a cikin rajista biyu Prescaler High и low. Muna yin komai kuma ... na farko ba ya aiki. Akwai matsala?

Za a iya magance matsalar ne kawai ta hanyar duba duk sashin game da rajistar sarrafa mai ƙidayar lokaci 1, inda muke neman wanda mai ƙidayar lokaci na biyu ba shi da shi. Za a yi 17.7.30 Rage rajista (TIM1_BKR), inda akwai wannan bit:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Kunna babban fitarwa

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Wannan shine tabbas yanzu, lambar can.

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Farashin STM8 Multiplex

Multiplexing akan STM8

Karamin aikin na uku shine haɗa LEDs RGB guda takwas zuwa mai ƙidayar lokaci na biyu a yanayin PWM kuma sanya su nuna launuka daban-daban. Ya dogara ne akan ra'ayi na LED multiplexing, wanda shine cewa idan kun kunna da kashe LEDs da sauri da sauri, zai zama alama a gare mu cewa suna ci gaba da kunnawa (dagewar hangen nesa, rashin fahimta na gani). Na taba yi wani abu kamar wannan akan Arduino.

Algorithm na aiki yayi kama da haka:

  • haɗa anode na farko RGB LED;
  • kunna shi, aika da siginar da ake bukata zuwa ga cathodes;
  • jira har zuwa ƙarshen zagayowar PWM;
  • haɗa anode na LED RGB na biyu;
  • kunna shi...

To, da sauransu. Tabbas, don kyakkyawan aiki ana buƙatar haɗin anode kuma ana kunna LED a lokaci guda. To, ko kusan. A kowane hali, muna buƙatar rubuta lambar da za ta fitar da ƙima a cikin tashoshi uku na lokaci na biyu, canza su lokacin da aka kai UEV, kuma a lokaci guda canza RGB LED mai aiki a halin yanzu.

Tun da sauyawar LED ta atomatik ne, muna buƙatar ƙirƙirar "ƙwaƙwalwar bidiyo" wanda mai kula da katse zai karɓi bayanai. Wannan tsari ne mai sauƙi:

uint8_t colors[8][3];

Don canza launi na takamaiman LED, zai isa ya rubuta ƙimar da ake buƙata a cikin wannan tsararru. Kuma mai canzawa zai kasance alhakin adadin LED mai aiki

uint8_t cnt;

Demux

Don daidaitawa da yawa, muna buƙatar, abin banƙyama, CD74HC238 demultiplexer. Demultiplexer - guntu da ke aiwatar da mai aiki a cikin kayan aiki <<. Ta hanyar fil ɗin shigarwa guda uku (bits 0, 1 da 2) muna ciyar da shi lamba X-bit uku, kuma a cikin martani yana kunna lambar fitarwa (1<<X). Sauran abubuwan da ke cikin guntu ana amfani da su don auna dukkan ƙira. Muna buƙatar wannan guntu ba kawai don rage adadin madaidaicin fil na microcontroller ba, har ma don aminci - don kar a kunna ƙarin LEDs fiye da yiwuwar kuma kar a ƙone MK. Chip din yana da dinari guda kuma yakamata a adana shi a cikin ma'aikatun likitancin ku.

CD74HC238 namu zai kasance alhakin samar da wutar lantarki zuwa anode na LED da ake so. A cikin cikakken ma'auni mai yawa, zai ba da wutar lantarki zuwa ginshiƙi ta hanyar P-MOSFET, amma a cikin wannan demo yana yiwuwa kai tsaye, saboda yana zana 20 mA, bisa ga cikakken matsakaicin ratings a cikin datasheet. Daga Takardar bayanai:CD74HC238 muna buƙatar pinouts da wannan takardar yaudara:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
H = Babban ƙarfin lantarki, L = ƙananan ƙarfin lantarki, X - kada ku damu

Muna haɗa E2 da E1 zuwa ƙasa, E3, A0, A1 da A3 zuwa fil PD5, PC3, PC4 da PC5 na STM8. Tunda teburin da ke sama ya ƙunshi ƙananan matakan ƙasa da babba, muna saita waɗannan fil ɗin azaman fil-pull.

PWM

PWM akan mai ƙidayar lokaci na biyu an saita shi kamar yadda yake a cikin labarin da ya gabata, tare da bambance-bambance guda biyu:

Da farko, muna buƙatar kunna katsewar a kunne Sabunta taron (UEV) wanda zai kira aikin da ke kunna LED mai aiki. Ana yin wannan ta hanyar canza bit Kunna Katsewar Sabuntawa a cikin wani rajista tare da bayyana sunan

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
Katse kunna rajista

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Bambanci na biyu yana da alaƙa da al'amuran multixing, kamar ghosting - parasitic haske na diodes. A cikin yanayinmu, yana iya bayyana saboda gaskiyar cewa mai ƙidayar lokaci, wanda ya haifar da katsewa akan UEV, ya ci gaba da yin la'akari, kuma mai sarrafa katse ba shi da lokacin canza LED ɗin kafin mai ƙidayar lokaci ya fara rubuta wani abu zuwa fil. Don magance wannan, dole ne ku juyar da dabaru (0 = matsakaicin haske, 255 = babu abin da ke haskakawa) kuma ku guje wa matsananciyar ƙimar zagayowar aiki. Wadancan. Tabbatar cewa bayan UEV LEDs sun fita gaba ɗaya don sake zagayowar PWM ɗaya.

Canza polarity:

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

Guji saita r, g da b zuwa 255 kuma ku tuna juya su lokacin amfani da su.

Katsewa

Ma'anar katsewa shine cewa a ƙarƙashin wasu yanayi guntu ya daina aiwatar da babban shirin kuma ya kira wasu ayyuka na waje. Katsewa yana faruwa saboda tasirin waje ko na ciki, gami da mai ƙidayar lokaci.

Lokacin da muka fara ƙirƙirar aikin a cikin ST Visual Develop, ban da main.c mun sami taga tare da fayil mai ban mamaki stm8_interrupt_vector.c, an haɗa ta atomatik a cikin aikin. A cikin wannan fayil, ana sanya aiki ga kowane katsewa NonHandledInterrupt. Muna buƙatar ɗaure aikinmu zuwa katsewar da ake so.

Taswirar bayanan yana da tebur na katsewa, inda muka sami waɗanda muke buƙata:

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8
13 TIM2 sabuntawa / ambaliya
14 TIM2 kama/kwatanta

Muna buƙatar canza LED a UEV, don haka muna buƙatar katse #13.

Saboda haka, da farko, a cikin fayil stm8_interrupt_vector.c canza sunan tsoho na aikin da ke da alhakin katse lamba 13 (IRQ13) zuwa naka:

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

Na biyu, za mu ƙirƙiri fayil main.h tare da abun ciki mai zuwa:

#ifndef __MAIN_H
#define __MAIN_H

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

Kuma a ƙarshe, rubuta wannan aikin a cikin ku 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;
}

Abin da ya rage shi ne kunna katsewa. Ana yin wannan ta amfani da umarnin mai tarawa rim - za ku nema a ciki Littafin shiryawa:

//enable interrupts
_asm("rim");

Wani umarni na masu tarawa shine sim – Yana kashe katsewa. Dole ne a kashe su yayin da ake rubuta sabbin ƙima zuwa "ƙwaƙwalwar bidiyo", don kada katsewar da aka yi a lokacin da ba daidai ba ya lalata tsararru.

Duk code - ku GitHub.

Karanta takaddun bayanai 2: SPI akan STM32; PWM, masu ƙidayar lokaci da katsewa akan STM8

Idan akalla wani ya sami wannan labarin yana da amfani, to ban rubuta shi a banza ba. Zan yi farin cikin karɓar sharhi da maganganu, zan yi ƙoƙarin amsa komai.

source: www.habr.com

Add a comment