Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

В le vaega muamua Sa ou taumafai e taʻu atu i le au inisinia faʻaeletonika fiafia na ola aʻe mai le ofuvae Arduino pe faʻafefea ma pe aisea e tatau ai ona latou faitau faʻamaumauga ma isi faʻamaumauga mo microcontrollers. O le tusitusiga na foliga mai e lapopoa, o lea na ou folafola atu ai e faʻaalia ni faʻataʻitaʻiga aoga i se isi tala. Ia, na ia taʻua o ia o se susu susu ...

O le asō o le a ou faʻaali atu ia te oe pe faʻapefea ona faʻaogaina faʻamaumauga e foia faigofie, ae manaʻomia mo le tele o galuega faatino, galuega ile STM32 (Blue Pill) ma le STM8 controllers. O faʻataʻitaʻiga faʻataʻitaʻiga uma e tuʻufaʻatasia i laʻu LED e sili ona ou fiafia i ai, matou te faʻamalamalamaina i latou i le tele, lea e tatau ona matou faʻaogaina ai ituaiga uma o mea manaia.

O le tusitusiga na toe liliu mai e tele, o lea mo le faʻaogaina o loʻo ou faia le anotusi:

STM32 Blue Pill: 16 LEDs ma le avetaavale DM634
STM8: Fa'atulaga pine PWM e ono
STM8: 8 RGB LEDs i pine e tolu, faʻalavelave

Disclaimer: E le o aʻu o se inisinia, ou te le faafoliga o loʻo i ai se malamalama loloto i mea tau eletise, o le tusiga e faʻamoemoe mo amateurs pei o aʻu. O le mea moni, na ou manatu ia te aʻu lava i le lua tausaga talu ai o le au faʻasalalau. Afai na taʻu mai e se tasi ia te aʻu o faʻamaumauga i luga o se vaʻa e le masani ai e le faʻafefe e faitau, semanu ou te le faʻaaluina le tele o le taimi e suʻe ai ni fasi code i luga o le Initaneti ma fatuina tootoo i seleulu ma faʻapipiʻi lipine.

O le taulaiga o lenei tusiga o loʻo i luga o faʻamaumauga, ae le o galuega faatino, o le mea lea atonu e le lelei tele le code ma masani ona vaʻaia. O poloketi lava ia e matua faigofie lava, e ui lava e talafeagai mo se masani muamua ma le pu fou.

Ou te faʻamoemoe o laʻu tusiga o le a fesoasoani i se tasi i se tulaga tutusa o le faatofuina i le fiafia.

STM32

16 LEDs ma DM634 ma SPI

O se poloketi laʻititi e faʻaaoga ai Blue Pill (STM32F103C8T6) ma le DM634 LED avetaʻavale. I le faʻaaogaina o faʻamaumauga, o le a matou iloa ai le avetaavale, STM IO ports ma faʻapipiʻi SPI.

DM634

Taiwanese chip ma 16 16-bit PWM gaioiga, e mafai ona fesoʻotaʻi i filifili. Ole fa'ata'ita'iga 12-bit pito maualalo e iloa mai se galuega fa'apitonu'u Taga moli. I se tasi taimi, filifili i le va o le DM63x ma le lauiloa TLC5940, na ou filifilia le DM mo ni mafuaaga se tele: 1) TLC i luga o Aliexpress e mautinoa lava e pepelo, ae e le o lenei; 2) O le DM o lo'o i ai se PWM tuto'atasi ma lana lava fa'atupu fa'avevela; 3) e mafai ona faʻatau taugofie i Moscow, nai lo le faʻatali mo se pusa mai Ali. Ma, ioe, sa manaia le aʻoaʻo pe faʻafefea ona pulea le pu ia oe lava, nai lo le faʻaaogaina o se faletusi ua saunia. O chips o loʻo tuʻuina atu nei i le SSOP24 afifi; e faigofie ona faʻapipiʻi i se mea faʻapipiʻi.

Talu ai o le gaosiga o Taiwanese, fa'amatalaga ua tusia le pu i le gagana Peretania Saina, o lona uiga o le a malie. Muamua tatou te tilotilo i le pinout (Pin So'oga) ia malamalama po'o fea vae e fa'afeso'ota'i le mea, ma se fa'amatalaga o pine (Pin Faʻamatalaga). 16 pine:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
DC Sink Punavai (Tatala Alavai)

Sini / Fa'amama fa'alava – alavai; puna o le tafe mai; o le gaosiga e fesoʻotaʻi i le eleele i le tulaga malosi - o loʻo fesoʻotaʻi le LED i le avetaavale e cathodes. Ile eletise, o le mea moni, e le o se "vaivai tatala" (alavai tatala), ae i fa'amaumauga e masani ona maua lenei fa'ailoga mo pine ile ala alavai.

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Fa'asagaga i fafo i le va o REXT ma le GND e seti ai le tau o lo'o iai nei

O lo'o fa'apipi'i se mea fa'asino i le va o le pine REXT ma le eleele, lea e fa'atonutonu ai le tete'e i totonu o fa'atinoga, va'ai le kalafi i le itulau 9 o fa'amaumauga. I le DM634, o lenei tetee e mafai foi ona pulea e le polokalama, seti le malamalama atoa (susulu o le lalolagi); O le a ou le alu i auiliiliga i lenei tusiga, o le a ou tuʻuina se 2.2 - 3 kOhm resistor iinei.

Ina ia malamalama pe faʻafefea ona pulea le pu, seʻi o tatou vaʻavaʻai i le faʻamatalaga o le atinaʻe masini:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Ioe, o lea, Saina Igilisi i lona mamalu uma. O le fa'aliliuina o lenei mea o se fa'afitauli, e mafai ona e malamalama i ai pe a e mana'o ai, ae o lo'o i ai se isi auala - va'ai pe fa'apefea ona fa'amatalaina le feso'ota'iga i le TLC5940 fa'atusa tutusa i le fa'amaumauga:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
... E na o le tolu pine e manaʻomia e faʻapipiʻi ai faʻamatalaga i totonu o le masini. O le pito i luga ole faailo o le SCLK e suia ai faʻamatalaga mai le pine SIN i le resitala i totonu. A mae'a ona uta uma fa'amaumauga, ose fa'ailoga XLAT maualuga pu'upu'u e fa'apipi'i fa'asologa fa'asologa o fa'amaumauga i totonu o tusi resitala i totonu. O resitala i totonu o faitoto'a na fa'aosoina e le XLAT fa'ailoga maualuga. O fa'amatalaga uma e tu'uina atu muamua le pito sili ona taua.

Lisi – fa'amau/fa'amau/loka.
Tulaga a'e – pito muamua o le fatu
MSB muamua – pito sili ona taua (sili ona agavale) siisi agai i luma.
e fa'amaumauga uati – fa'asalalau fa'amaumauga fa'asolosolo fa'atasi (siisii ​​ma sina mea).

Le upu fono e masani ona maua i totonu o faʻamaumauga mo tupe meataalo ma faʻaliliu i auala eseese, o lea mo le malamalama o le a ou faʻatagaina aʻu lava

se polokalame fa'aa'oa'oga la'ititiO le aveta'avale LED o se tusi resitala sifi. "Sifi" (fesuiaiga) i le igoa - fa'agaoioia fa'amatalaga i totonu o le masini: o mea fou ta'itasi e tulei i totonu e tuleia ai le filifili atoa i luma i luma. Talu ai e leai se tasi e manaʻo e vaʻaia le emo le mautonu o LED i le taimi o le suiga, o le faagasologa e faia i totonu o tusi resitala e vavae ese mai tusi resitala faigaluega e se damper (fono) o se ituaiga potu faʻatali e faʻatulaga ai vaega i le faʻasologa e manaʻomia. A sauni mea uma, ona tatala lea o le tapuni ma alu ai le vaega, sui le vaega muamua. Upu fono i totonu o faʻamaumauga mo microcircuits e toetoe lava o taimi uma e faʻaalia ai se faʻamaʻi, e tusa lava po o le a le tuʻufaʻatasiga e faʻaaogaina.

O lea la, o le faʻaliliuina o faʻamatalaga i le DM634 o loʻo faʻatinoina e pei o lenei: seti le DAI faʻaoga i le tau o le pito sili ona taua o le LED mamao, toso le DCK i luga ma lalo; seti le DAI input i le tau o le isi bit, toso DCK; ma faapena ai lava seia uma ona auina atu vaega uma (uati i totonu), a maeʻa ona matou tosoina LAT. E mafai ona fai ma le lima (bit-pa), ae sili atu le faʻaogaina o se SPI faʻapitoa faʻapitoa mo lenei mea, talu ai o loʻo tuʻuina atu i luga o la matou STM32 i kopi e lua.

Pill Blue STM32F103

Folasaga: STM32 controllers e sili atu ona lavelave nai lo Atmega328 nai lo latou foliga taufaafefe. E le gata i lea, mo mafuaʻaga o le faʻaolaina o le malosi, toetoe lava o peripherals uma e tape i le amataga, ma o le taimi o le uati o le 8 MHz mai le puna i totonu. O le mea e lelei ai, na tusia e le au fai polokalame a le STM le code lea e aumaia ai le pu i luga o le 72 MHz, ma o tusitala o IDE uma ou te iloa na aofia ai i le faiga o le amataga, o lea tatou te le manaʻomia ai le uati (ae. e te mafaia pe a e mana'o moni lava). Ae e tatau ona e kiina peripheral.

Faʻamaumauga: Blue Pill ua faʻapipiʻiina ma le lauiloa STM32F103C8T6 pu, e lua pepa aoga mo ia:

I le fa'amaumauga atonu matou te fiafia i ai:

  • Pinouts - chip pinouts - i le tulaga tatou te filifili e fai laupapa i tatou lava;
  • Fa'afanua Fa'amanatu – fa'afanua manatua mo se pu fa'apitoa. O le Reference Manual o loʻo i ai se faʻafanua mo le laina atoa, ma o loʻo taʻua ai tusi resitala e le o maua e matou.
  • Pin Definitions table – lisi ai galuega autu ma isi galuega a pine; mo le "blue pill" e mafai ona e mauaina ni ata sili atu ona faigofie ile Initaneti ma se lisi o pine ma a latou galuega. O le mea lea, matou te vave google Blue Pill pinout ma taofi lenei ata i lima:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
NB: sa i ai se mea sese i le ata mai le Initaneti, lea sa maitauina i faʻamatalaga, faʻafetai mo lena mea. Ua suia le ata, ae o se lesona lenei - e sili atu le siakiina o faʻamatalaga ae le o faʻamaumauga.

Matou te aveese fa'amaumauga, tatala le Reference Manual, ma mai le taimi nei matou te fa'aaogaina na'o.
Taualumaga: matou te feagai ma faʻaoga masani / gaioiga, faʻapipiʻi le SPI, faʻapipiʻi mea e manaʻomia.

Ulufale Ulufale

I luga o le Atmega328, I / O e faʻatinoina faigofie lava, o le mea lea e mafai ai ona fenumiai le tele o filifiliga STM32. Ole taimi nei e na'o ni fa'ai'uga e mana'omia, ae e o'o fo'i i nei mea e fa filifiliga:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
alavai tatala, tulei-toso, isi tulei-toso, isi alavai tatala

"Toso-tu'i" (tulei-toso) o le gaioiga masani mai le Arduino, e mafai e le pine ona ave le tau maualuga pe maualalo. Ae fa'atasi ai ma le "vaivai tatala" e iai faigata, e ui o le mea moni e faigofie mea uma iinei:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Fa'atonuga o mea e fai / pe'ā tu'uina atu le uafu e fa'atino ai galuega: / fa'aagaoioi le fa'alava o galuega: / – alavai tatala: “0” i le resitara o galuega e mafai ai e le N-MOS, “1” i le resitara galuega e tu'u ai le uafu i le mode Hi-Z ( E le o fa'agaoioia le P-MOS ) / - fa'aoso-toso: "0" i le tusi resitala o galuega e fa'aagaoioia ai le N-MOS, "1" i le tusi resitala o galuega e fa'agaoioia ai le P-MOS.

O le eseesega uma i le va o alavai tatala (alavai tatala) mai le “tu’i-toso” (tulei-toso) o le mea lea i le pine muamua e le mafai ona talia le tulaga HIGH: pe a tusia se tasi i le tusi resitala o galuega, e alu i le tulaga maualuga maualuga (maualuga impedance, Talofa-Z). Pe a tusia le zero, o le pine e amio tutusa i auala uma e lua, e le gata i le talafeagai ma le eletise.

I le tulaga masani o galuega faatino, e na'o le fa'asalalauina e le pine mea o lo'o i totonu o le tusi resitala o galuega. I le "suiga" o loʻo faʻatonutonuina e fesoʻotaʻiga tutusa (silasila i le 9.1.4):

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Afai e fa'atulaga se pusi uafu e fai ma pine fa'atino, e fa'aletonu le resitara pine ma fa'afeso'ota'i le pine i le pine pito.

O isi galuega faatino o pine taitasi o loo faamatalaina i Uiga Uiga O lo'o iai le fa'amaumauga i luga o le ata na siiina mai. I le fesili pe o le a le mea e fai pe afai o se pine e tele isi galuega, o le tali e tuʻuina mai e se vaefaʻamatalaga i le faʻamatalaga:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Afai e tele peripheral e fa'aogaina le pine e tasi, e aloese ai mai fete'ena'iga i le va o isi galuega, e na'o le tasi le peripheral e tatau ona fa'aoga i le taimi, toggle i le fa'aogaina o le uati lautele e mafai ai (i le tusi resitala RCC talafeagai).

Ma le mea mulimuli, o pine i le tulaga fa'aulufale e iai fo'i le saoasaoa o le uati. O le isi lea mea e faʻasaoina ai le malosi; i la matou tulaga, matou te setiina i le maualuga ma galo ai.

O lea la: o loʻo matou faʻaogaina le SPI, o lona uiga e lua pine (faʻatasi ai ma faʻamaumauga ma faʻatasi ai ma se faʻailoga uati) e tatau ona avea ma "suiga faʻaoga-toso", ma le isi tasi (LAT) e tatau ona "toso masani". Ae a'o le'i tofia i latou, se'i o tatou feagai ma le SPI.

SPI

O le isi polokalame faʻaleaʻoaʻoga laiti

SPI poʻo le Serial Peripheral Interface (serial peripheral interface) o se faʻaoga faigofie ma sili ona aoga mo le faʻafesoʻotaʻi o se MK ma isi MKs ma le lalolagi i fafo i le lautele. O le mataupu faavae o lona faagaoioiga ua uma ona faamatalaina i luga, lea e uiga i le avetaavale LED Saina (i le tusi lesona, vaai vaega 25). E mafai e le SPI ona galue i le matai (“matai”) ma le pologa (“pologa”) faiga. SPI e fa auala autu, lea e le mafai ona faʻaaogaina uma:

  • MOSI, Master Output / Slave Input: o lenei pine e tuʻuina atu faʻamatalaga i le tulaga matai, ma maua faʻamatalaga i le tulaga pologa;
  • MISO, Master Input / Slave Output: i se isi itu, e maua i le matai, ma faʻasalalau i le pologa;
  • SCK, Uati Fa'asologa: fa'atulaga le tele o fa'asalalauga fa'amatalaga i le matai po'o le mauaina o se fa'ailoga uati i le pologa. E tatau ona taia pa'u;
  • SS, Slave Select: faatasi ai ma le fesoasoani a lenei auala, ua iloa e le pologa o loʻo manaʻomia se mea mai ia te ia. I luga o le STM32 ua taʻua o le NSS, lea N = leaga, i.e. e avea le pule ma pologa pe a iai le eleele i totonu o lenei alavai. E tu'ufa'atasia lelei ma le Open Drain Output mode, ae o le isi tala lena.

E pei o isi mea uma, SPI i luga ole STM32 e mauoa i galuega, lea e fai si faigata ona malamalama. Mo se faʻataʻitaʻiga, e mafai ona galue e le gata i le SPI, ae faʻapea foʻi ma le I2S interface, ma i totonu o faʻamaumauga o loʻo faʻafefiloi a latou faʻamatalaga, e tatau ona vavae ese le sili atu i se taimi talafeagai. O la matou galuega e matua faigofie lava: matou te manaʻomia le lafoina o faʻamatalaga e faʻaaoga ai naʻo le MOSI ma le SCK. Matou te o atu i le vaega 25.3.4 (faʻafesoʻotaʻi afa-duplex, fesoʻotaʻiga afa-duplex), lea matou te maua ai. 1 uati ma le 1 uaea fa'amaumauga e tasi (1 le uati fa'ailo ma le 1 tasi fa'amatalaga fa'amaumauga):

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
I lenei faiga, o loʻo faʻaogaina e le talosaga le SPI ile faʻasalalauga-naʻo pe naʻo le mauaina. / Transmit-only mode e tutusa ma le duplex mode: o faʻamatalaga e tuʻuina atu i luga o le pine transmit (MOSI i le master mode poʻo le MISO i le pologa mode), ma le pine maua (MISO poʻo le MOSI) e mafai ona faʻaaogaina e fai ma pine masani I / O . I lenei tulaga, e naʻo le talosaga e manaʻomia le le amanaʻiaina o le Rx buffer (afai e faitau, o le a leai se faʻamatalaga faʻafeiloaʻi iina).

Manaia, ole pine MISO e leai se totogi, tatou fa'afeso'ota'i le faailo LAT i ai. Seʻi o tatou vaʻavaʻai i le Slave Select, lea i luga o le STM32 e mafai ona faʻatautaia polokalame, lea e matua faigofie lava. Matou te faitau i le parakalafa o le igoa lava e tasi i le vaega 25.3.1 SPI Faʻamatalaga Lautele:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Polokalama fa'atonu NSS (SSM = 1) / Fa'amatalaga filifiliga a pologa o lo'o iai i le SSI bit o le resitala SPI_CR1. O le pine NSS fafo e tumau pea le saoloto mo isi mana'oga.

Ua o'o i le taimi e tusi ai i tusi resitala. Na ou filifili e faʻaaoga le SPI2, vaʻavaʻai mo lona tuatusi faʻavae i le faʻamaumauga - i le vaega 3.3 Faʻafanua Faʻamanatu:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Ia, tatou amata:

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

Tatala le vaega 25.3.3 faʻatasi ai ma le faʻamatalaga faʻamalamalamaga "Faʻatonu SPI i le Master Mode":

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

1. Seti le fa'asologa fa'asologa o le uati i bit BR[2:0] i le resitala SPI_CR1.

O tusi resitala o loʻo aoina i le vaega tusi faʻamatalaga o le igoa lava e tasi. Sifi tuatusi (Fa'asa'o le tuatusi) mo CR1 - 0x00, e ala i le le mafai ona faʻamama uma vaega (Toe setiina le tau 0x0000):

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

E setiina e le BR bits le vaeluaga o le uati pule, ma fuafua ai le taimi e faʻaogaina ai le SPI. O la matou STM32 o le a avea ma 72 MHz, o le avetaʻavale LED, e tusa ai ma ana faʻamaumauga, e faʻagaoioia i le tele o taimi e oʻo atu i le 25 MHz, o lea e manaʻomia ai ona matou vaevaeina i le fa (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. Seti le CPOL ma le CPHA bits e fa'amatala ai le sootaga i le va o le fa'aliliuina o fa'amatalaga ma le fa'asologa o le taimi o le uati (silasila i le ata i le itulau 240)

Talu ai o loʻo matou faitauina se faʻamatalaga iinei ae le o vaʻavaʻai i faʻataʻitaʻiga, seʻi o tatou vaʻavaʻai totoʻa i le faʻamatalaga o le CPOL ma le CPHA bits i le itulau 704 (SPI General Description):

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Vaega o le Uati ma le polarity
I le fa'aogaina o le CPOL ma le CPHA bits o le SPI_CR1 resitara, e mafai ona e fa'apolokalameina le filifilia o feso'ota'iga fa taimi. O le CPOL (clock polarity) bit e pulea le tulaga o le faailo o le uati pe a leai se faʻamatalaga o loʻo lafoina. O lenei bit e pulea le matai ma le pologa. Afai e toe setiina le CPOL, e maualalo le pine SCK ile faiga malolo. Afai e seti le CPOL bit, ole SCK pine e maualuga ile taimi malolo.
Pe a seti le CPHA (vaega o le uati), o le strobe mailei maualuga o le pito lona lua o le faailo SCK (pa'ū pe a manino le CPOL, oso aʻe pe a seti CPOL). O faʻamaumauga e puʻeina e le suiga lona lua i le faailo o le uati. Afai e manino le CPHA bit, o le pito maualuga o le mailei strobe o le pito maualuga lea o le faailo SCK (mata pa'ū pe a seti CPOL, pito maualuga pe a kilia CPOL). E maua fa'amaumauga i le suiga muamua i le fa'ailo o le uati.

I le faʻaaogaina o lenei malamalama, matou te oʻo mai i le faaiuga e tatau ona tumau uma ia mea e lua, aua Matou te mananaʻo ia tumau pea le faʻailoga SCK pe a le faʻaaogaina, ma faʻamatalaga e tuʻuina atu i luga o le pito maualuga o le pulupulu (silasila i le Ata. Rising Edge i le DM634 fa'amaumauga).

I le ala, o iinei na matou feiloai muamua ai i se vaega o upu i le ST datasheets: i totonu ia i latou o le fuaitau "toe setiina le bit i le zero" ua tusia. e toe setiina teisiae leai ia kilia teisi, pei, mo se faʻataʻitaʻiga, Atmega.

3. Seti le DFF bit e iloa ai pe o le poloka faʻamaumauga o le 8-bit poʻo le 16-bit format

Na ou ave faʻapitoa se 16-bit DM634 ina ia aua neʻi faʻalavelave i le tuʻuina atu o faʻamatalaga 12-bit PWM, pei o le DM633. E talafeagai le seti DFF i le tasi:

#define DFF         0x0800

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

4. Fa'atulaga le LSBFIRST bit i le SPI_CR1 resitala e fuafua ai le poloka poloka

LSBFIRST, e pei ona taʻu mai e lona igoa, faʻapipiʻi le faʻasalalauga ma le mea sili ona taua muamua. Ae e manaʻo le DM634 e maua faʻamatalaga e amata mai i le pito sili ona taua. O le mea lea, matou te tuʻuina atu e toe setiina.

5. I le faiga o meafaigaluega, afai e manaʻomia le faʻaogaina mai le pine NSS, faʻaoga se faailo maualuga i le pine NSS i le taimi atoa o le faʻasologa o le fesiitaiga. I le NSS software mode, seti le SSM ma SSI bits i le SPI_CR1 resitala. Afai o le pine NSS e tatau ona faʻaaogaina e fai ma gaioiga, naʻo le SSOE bit e manaʻomia ona seti.

Faʻapipiʻi le SSM ma le SSI e faʻagalo ai le NSS hardware mode:

#define SSI         0x0100
#define SSM         0x0200

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

6. E tatau ona seti le MSTR ma le SPE bits (na'o le setiina lava pe a maualuga le faailo NSS)

O le mea moni, faʻatasi ai ma nei vaega matou te faʻaigoaina le matou SPI o se matai ma faʻaalia:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI ua faʻatulagaina, seʻi o tatou tusi vave galuega e auina atu bytes i le avetaavale. Fa'aauau le faitau 25.3.3 "Fa'atulagaina le SPI i le fa'aoga matai":

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Fa'atonuga o fa'amatalaga
E amata le felauaiga pe a tusi se byte i le Tx buffer.
O le byte fa'amaumauga o lo'o fa'apipi'iina i totonu o le resitara sifi i tutusa mode (mai le pasi i totonu) i le taimi o le tuʻuina atu o le bit muamua, a maeʻa ona tuʻuina atu i fa'asologa MOSI pine mode, muamua po'o le pito mulimuli i luma e fuafua i le seti o le LSBFIRST bit i le CPI_CR1 resitala. O le fuʻa TXE e faʻatulagaina pe a uma le tuʻuina atu o faʻamatalaga mai le Tx buffer i le resitala sifi, ma fa'atupu ai fo'i se fa'alavelave pe a fa'atulaga le TXEIE bit i le CPI_CR1 resitala.

Na ou faamamafaina ni nai upu i le faaliliuga e tosina atu ai le mafaufau i se tasi o vaega o le SPI faʻatinoina i le STM controllers. I luga ole Atmega le fu'a TXE (Tx Gaogao, Tx e gaogao ma sauni e maua faʻamatalaga) e naʻo le maeʻa ona tuʻuina atu le byte atoa i fafo. Ma o iinei o le fuʻa lea e setiina pe a uma ona faʻaofi le byte i totonu o le resitala o suiga i totonu. Talu ai o loʻo tuleia iina ma mea uma i le taimi e tasi (faʻatasi), ona faʻasolosolo faʻasolosolo faʻamaumauga, ua seti le TXE aʻo leʻi tuʻuina atoa le byte. E taua lenei mea aua i le tulaga o le tatou avetaavale LED, e tatau ona tatou tosoina le pine LAT pe a uma ona lafo всех fa'amaumauga, i.e. O le fu'a TXE na'o le a le lava mo i tatou.

O lona uiga e mana'omia se isi fu'a. Sei o tatou tilotilo i le 25.3.7 - "Tulaga Fu'a":

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
<…>
Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
fu'a pisi
O le fu'a BSY ua seti ma fa'amama e meafaigaluega (tusi i ai e leai se aoga). O le fuʻa BSY o loʻo faʻaalia ai le tulaga o le SPI fesoʻotaʻiga layer.
E toe setiina:
pe a maeʻa le fesiitaiga (sei vagana ai i le master mode pe a faʻaauau le fesiitaiga)
pe a le atoatoa le SPI
pe a tula'i mai se fa'alavelave mata'utia (MODF=1)
Afai e le faʻaauau le faʻafeiloaʻiga, e kilia le fuʻa BSY i le va o faʻamatalaga taʻitasi

Lelei, o le a aoga lenei mea. Se'i tatou su'e po'o fea o iai le Tx buffer. Ina ia faia lenei mea, faitau le "SPI Data Register":

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Bits 15:0 DR[15:0] Fa'amaumauga Fa'amaumauga
Fa'amatalaga maua po'o fa'amatalaga e tu'uina atu.
O le tusi resitala o faʻamaumauga ua vaevaeina i ni paʻu e lua - tasi mo le tusitusi (transmit buffer) ma le tasi mo le faitau (receive buffer). O le tusitusi i le tusi resitala o faʻamatalaga e tusi i le Tx buffer, ma le faitau mai le resitala faʻamaumauga o le a toe faʻafoʻi ai le tau o loʻo i totonu o le Rx buffer.

Ia, ma le tulaga resitala, lea e maua ai le TXE ma le BSY fuʻa:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Matou te tusia:

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

Ia, talu ai tatou te manaʻomia le faʻasalalauina 16 taimi lua paita, e tusa ai ma le aofaʻi o gaioiga avetaʻavale LED, e pei o lenei:

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

Ae matou te le iloa pe faapefea ona toso le pine LAT, o lea matou te toe foʻi i le I/O.

Tofia pine

I le STM32F1, o tusi resitala e nafa ma le tulaga o pine e matua ese lava. E manino lava e sili atu i latou nai lo Atmega, ae e ese foi mai isi STM chips. Vaega 9.1 Fa'amatalaga Lautele ole GPIO:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Ta'itasi o fa'amoemoega lautele I/O ports (GPIO) e lua 32-bit resitara fa'atulagaina (GPIOx_CRL ma GPIOx_CRH), lua 32-bit fa'amaumauga (GPIOx_IDR ma GPIOx_ODR), se 32-bit seti/seti resitala (GPIOx_BSRR), 16-bit resitara toe setiina (GPIOx_BRR) ma se 32- resitara poloka poloka (GPIOx_LCKR).

O tusi resitala muamua e lua e le masani ai, ma e fai lava si le talafeagai, ona o le 16 port pine o loʻo salalau solo i luga o latou i se "fa bits per brother" format. O na. pine selo i le fitu o lo'o i le CRL, ae o isi o lo'o i le CRH. I le taimi lava e tasi, o isi tusi resitala o loʻo i ai ma le manuia vaega o pine uma o le taulaga - e masani ona totoe le afa "faʻaagaga".

Mo le faigofie, tatou amata mai le pito o le lisi.

Matou te le mana'omia se tusi resitala poloka.

O le seti ma le toe setiina o tusi resitala e matua malie lava ona latou te faaluaina le tasi i le isi: e mafai ona e tusia mea uma i le BSRR, lea o le maualuga 16 bits o le a toe setiina le pine i le zero, ma le pito i lalo o le a seti i le 1, pe mafai foi ona e faia. faʻaaoga le BRR, o le pito i lalo ole 16 bits e naʻo le toe setiina o le pine. Ou te fiafia i le filifiliga lona lua. O nei tusi resitala e taua aua latou te maua ai le avanoa atomic i pine:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Atomic Set po'o Toe Seti
E leai se mana'oga e fa'amalo fa'alavelave pe a fa'apolokalame GPIOx_ODR i le si'isi'i tulaga: tasi pe sili atu pusi e mafai ona suia i se fa'agaio'iga tusitusi atomika e tasi APB2. E maua lenei mea e ala i le tusia o se "1" i le seti / toe setiina le resitala (GPIOx_BSRR poʻo, mo naʻo le toe setiina, GPIOx_BRR) o le mea e manaʻomia ona suia. O isi vaega o le a tumau e le suia.

O fa'amaumauga fa'amaumauga e iai lava igoa fa'amalamalamaga - IDR = faiga Resitala Fa'atonu, tusi resitala fa'aoga; ODR = gaosiga Resitala Fa'atonu, tusi resitala galuega. Matou te le manaʻomia i latou i le poloketi o loʻo iai nei.

Ma le mea mulimuli, pulea resitala. Talu ai matou te fiafia i pine lona lua a le SPI, e taʻua o PB13, PB14 ma PB15, matou te vaʻavaʻai loa i le CRH:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Ma matou vaʻai e manaʻomia ona matou tusia se mea i ni vaega mai le 20 i le 31.

Ua uma ona matou iloa i luga aʻe o mea matou te mananaʻo mai pine, o lea o le a ou faia e aunoa ma se faʻamalama, naʻo loʻu fai atu o le MODE o loʻo faʻamaoti le itu (faʻapipiʻi pe a faʻapipiʻi uma i le 0) ma le saoasaoa o pine (matou te manaʻomia 50MHz, i.e. pine uma e lua i le "1"), ma le CNF e setiina le faiga: masani "push-pull" - 00, "alternative" - ​​10. I le faaletonu, e pei ona tatou vaʻai i luga, o pine uma e iai le tolu bit mai le pito i lalo (CNF0), na te setiina i latou i le tulaga mea faaopeopea.

Talu ai ou te fuafua e fai se isi mea i lenei vaʻa, mo le faigofie ua ou faʻamalamalamaina uma tulaga taua MODE ma CNF mo le pito i lalo ma le pito i luga.

E pei o lea

#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

O matou pine o loʻo i luga o le taulaga B (tuatusi autu - 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;

Ma, e tusa ai, e mafai ona e tusia faʻamatalaga mo LAT, lea o le a faʻafefeina e le BRR ma le BSRR resitala:

/*** 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 na'o le inertia, e fa'apea lava, tu'u pea)

O lea ua lelei mea uma, ae e le aoga. Ona o le STM32 lea, latou te faʻasaoina le eletise, o lona uiga e te manaʻomia le faʻaogaina o le faʻaogaina o peripherals manaʻomia.

Ki le uati

O le uati, e ta'ua foi o le Uati, e nafa ma le uati. Ma ua mafai ona tatou matauina le faapuupuuga RCC. Matou te suʻeina i totonu o faʻamaumauga: o le Toe Seti ma le Pulea o le Uati.

E pei ona taʻua i luga, o le mea e lelei ai, o le vaega pito sili ona faigata o le autu autu na faia mo i matou e tagata mai le STM, lea matou te faʻafetai tele ia i latou (o le a ou toe tuʻuina atu se fesoʻotaʻiga i Le upega tafaʻilagi a Di Halt, e fa'amalamalama manino ai le le mautonu). Matou te mana'omia na'o resitara e nafa ma le fa'aagaoioi o le fa'aogaina o le uati (Peripheral Clock Enable Registers). Muamua, seʻi o tatou suʻeina le tuatusi autu o le RCC, o loʻo i le amataga lava o le "Memory Map":

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

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

Ona kiliki lea i luga o le sootaga lea e te taumafai ai e suʻe se mea i totonu o le ipu, pe, sili atu, alu i faʻamatalaga o le mafai ona resitala mai vaega e uiga i mafai ona resitala. O fea tatou te maua ai le RCC_APB1ENR ma le RCC_APB2ENR:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Ma o latou, e tusa ai, o loʻo i ai vaega e aofia ai le faʻamalama o le SPI2, IOPB (I / O Port B) ma isi galuega (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;

E mafai ona maua le code mulimuli iinei.

Afai e te maua le avanoa ma le manaʻo e suʻe, faʻafesoʻotaʻi le DM634 pei o lenei: DAI i le PB15, DCK i le PB13, LAT i le PB14. Matou te faʻamalosia le avetaavale mai le 5 volts, aua nei galo e faʻafesoʻotaʻi le eleele.

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

STM8 PWM

PWM ile STM8

A o naʻo loʻu fuafuaina o lenei tusiga, na ou filifili, e fai ma faʻataʻitaʻiga, e taumafai e faʻataʻitaʻiina nisi o galuega a se vaʻa e le masani ai e faʻaaoga ai naʻo se faʻamatalaga, ina ia ou le faʻamutaina i se fai seevae e aunoa ma ni seevae. STM8 sa lelei mo lenei matafaioi: muamua, sa i ai ni nai laupapa Saina ma STM8S103, ma lona lua, e le lauiloa tele, ma o le mea lea o le faaosoosoga e faitau ma saili se fofo i luga o le Initaneti e faalagolago i le leai o nei fofo.

O loʻo iai foʻi le chip fa'amatalaga и tusi fa'asinomaga RM0016, i le muamua o loʻo i ai pinout ma resitala tuatusi, i le lona lua - mea uma. STM8 o loʻo faʻapipiʻiina i le C i se IDE mataʻutia ST Vaaiga Atiina ae.

Uati ma I/O

Ona o le faaletonu, STM8 galue i le taimi ole 2 MHz, e tatau ona faasaʻo vave.

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
HSI (High Speed ​​Internal) Uati
O le faailo o le uati o le HSI e maua mai i totonu ole 16 MHz RC oscillator ma se vaeluaga e mafai ona fa'apolokalameina (1 i le 8). O lo'o fa'atulaga i le tusi resitala vaelua o le uati (CLK_CKDIVR).
Manatua: i le amataga, o le HSI RC oscillator ma se vaeluaga o le 8 ua filifilia e avea ma punavai autu o le faailo o le uati.

Matou te mauaina le tuatusi resitala i le faʻamatalaga, le faʻamatalaga i le refman ma vaʻai e manaʻomia ona faʻamama le resitala:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Talu ai o le a tatou faʻatautaia le PWM ma faʻafesoʻotaʻi le LED, seʻi o tatou tilotilo i le pinout:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

E laʻititi le pu, e tele galuega e faʻagata i luga o pine tutusa. O le mea o lo'o i totonu o fa'amaufa'ailoga sikuea o le "alternative functionality", e fesuia'i e "option bytes" (filifiliga bytes) - o se mea e pei o Atmega fuses. E mafai ona e suia a latou tau faʻapolokalame, ae e le manaʻomia, aua O le galuega fou e faatoa fa'agaoioia pe a uma le toe fa'afouina. E sili atu ona faigofie le faʻaogaina o le ST Visual Programmer (sii mai i le Visual Develop), lea e mafai ona suia ai nei bytes. O le pinout o loʻo faʻaalia ai o pine CH1 ma CH2 o le taimi muamua o loʻo natia i puipui sikuea; e manaʻomia le setiina o le AFR1 ma le AFR0 bits i le STVP, ma o le lona lua o le a faʻafeiloaʻi ai foi le gaosiga CH1 o le taimi lona lua mai le PD4 i le PC5.

O lea la, 6 pine o le a pulea le LEDs: PC6, PC7 ma PC3 mo le taimi muamua, PC5, PD3 ma PA3 mo le lona lua.

O le setiina o pine I/O i latou lava i luga o le STM8 e sili atu ona faigofie ma sili atu ona talafeagai nai lo le STM32:

  • masani mai le tusi resitala o faʻamatalaga o Atmega DDR (Fa'amatalaga Fa'atonu Tusi Resitala): 1 = galuega faatino;
  • o le resitala muamua o le CR1, pe a gaosia, seti le faiga o le tulei-toso (1) poʻo le alavai tatala (0); talu ai ou te faʻafesoʻotaʻi le LED i le pu ma cathodes, ou te tuʻuina zeros iinei;
  • o le tusi resitala lona lua CR2, pe a gaosia, seti le saoasaoa uati: 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

PWM seti

Muamua, seʻi o tatou faʻamatalaina upu:

  • Faigamalaga PWM – fa'afia ona fa'asolo le taimi;
  • Otometi toe uta, AR - tau o le autoloadable e oʻo atu i le taimi e faitau ai (vaitaimi pusi);
  • Fa'afou mea na tupu, UEV - o se mea e tupu pe a faitau le taimi i le AR;
  • PWM Tiute Taamilosaga - PWM fa'asologa o tiute, e masani ona ta'ua o le "tulaga tiute";
  • Pu'e/Faatusatusa Tau - tau mo le pueina / faʻatusatusa, lea na faitau i ai le taimi o le a faia se mea (i le tulaga o le PWM, e fesuiaʻi le faʻailoga o le gaosiga);
  • Fuatau muamua – tau uta muamua. Faatusatusa tau e le mafai ona sui a'o tata le taimi, a leai o le a malepe le taamilosaga PWM. O le mea lea, o tau faʻasalalau fou e tuʻuina i totonu o se paʻu ma toso ese pe a oʻo le taimi i le faaiuga o lona countdown ma toe setiina;
  • Fa'aoga pito и Faiga fa'aogatotonu - faʻaogaina i luga o le tuaoi ma le ogatotonu, tutusa ma Atmel's PWM vave и Vaega-sa'o PWM.
  • OCiREF, Fa'ailoga Fa'atusa Fa'atusa - fa'asinoga fa'ailoga fa'ailoga, o le mea moni, o mea o lo'o fa'aalia i luga o le pine tutusa i le PWM mode.

E pei ona uma ona manino mai le pinout, e lua taimi e iai le malosi PWM - muamua ma le lua. E lua uma 16-bit, o le muamua e tele mea faʻaopoopo (aemaise lava, e mafai ona faitau uma i luga ma lalo). Matou te manaʻomia uma e galulue tutusa, o lea na ou filifili ai e amata i le mea e sili atu le mativa lona lua, ina ia le faʻafuaseʻi ona faʻaaogaina se mea e le o iai. O nisi faʻafitauli o le faʻamatalaga o le PWM functionality o timers uma i totonu o le tusi faʻamatalaga o loʻo i totonu o le mataupu e uiga i le taimi muamua (17.5.7 PWM Mode), o lea e tatau ai ona e oso i tua ma luma i le pepa atoa i taimi uma.

O le PWM i luga ole STM8 e iai se avanoa taua ile PWM ile Atmega:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
PWM Fa'atasi tuaoi
Fa'atonuga fa'amaumauga mai lalo i luga
O lo'o fa'agaoioi le faitauga pito i lalo pe a kilia le bit DIR i le resitara TIM_CR1
Faataitaiga:
O le faʻataʻitaʻiga e faʻaaogaina le muamua PWM mode. Ole fa'ailoga ole PWM ole OCiREF e maualuga ile umi ole TIM1_CNT <TIM1_CCRi. A leai e mana'omia se tulaga maualalo. Afai e sili atu le tau fa'atusatusa i le tusi resitala TIM1_CCRi nai lo le tau o le autoload (TIM1_ARR register), o le fa'ailoga OCiREF e taofia i le 1. Afai o le fa'atusatusaga o le 0, OCiREF o lo'o taofia ile zero....

STM8 taimi i le taimi fa'afouina mea na tupu siaki muamua faatusatusa tau, ona faatoa maua ai lea o se faailoilo faasinomaga. O le taimi muamua a Atmega e faʻafefeteina ona faʻatusatusa lea, ma iʻu ai compare value == 0 o le gaosiga o se nila, lea e tatau ona taulimaina i se auala (mo se faʻataʻitaʻiga, e ala i le faʻaogaina o le faʻaogaina o le manatu).

O le a la le mea matou te mananaʻo e fai: 8-bit PWM (AR == 255), faitau mai le pito i lalo e oo i le pito i luga, faʻaoga i le tuaoi. Talu ai o matauila o lo'o feso'ota'i atu i le pu e ala i cathodes, e tatau i le PWM ona maua le 0 (LED i luga) seia faatusatusa tau ma le 1 mulimuli ane.

Ua uma ona tatou faitau e uiga i nisi Faiga PWM, o lea matou te maua ai le resitala mana'omia o le taimi lona lua e ala i le su'esu'eina i le tusi fa'asino mo lenei fuaitau (18.6.8 - TIMx_CCMR1):

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
110: Faiga muamua PWM – pe a faitau mai le pito i lalo i le pito i luga, o le alalaupapa muamua o loʻo galue aʻo TIMx_CNT <TIMx_CCR1. A leai, o le auala muamua e le o galue. [o isi i totonu o le pepa o loʻo i ai se kopi-faʻapipiʻi sese mai le taimi 1] 111: Faiga lona lua PWM - pe a faitau mai le pito i lalo i luga, o le alalaupapa muamua e le o galue ae TIMx_CNT <TIMx_CCR1. A leai, o lo'o ola le alalaupapa muamua.

Talu ai o LED e fesoʻotaʻi atu i le MK e cathodes, o le auala lona lua e fetaui ma i matou (o le muamua foi, ae matou te le o iloa lena mea).

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Bit 3 OC1PE: Fa'aaga pine 1 mua'i uta
0: O le resitala muamua ile TIMx_CCR1 ua le mafai. E mafai ona e tusi i le TIMx_CCR1 i soo se taimi. O le tau fou e galue vave.
1: Ua mafai le resitala muamua i luga ole TIMx_CCR1. Fa'agaioiga faitau/tusi e maua le tusi resitala muamua. O le TIMx_CCR1 tau fa'amuamua e fa'aulu i totonu o le tusi resitala ata i taimi o fa'afouga ta'itasi.
*Manatua: Mo le faiga o le PWM e galue lelei, e tatau ona fa'agaoioia tusi resitala muamua. E le mana'omia lenei mea ile fa'ailoga se tasi (o le OPM bit o lo'o tu'u ile TIMx_CR1 resitala).

Lelei, ia tatou kiina mea uma tatou te manaʻomia mo alavai e tolu o le taimi lona lua:

#define TIM2_CCMR1 *(volatile uint8_t *)0x005307
#define TIM2_CCMR2 *(volatile uint8_t *)0x005308
#define TIM2_CCMR3 *(volatile uint8_t *)0x005309

#define PWM_MODE2   0x70 //PWM mode 2, 0b01110000
#define OCxPE       0x08 //preload enable

TIM2_CCMR1 = (PWM_MODE2 | OCxPE);
TIM2_CCMR2 = (PWM_MODE2 | OCxPE);
TIM2_CCMR3 = (PWM_MODE2 | OCxPE);

AR e aofia ai le lua valu-bit resitala, e faigofie mea uma:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

O le taimi lona lua e mafai ona faitau mai le pito i lalo i luga, faʻaogaina i luga o le tuaoi, e leai se mea e manaʻomia ona suia. Sei o tatou seti le vaeluaga o taimi, mo se faataitaiga, i le 256. Mo le taimi lona lua, o le vaeluaga e seti i le TIM2_PSCR resitala ma o se malosiaga e lua:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Pau lava le mea o loʻo totoe o le ki lea o faaiuga ma le taimi lona lua lava ia. O le faafitauli muamua e foia e le resitala Pu'e/Faatusatusa mafai ai ona: e lua, tolu alāvai o lo'o fa'ata'ape'apeina i luga a'e o latou asymmetrically. O iinei e mafai ai foi ona tatou iloa e mafai ona suia le polarity o le faailo, i.e. i le mataupu faavae, na mafai ona faʻaogaina le PWM Mode 1. Matou te tusia:

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

Ma le mea mulimuli, matou te amataina le taimi i le TIMx_CR1 resitala:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Sei o tatou tusia se analogue faigofie o AnalogWrite (), lea o le a faʻafeiloaʻi ai le tau moni i le taimi mo faʻatusatusaga. O tusi resitala e fa'aigoaina fa'apitoa Pu'e/Faatusatusa tusi resitala, e lua i latou mo alalaupapa ta'itasi: o le 8 bits maualalo i le TIM2_CCRxL ma le maualuga i le TIM2_CCRxH. Talu ai ua matou fatuina se 8-bit PWM, ua lava lea e tusi ai naʻo nai mea sili ona taua:

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

O le a maitauina e le tagata faitau faʻalogo o loʻo i ai se PWM laʻititi laʻititi, e le mafai ona maua le 100% faʻatumu (i le maualuga o le tau o le 255, o le faailo e fesuiaʻi mo le taamilosaga e tasi). Mo LEDs e le afaina, ma e mafai e le tagata faitau faʻalogo ona mateina pe faʻafefea ona faʻaleleia.

O le PWM i le taimi lona lua e galue, seʻi o tatou agai i luma i le muamua.

O le taimi muamua e tutusa lelei lava pusi i totonu o tusi resitala e tasi (ae na'o na vaega na tumau "fa'apolopolo" i le taimi lona lua o lo'o fa'aaogaina malosi i le muamua mo ituaiga uma o mea sili atu). O le mea lea, ua lava le suʻeina o tuatusi o resitara tutusa i le faʻamaumauga ma kopi le code. Ia, sui le tau o le vaeluaga o taimi, aua... o le taimi muamua e manaʻo e le maua se mana o le lua, ae o se tau saʻo 16-bit i le lua resitala Prescaler Maualuga и maulalo. Matou te faia mea uma ma ... e le aoga le taimi muamua. O le a le mea ua tupu?

O le faʻafitauli e mafai ona foia e ala i le vaʻavaʻai i le vaega atoa e uiga i le resitalaina o le taimi 1, lea tatou te suʻeina ai le mea e le o iai i le taimi lona lua. O le ai ai 17.7.30 Resitala malolo (TIM1_BKR), pe a iai le vaega lenei:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Fa'aaga galuega autu

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Pau lava le mea e mautinoa i le taimi nei, o le code iina.

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

STM8 Multiplex

Fa'atele i luga ole STM8

O le la'ititi lona tolu o le fa'afeso'ota'i le valu RGB LEDs i le taimi lona lua i le PWM mode ma fa'aali lanu eseese. E faʻavae i luga o le manatu o le LED multiplexing, o lona uiga afai e te ki ma tape LED i le vave, vave lava, e foliga mai ia i matou o loʻo i ai pea (tumau o le vaai, inertia o le vaaiga vaaia). Sa ou faia i se tasi taimi se mea e pei o lenei i Arduino.

O le algorithm o galuega e pei o lenei:

  • faʻafesoʻotaʻi le anode o le RGB LED muamua;
  • tutu i ai, auina atu faailoilo talafeagai i cathodes;
  • fa'atali seia mae'a le taamilosaga PWM;
  • faʻafesoʻotaʻi le anode o le lua RGB LED;
  • tutu i ai...

Ia, ma isi. O le mea moni, mo le faʻaogaina matagofie e manaʻomia le fesoʻotaʻi o le anode ma le LED e "muina" i le taimi e tasi. Ia, pe toetoe lava. I soʻo se tulaga, e manaʻomia ona matou tusia se faʻailoga e maua ai tulaga taua i laina e tolu o le taimi lona lua, suia pe a oʻo i le UEV, ma i le taimi lava e tasi e suia ai le RGB LED o loʻo galue nei.

Talu ai e otometi le fa'aliliuina o le LED, e mana'omia le faia o se "manatua vitio" lea o le a maua ai e le fa'alavelave fa'alavelave fa'amaumauga. O se fa'asologa faigofie lenei:

uint8_t colors[8][3];

Ina ia mafai ona suia le lanu o se LED patino, o le a lava le tusi o tau manaʻomia i totonu o lenei laina. Ma o le fesuiaiga o le a nafa ma le numera o le LED galue

uint8_t cnt;

Demux

Mo le fa'aopoopoina lelei, matou te mana'omia, e ese lava, se CD74HC238 demultiplexer. Demultiplexer - o se pu e faʻaogaina le faʻaogaina i meafaigaluega <<. E ala i pine e tolu (bits 0, 1 ma 2) matou te fafagaina se numera tolu-bit X, ma i le tali e faʻagaoioia ai le numera o galuega (1<<X). O fa'aoga o lo'o totoe o le pu e fa'aaogaina e fua ai le mamanu atoa. Matou te manaʻomia lenei vaʻa e le gata e faʻaitiitia ai le numera o pine o loʻo nofoia o le microcontroller, ae faʻapea foʻi mo le saogalemu - ina ia aua neʻi faʻafuaseʻi ona faʻaalia le tele o LED nai lo le mafai ma aua le mu le MK. E tasi le sene le tau o le chip ma e tatau ona teuina i taimi uma i lau kapoti vaila'au i lou fale.

O la matou CD74HC238 o le a nafa ma le tuʻuina atu o le voltage i le anode o le LED manaʻomia. I totonu o se multiplex atoatoa, o le a tuʻuina atu le voltage i le koluma e ala i le P-MOSFET, ae i lenei faʻataʻitaʻiga e mafai saʻo, aua e toso 20 mA, e tusa ai ma fa'atonuga aupito maualuga i le fa'amaumauga. Mai Pepa fa'amaumauga CD74HC238 matou te manaʻomia pinouts ma lenei pepa faʻataʻitaʻi:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
H = tulaga maualuga voltage, L = tulaga maualalo, X - e le popole

Matou te faʻafesoʻotaʻi E2 ma E1 i le eleele, E3, A0, A1 ma A3 i pine PD5, PC3, PC4 ma PC5 o STM8. Talu ai o le laulau o loʻo i luga o loʻo i ai uma tulaga maualalo ma maualuga, matou te faʻapipiʻiina nei pine e fai ma pine toso.

PWM

PWM i le taimi lona lua ua faʻatulagaina i le auala lava e tasi e pei o le tala muamua, ma lua eseesega:

Muamua, tatou te manaʻomia le faʻaogaina o le faʻalavelave Fa'afou mea na tupu (UEV) lea o le a taʻua ai se galuega e sui ai le LED galue. E faia lenei mea e ala i le suia o le bit Fa'afou Fa'alavelave Fa'aaga i se tusi resitala ma se igoa tau

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
Fa'alavelave fa'atagaina le resitala

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

O le eseesega lona lua e fesoʻotaʻi ma le faʻalavelave o le multiplexing, pei ole ghosting – fa'ase'e mumu o diodes. I la matou tulaga, atonu e foliga mai ona o le taimi, na mafua ai le faʻalavelave i luga o le UEV, o loʻo faʻaauau pea ona siaki, ma e leai se taimi o le faʻalavelave faʻalavelave e sui ai le LED aʻo leʻi amata ona tusi se mea i pine. Ina ia foia lenei mea, e tatau ona e fesuiaʻi le manatu (0 = maualuga le susulu, 255 = leai se moli) ma aloese mai le mamafa o le taamilosaga o tiute. O na. fa'amautinoa pe a mae'a le UEV e alu uma le LED mo le ta'amilosaga PWM e tasi.

Suia le polarity:

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

Aloese mai le seti o le r, g ma le b i le 255 ma manatua e fesuiai pe a faaaogaina.

Fa'alavelave

O le uiga o le faʻalavelave o le i lalo o nisi tulaga e taofi le puʻeina o le polokalama autu ma valaʻau nisi galuega i fafo. E tupu fa'alavelave ona o a'afiaga i fafo po'o totonu, e aofia ai le taimi.

Ina ua matou faia muamua se poloketi i le ST Visual Develop, faʻaopoopo i main.c matou maua se faamalama ma se faila lilo stm8_interrupt_vector.c, otometi ona aofia i totonu o le poloketi. I lenei faila, ua tofia se galuega i faʻalavelave taʻitasi NonHandledInterrupt. E tatau ona fusifusia a tatou galuega i le faʻalavelave manaʻomia.

O lo'o iai le laulau o vete fa'alavelave, lea matou te maua ai mea matou te mana'omia:

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8
13 TIM2 fa'afouga/so'o
14 TIM2 pu'e/fa'atusatusa

Matou te manaʻomia le sui o le LED i le UEV, o lea matou te manaʻomia le faʻalavelave #13.

E tusa ai, muamua, i le faila stm8_interrupt_vector.c Suia le igoa faaletonu o le galuega e nafa ma le fa'alavelave Numera 13 (IRQ13) ia oe:

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

Lona lua, e tatau ona tatou fatuina se faila main.h fa'atasi ai ma mea nei:

#ifndef __MAIN_H
#define __MAIN_H

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

Ma le mea mulimuli, tusi lenei galuega i lau 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;
}

Pau lava le mea o loʻo totoe o le mafai lea ona faʻalavelave. E faia lenei mea i le faʻaaogaina o le assembler command rim - e tatau ona e suʻeina i totonu Tusi Lesona Polokalama:

//enable interrupts
_asm("rim");

O le isi poloaiga assembler o le sim – tape fa'alavelave. E tatau ona tapeina aʻo tusia ni tau fou i le "video memory", ina ia le faʻalavelaveina le faʻalavelave i le taimi sese e le faʻaleagaina ai le laina.

Fa'ailoga uma - luga ole GitHub.

Faitau fa'amaumauga 2: SPI ile STM32; PWM, taimi ma fa'alavelave ile STM8

Afai e maua e se tasi e aoga lenei tusiga, ona ou le tusia fua lea. O le a ou fiafia e maua faʻamatalaga ma faʻamatalaga, o le a ou taumafai e tali mea uma.

puna: www.habr.com

Faaopoopo i ai se faamatalaga