Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

В te waahanga tuatahi I ngana ahau ki te korero ki nga miihini hiko arearea i tipu mai i te tarau Arduino me pehea me te take me panui ratou i nga papaarangi me etahi atu tuhinga mo nga miihiniiti. I puta mai he nui te tuhinga, no reira i oati ahau ki te whakaatu tauira whai kiko ki tetahi tuhinga motuhake. Kaati, ka kiia e ia he harore miraka...

I tenei ra ka whakaatu ahau ki a koe me pehea te whakamahi i nga papaarangi ki te whakaoti ngawari, engari e tika ana mo te maha o nga kaupapa, nga mahi i runga i te STM32 (Blue Pill) me nga kaiwhakahaere STM8. Ko nga kaupapa demo katoa e whakatapua ana ki aku rama tino pai, ka whakamaramahia e matou i roto i nga rahinga nui, ma reira ka whakamahia e matou nga momo peripheral pai katoa.

He nui ano te tuhinga, no reira mo te pai ka mahia e au nga korero:

STM32 Blue Pill: 16 LED me te taraiwa DM634
STM8: Whakaritea nga titi PWM e ono
STM8: 8 RGB LED i runga i nga titi e toru, ka haukotia

Whakakahoretanga: Ehara ahau i te miihini, kaore au e kii he matauranga hohonu ki te hikohiko, ko te tuhinga he mea mo nga runaruna penei i ahau. Ko te mea pono, i whakaaro ahau i ahau i nga tau e rua ki muri ko te hunga whakarongo. Mena i kii mai tetahi ki ahau ko nga papaaarangi i runga i tetahi maramara tauhou kaore i te mataku ki te panui, kare au e whakapau i te wa roa ki te rapu i etahi waahanga waehere i runga i te Ipurangi me te hanga tootoo me te kutikuti me te riipene whakapiri.

Ko te arotahi o tenei tuhinga kei runga i nga papaaarangi, ehara i nga kaupapa, no reira kare pea te waehere i te tino pai, i te nuinga o te wa ka kuiti. He tino ngawari nga kaupapa, ahakoa he pai mo te mohio tuatahi ki te maramara hou.

Te ti'aturi nei au ka awhina taku tuhinga i tetahi i te ahua rite o te ruku ki roto i te whakangahau.

STM32

16 LED me DM634 me SPI

He kaupapa iti e whakamahi ana i te Blue Pill (STM32F103C8T6) me te taraiwa LED DM634. Ma te whakamahi i nga papaarangi, ka tirohia e matou te taraiwa, nga tauranga STM IO me te whirihora i te SPI.

DM634

Ko te maramara Taiwanese me nga putanga PWM 16 16-bit, ka taea te hono ki nga mekameka. Ko te tauira iti-mutunga 12-bit e mohiotia ana mai i tetahi kaupapa whare Puke Maama. I tetahi wa, ko te whiriwhiri i waenga i te DM63x me te TLC5940 rongonui, i whiriwhiria e ahau a DM mo etahi take: 1) Ko te TLC i runga i Aliexpress he tino rūpahu, engari ehara tenei; 2) He PWM motuhake a DM me tana ake kaihanga auau; 3) ka taea te hoko iti i Moscow, kaua ki te tatari mo tetahi peera mai ia Ali. Ae ra, he pai ki te ako me pehea te whakahaere i te maramara i a koe ano, kaua ki te whakamahi i te whare pukapuka kua rite. Ko nga maramara kua whakaatuhia inaianei ki roto i te kete SSOP24; he ngawari ki te hoko ki tetahi urutau.

I te mea ko Taiwanese te kaihanga, papararaunga kua tuhia te maramara ki te reo Hainamana Ingarihi, ko te tikanga ka ngahau. Tuatahi ka titiro tatou ki te pinout (Hononga Pin) kia mohio ko wai te waewae hei hono ki te aha, me te whakaahuatanga o nga titi (Whakaahuatanga Pin). 16 titi:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Nga Puna Totohu DC (Whakatuwheratia)

Korohū / Putanga tuwhera-whakaheke – whakaheke; puna o te ia e rere ana; hono te putanga ki te whenua i roto i te āhua kaha - hono nga LED ki te taraiwa e cathodes. Ko te tikanga, ehara tenei i te "whakawai tuwhera" (puna wai tuwhera), engari kei roto i nga papaarangi ka kitea tenei tohu mo nga titi i te aratau wairere.

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Nga parenga o waho i waenga i te REXT me te GND hei tautuhi i te uara o naianei

Ka whakauruhia he parenga tohutoro ki waenga i te titi REXT me te papa, e whakahaere ana i te parenga o roto o nga putanga, tirohia te kauwhata kei te wharangi 9 o te papaaarangi. I roto i te DM634, ka taea hoki te whakahaere i tenei parenga e te rorohiko, te whakarite i te kanapa katoa (wherikotanga o te ao); Kaore au e korero mo nga korero i roto i tenei tuhinga, ka tukuna noa e ahau he parenga 2.2 - 3 kOhm ki konei.

Kia mohio koe me pehea te whakahaere i te maramara, me titiro ki te whakaahuatanga o te atanga taputapu:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Ae, tenei, Hainamana Ingarihi me tona kororia katoa. Ko te whakamaoritanga he raru tenei, ka mohio koe ki te hiahia koe, engari he huarahi ano - tirohia me pehea te whakaahuatanga o te hononga ki te TLC5940 e rite ana ki te mahi i roto i te papanga raraunga:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
... E toru noa nga titi hei whakauru raraunga ki te taputapu. Ko te piki ake o te tohu SCLK ka huri i nga raraunga mai i te titi SIN ki te rehita o roto. Whai muri i te utaina o nga raraunga katoa, ka herea e te tohu XLAT teitei poto nga raraunga kua whakawhitia ki roto i nga rehita o roto. Ko nga rehita o roto ko nga keeti na te taumata tohu XLAT. Ko nga raraunga katoa ka tukuna i te tuatahi.

Pato – raka / raka / raka.
Mata maranga – te mata matua o te pupuhi
MSB tuatahi – moka whakamua nui (tino maui).
ki te karaka raraunga – tuku raraunga raupapa (bit i te moka).

Ko te kupu poti he maha nga wa ka kitea i roto i nga tuhinga mo nga maramara ka whakamaoritia i roto i nga momo huarahi, na mo te maarama ka whakaae ahau

he kaupapa ako itiKo te taraiwa LED he rehita neke. "Huri" (neke) i roto i te ingoa - te neke mokamoka o nga raraunga i roto i te taputapu: ko ia moka hou ka kuia ki roto ka pana te mekameka katoa ki mua. I te mea karekau he tangata e pirangi ki te kite i te kimo o nga rama rama i te wa o te neke, ka mahia te mahi i roto i nga rehita papaa i wehea mai i nga rehita mahi e te kaitao (poti) he momo rūma tatari ka whakaritea nga paraire ki te raupapa e hiahiatia ana. Ka rite nga mea katoa, ka tuwhera te marumaru ka haere nga paraka ki te mahi, ka whakakapi i te puranga o mua. Kupu poti i roto i nga tuhinga mo nga microcircuits tata tonu e kii ana i te whakamaarama pera, ahakoa he aha nga huinga e whakamahia ana.

Na, ko te whakawhiti raraunga ki te DM634 ka mahia penei: tautuhi i te whakauru DAI ki te uara o te moka tino nui o te LED tawhiti, toia te DCK ki runga, ki raro; tautuhia te whakauru DAI ki te uara o te moka e whai ake nei, toia te DCK; me te pera ano kia tukuna nga moka katoa (karaka i roto), muri iho ka toia e matou te LAT. Ka taea te mahi a-ringa (bit-bang), engari he pai ake ki te whakamahi i tetahi atanga SPI kua whakaritea mo tenei, na te mea kua whakaatuhia ki runga i ta maatau STM32 i nga kape e rua.

Pire Kahurangi STM32F103

Kupu Whakataki: Ko nga kaiwhakahaere STM32 he tino uaua ake i a Atmega328 i te ahua whakamataku. I tua atu, mo nga take o te penapena hiko, tata katoa nga peripheral kua whakawetohia i te timatanga, a ko te auau karaka he 8 MHz mai i te puna o roto. Waimarie, i tuhia e nga kaiwhakaputa STM he waehere e kawe ana i te maramara ki runga ki te 72 MHz "kua tatau", a ko nga kaituhi o nga IDE katoa e mohio ana ahau i whakauruhia ki roto i te tikanga arataki, no reira kaore e tika kia karaka (engari. ka taea e koe ki te tino hiahia koe). Engari me tahuri koe ki te whakahuri i nga taputapu.

Tuhituhi: Ko te Pire Kahurangi kua whakauruhia ki te maramara STM32F103C8T6 rongonui, e rua nga tuhinga whai hua mo taua mea:

I roto i te papaaarangi ka aro pea tatou ki:

  • Pinouts – chip pinouts – in the case we decided to make the boards own;
  • Mahere Mahara – mapi mahara mo tetahi maramara motuhake. He mapi ta te pukapuka Tohutoro mo te rarangi katoa, ka whakahuahia nga rehita karekau i a matou.
  • Ripanga Whakamaramatanga Pin – whakarārangihia nga mahi matua me nga mahi rereke o nga titi; mo te "pire puru" ka kitea e koe etahi pikitia pai ake i runga i te Ipurangi me te rarangi o nga titi me o raatau mahi. No reira, ka mau tonu matou ki te Google Blue Pill pinout ka pupuri tonu i tenei pikitia:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
NB: he hapa i te pikitia mai i te Ipurangi, i tuhia i roto i nga korero, me mihi ki a koe. Kua whakakapihia te pikitia, engari he akoranga tenei - he pai ake te tirotiro i nga korero kaua mai i nga papaarangi.

Ka tangohia e matou te papaaarangi, ka whakatuwherahia te pukapuka Tohutoro, a mai i tenei wa ka whakamahia noa e matou.
Tikanga: ka mahi matou ki te whakauru / putanga paerewa, whirihora i te SPI, huri i nga taputapu e tika ana.

Putanga Whakauru

I runga i te Atmega328, he tino ngawari te whakatinana I/O, na reira ka raru te tini o nga whiringa STM32. Inaianei kei te hiahia tatou ki nga whakatau, engari e wha nga whiringa:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
puna wai tuwhera, pana-toia, pana-putanga rereke, wairere tuwhera rereke

"Toia-pana" (pana-toia) Ko te putanga o mua mai i te Arduino, ka taea e te titi te tango i te uara, HIGH, ITI ranei. Engari me te "whakawai tuwhera" kei reira nga uauatanga, ahakoa he mea ngawari nga mea katoa i konei:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Te whirihoranga putanga / i te wa ka tohua te tauranga ki te whakaputa: / ka whakahoehia te aukati whakaputa: / – aratau wairere tuwhera: "0" i roto i te rehita whakaputa ka taea te N-MOS, "1" i roto i te rehita whakaputa ka waiho te tauranga i te aratau Hi-Z ( Kaore te P-MOS i whakahohe ) / – aratau pana-pull: "0" i roto i te rehita putanga ka whakahohe i te N-MOS, "1" i te rehita whakaputa ka whakahohe i te P-MOS.

Ko nga rereketanga katoa i waenga i te awa tuwhera (puna wai tuwhera) mai i te “pupuhi-pull” (pana-toia) Ko te mea i te titi tuatahi kaore e taea te whakaae ki te ahua HIGH: ka tuhi tetahi ki te rehita whakaputa, ka uru ki te aratau aukati teitei (impedance teitei, Hi-Z). I te tuhi kore, he rite te ahua o te titi i roto i nga tikanga e rua, ma te arorau me te hiko.

I roto i te aratau whakaputa noa, ka whakapaoho noa te titi i nga ihirangi o te rehita whakaputa. I roto i te "rereke" kei te whakahaeretia e nga taputapu e rite ana (tirohia te 9.1.4):

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Ki te whirihorahia he moka tauranga hei pine mahi rereke, ka monokia te rehita pine, ka hono te titi ki te titi peripheral.

Ko nga mahi rereke o ia titi e whakaahuatia ana i roto Whakamahinga Pin Ko te papaaarangi kei runga i te ahua kua tangohia. Ki te patai he aha te mahi mena he maha nga mahi rereke o te titi, ka tukuna mai te whakautu ma te tuhi i raro i te papararaunga raraunga:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Mēnā he maha ngā peripheral e whakamahi ana i te titi kotahi, hei karo i te taupatupatu i waenga i nga mahi rereke, me whakamahi kia kotahi noa te peripheral i te wa kotahi, ka takahurihia ma te whakamahi i te moka taea te karaka peripheral (kei te rehita RCC e tika ana).

Ka mutu, he tere karaka ano nga titi i te aratau whakaputa. Koinei tetahi atu waahanga whakaora hiko; i roto i ta maatau, ka whakatauhia e matou ki te teitei ka warewarehia.

Na: kei te whakamahi matou i te SPI, ko te tikanga ko nga titi e rua (me nga raraunga me te tohu karaka) me "mahi pana-pull rereke", me tetahi atu (LAT) me "te pana-pull auau". Engari i mua i te tohatoha i a raatau, me mahi ki te SPI.

SPI

Ko tetahi atu kaupapa ako iti

Ko te SPI, ko te Serial Peripheral Interface ranei (atanga papaarangi raupapa) he atanga ngawari me te tino whai hua mo te hono i tetahi MK ki etahi atu MK me te ao o waho i te nuinga. Ko te kaupapa o tana mahi kua korerohia i runga ake nei, kei hea mo te taraiwa LED Hainamana (i roto i te pukapuka tohutoro, tirohia te waahanga 25). Ka taea e SPI te mahi i roto i te aratau ariki ("rangatira") me te taurekareka ("pononga"). E wha nga hongere taketake a SPI, kaore e taea te whakamahi katoa:

  • MOSI, Kaiwhakaako Putanga / Whakauru Taurekareka: ka tukuna e tenei titi nga raraunga i roto i te aratau rangatira, ka whiwhi raraunga i te aratau pononga;
  • MISO, Kaiwhakaako Whakauru / Putanga Taonga: engari, ka riro i roto i te rangatira, ka tukuna ki roto i te pononga;
  • SCK, Karaka Rangatū: ka tautuhi i te auau o te tuku raraunga i roto i te rangatira, ka whiwhi tohu karaka ranei i roto i te taurekareka. Ko te tino patu patu;
  • SS, Slave Select: me te awhina o tenei hongere, ka mohio te pononga kei te hiahia tetahi mea mai ia ia. I runga i te STM32 ka kiia ko NSS, kei reira ko N = kino, i.e. ka noho taurekareka te kaiwhakahaere mena he whenua kei roto i tenei hongere. He pai te hono ki te aratau Whakaputa Whakatuwhera, engari he korero ano tera.

Pērā i era atu mea katoa, he nui te mahi a SPI i runga i te STM32, he uaua ki te maarama. Hei tauira, ka taea e ia te mahi me te SPI anake, engari me te atanga I2S, a, i roto i nga tuhinga ka whakauruhia o raatau whakaahuatanga, he mea tika kia tapahia te taapiri i te waa. He tino ngawari ta maatau mahi: me tuku raraunga ma te whakamahi i te MOSI me te SCK anake. Ka haere matou ki te waahanga 25.3.4 (whakawhitiwhiti-hawhe-rua, whakawhitiwhiti-hawhe-rua), ka kitea e matou 1 karaka me te 1 waea raraunga kotahitanga (1 tohu karaka me te roma raraunga kotahitanga):

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
I tenei aratau, ka whakamahia e te tono te SPI i roto i te aratau tuku-anake, whiwhi-anake ranei. / Ko te aratau tuku-anake he rite ki te aratau taarua: ka tukuna nga raraunga ki runga i te titi tuku (MOSI i roto i te aratau ariki, i te MISO ranei i te aratau pononga), ka taea te whakamahi i te pine whiwhi (MISO, MOSI ranei) hei titi I/O auau . I tenei keehi, me wareware noa te tono ki te Rx buffer (mehemea ka panuitia, kaore he raraunga whakawhiti ki reira).

He rawe, he kore utu te titi MISO, me hono atu te tohu LAT ki a ia. Me titiro ki te Slave Select, kei runga i te STM32 ka taea te whakahaere ma te hotaka, he tino watea. Ka panuihia e matou te waahanga o te ingoa kotahi i te waahanga 25.3.1 SPI Whakaahuatanga Whanui:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Mana pūmanawa NSS (SSM = 1) / Ko nga korero whiriwhiringa pononga kei roto i te moka SSI o te rehita SPI_CR1. Ko te titi NSS waho ka noho kore utu mo etahi atu hiahia tono.

Kua tae ki te wa ki te tuhi ki nga rehita. I whakatau ahau ki te whakamahi i te SPI2, tirohia tona wahitau turanga i roto i te papaaarangi - i te waahanga 3.3 Mahere Mahara:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Ana, me timata tatou:

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

Whakatuwherahia te waahanga 25.3.3 me te taitara whakamaarama whaiaro "Whakaritea SPI i roto i te Aratau Matua":

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

1. Tautuhia te auau karaka rangatū me nga paraka BR[2:0] ki te rehita SPI_CR1.

Ka kohia nga rehita ki te waahanga pukapuka tohutoro o taua ingoa. Huringa Wāhitau (Wāhitau wāhikē) mo CR1 – 0x00, ma te taunoa ka whakawāteahia ngā moka katoa (Tautuhi uara 0x0000):

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Ka tautuhia e nga paraka BR te kaiwehewehe karaka karaka, na reira ka whakatau i te auau e mahi ai te SPI. Ko ta tatou auau STM32 ka 72 MHz, ko te taraiwa LED, e ai ki ana paparangi raraunga, ka mahi me te auau o te 25 MHz, no reira me wehewehe e wha (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. Tautuhia nga paraka CPOL me CPHA hei tautuhi i te hononga i waenga i te whakawhiti raraunga me te wa karaka rangatū (tirohia te hoahoa i te wharangi 240)

I te mea kei te panui tatou i tetahi papaaarangi i konei kaore e titiro ki nga hoahoanga, me ata titiro ki te whakamaarama tuhinga mo nga moka CPOL me te CPHA kei te wharangi 704 (SPI Whakaahuatanga Whanui):

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Wāhanga karaka me te polarity
Ma te whakamahi i nga moka CPOL me te CPHA o te rehita SPI_CR1, ka taea e koe te kowhiri i nga hononga wa e wha. Ko te moka CPOL (polarity karaka) e whakahaere ana i te ahua o te tohu karaka karekau he raraunga e tukuna ana. Ma tenei moka e whakahaere nga tikanga rangatira me te taurekareka. Mena kua tautuhia te CPOL, he iti te titi SCK i te aratau okiokinga. Mena kua tautuhia te moka CPOL, he tiketike te titi SCK i te aratau okiokinga.
Ina tautuhia te moka CPHA (waahanga karaka), ko te mahanga moka teitei ko te tapa tuarua o te tohu SCK (ka taka mena he maamaa te CPOL, ka piki mena ka whakatauhia te CPOL). Ko nga raraunga ka mau i te huringa tuarua o te tohu karaka. Mēnā he mārama te moka CPHA, ko te mahanga moka teitei ko te tapa piki o te tohu SCK (te tapa takahanga mena kua whakaritea te CPOL, te taha piki ki te whakawāteahia te CPOL). Ka mau nga raraunga i te huringa tuatahi o te tohu karaka.

I te tango i enei matauranga, ka tae ki te whakatau me noho kore nga paraka e rua, na te mea Kei te pirangi matou kia noho iti te tohu SCK ki te kore e whakamahia, ka tukuna nga raraunga ki te taha piki ake o te pupuhi (tirohia te Fig. Rising Edge kei roto i te papaaarangi DM634).

I te ara, i konei ka tutaki tuatahi matou i tetahi ahuatanga o te kupu i roto i nga papaarangi ST: kei roto i a raatau te kupu "whakahou i te moka ki te kore" ka tuhia. ki te tautuhi mokaa kaore ki te whakawātea paku, penei, hei tauira, Atmega.

3. Tautuhia te moka DFF ki te whakatau mehemea he 8-bit, 16-bit ranei te paraka raraunga

I tangohia e ahau he 16-bit DM634 kia kore ai e raru ki te tuku raraunga PWM 12-bit, penei i te DM633. He mea tika ki te tautuhi i te DFF ki tetahi:

#define DFF         0x0800

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

4. Whirihorahia te moka LSBFIRST i te rehita SPI_CR1 hei whakatau i te whakatakotoranga poraka

Ko te LSBFIRST, e ai ki tona ingoa, ka whirihora i te tuku me te moka iti rawa i te tuatahi. Engari kei te hiahia a DM634 ki te whiwhi raraunga mai i te mea tino nui. Na reira, ka waiho maatau kia tautuhi ano.

5. I roto i te aratau taputapu, ki te hiahiatia te whakauru mai i te titi NSS, tono he tohu teitei ki te titi NSS i roto i te raupapa whakawhiti paita katoa. I roto i te aratau rorohiko NSS, tautuhia nga paraka SSM me SSI ki te rehita SPI_CR1. Mena ka whakamahia te titi NSS hei putanga, ko te moka SSOE anake me tautuhi.

Tāutahia te SSM me te SSI kia warewarehia te aratau taputapu NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Me whakarite nga moka MSTR me te SPE (ka noho tonu mena he teitei te tohu NSS)

Inaa, ma enei moka ka tohua to maatau SPI hei rangatira ka whakahurihia:

#define MSTR        0x0004
#define SPE         0x0040

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

Kua whirihorahia te SPI, me tuhi tonu nga mahi e tuku paita ki te taraiwa. Haere tonu ki te panui 25.3.3 "Whakawhirihora SPI i roto i te aratau matua":

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Te raupapa whakawhiti raraunga
Ka timata te tuku ina tuhia he paita ki te Tx buffer.
Ka utaina te paita raraunga ki te rehita nekehanga i whakarara aratau (mai i te pahi o roto) i te wa e tukuna ana te moka tuatahi, muri iho ka tukuna atu ki raupapa Ko te aratau pine MOSI, moka tuatahi, moka whakamutunga ranei ki mua i runga i te tautuhinga o te moka LSBFIRST i te rehita CPI_CR1. Ka tautuhia te haki TXE i muri i te tuku raraunga mai i te Tx buffer ki te rehita nuku, ka whakaputa ano hoki i te haukoti mena ka whakaritea te moka TXEIE i te rehita CPI_CR1.

I whakanuia e ahau etahi kupu i roto i te whakamaoritanga hei kukume i te aro ki tetahi ahuatanga o te whakatinanatanga SPI i roto i nga kaiwhakahaere STM. I Atmega te haki TXE (Tx Putua, Kei te putua a Tx kua reri ki te whiwhi raraunga) ka tautuhia i muri i te tukunga o te paita katoa puta. Na konei ka whakatakotoria tenei haki i muri i te whakaurunga o te paita ki roto i te rehita nekehanga o roto. I te mea ka panaia ki reira me nga moka katoa i te wa kotahi (he whakarara), katahi ka whakawhitia nga raraunga, ka whakatakotohia te TXE i mua i te tukunga katoa o te paita. He mea nui tenei na te mea i roto i te take o to tatou taraiwa LED, me toia e matou te titi LAT i muri i te tuku всех raraunga, i.e. Ko te haki TXE anake e kore e ranea mo tatou.

Ko te tikanga ka hiahia tatou ki tetahi haki. Ka titiro tatou ki te 25.3.7 - “Ngā Kara Tūnga”:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
<…>
Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
haki pukumahi
Kua tautuhia te haki BSY ka whakawāteahia e te taputapu (kaore he painga o te tuhi ki a ia). Ko te haki BSY e tohu ana i te ahua o te paparanga korero SPI.
Ka tautuhi ano:
ka oti te whakawhitinga (haunga i te aratau matua mena kei te haere tonu te whakawhiti)
ka monokia te SPI
ka puta he hapa aratau matua (MODF=1)
Mena kaore i te haere tonu te whakawhitinga, ka whakakorehia te haki BSY i waenga i ia whakawhitinga raraunga

Ka pai, ka whai hua tenei. Me rapu tatou kei hea te Tx buffer. Ki te mahi i tenei, panui "Rēhita Raraunga SPI":

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Paraka 15:0 DR[15:0] Rēhita Raraunga
Ko nga raraunga ka riro mai, ka tukuna ranei nga raraunga.
Kua wehea te rehita raraunga kia rua nga parepare - kotahi mo te tuhi (tuku papaa) me tetahi mo te panui (rihii te paanui). Ko te tuhi ki te rehita raraunga ka tuhi ki te Tx buffer, me te panui mai i te rehita raraunga ka hoki mai te uara kei roto i te Rx buffer.

Ana, me te rehita mana, kei reira nga haki TXE me BSY ka kitea:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Ka tuhi matou:

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

Ana, na te mea me tuku 16 nga wa e rua nga paita, kia rite ki te maha o nga putanga taraiwa LED, penei:

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

Engari kare ano matou e mohio ki te toia te titi LAT, no reira ka hoki ano matou ki te I/O.

Tautapa titi

I roto i te STM32F1, ko nga rehita te kawenga mo te ahua o nga titi he rerekee. E marama ana he maha ake o raatau i a Atmega, engari he rereke ano ki etahi atu maramara STM. Wāhanga 9.1 Whakamārama whānui o GPIO:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Ia o nga tauranga I/O kaupapa whanui (GPIO) e rua nga rehita whirihoranga 32-bit (GPIOx_CRL me GPIOx_CRH), e rua nga rehita raraunga 32-bit (GPIOx_IDR me GPIOx_ODR), he rehita huinga-32-bit/reset (GPIOx_BSRR), he rehita tautuhi 16-bit (GPIOx_BRR) me te 32- rehita aukati moka (GPIOx_LCKR).

Ko nga rehita tuatahi e rua he rerekee, he tino whakararu hoki, na te mea ka marara nga titi tauranga 16 puta noa i a raatau i roto i te whakatakotoranga "e wha moka mo ia tuakana". Ko era. Ko nga titi kore ki te whitu kei te CRL, ko te toenga kei te CRH. I taua wa ano, kei roto i nga rehita e toe ana nga moka o nga titi katoa o te tauranga - i te nuinga o te wa ka toe te haurua "kua rahuitia".

Mo te ngawari, me timata mai i te mutunga o te rarangi.

Kaore e hiahiatia he rehita aukati.

He tino rorirori te huinga me te tautuhi i nga rehitatanga na te mea ka takirua tetahi ki tetahi: ka taea e koe te tuhi i nga mea katoa i roto i te BSRR anake, kei reira nga moka 16 teitei ake ka tautuhi i te titi ki te kore, ko nga mea iti ka whakatauhia ki te 1, ka taea ranei e koe. whakamahia te BRR, ko nga moka iti 16 ka tautuhi ano i te titi. He pai ki ahau te whiringa tuarua. He mea nui enei rehita na te mea e whakarato ana i te urunga ngota ki nga titi:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Tautuhi Atomic ranei Tautuhi
Kaore he take ki te whakakore i nga haukoti i te wa e whakahoahoa ana te GPIOx_ODR i te taumata moka: kotahi, neke atu ranei nga paraka ka taea te whakarereke me te mahi tuhi ngota kotahi APB2. Ka tutuki tenei ma te tuhi i te "1" ki te rehita huinga / tautuhi (GPIOx_BSRR ranei, mo te tautuhi anake, GPIOx_BRR) o te moka me whakarereke. Ko etahi atu moka ka noho kore e rereke.

Ko nga rehita raraunga he ingoa tino whakamarama ake - IDR = tāuru Rehita Aratohu, rehita whakauru; ODR = huaputa Rehita Ahunga, rehita putanga. Kare e hiahiatia e matou i roto i te kaupapa o naianei.

Ka mutu, ko nga rehita whakahaere. I te mea kei te pirangi matou ki nga titi SPI tuarua, ara PB13, PB14 me PB15, ka titiro tonu matou ki te CRH:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Na ka kite tatou me tuhi tetahi mea mai i te 20 ki te 31.

Kua whakatauhia e matou i runga ake nga mea e hiahia ana matou mai i nga titi, no reira ka mahia e au me te kore he whakaahua, ka kii noa ahau ko te MODE te tohu i te ahunga (whakauru mena ka whakatauhia nga paraka e rua ki te 0) me te tere pine (me 50MHz, ara. e rua nga titi ki te "1"), ka whakatauhia e CNF te aratau: "pana-pull" auau - 00, "rereke" - 10. Ma te taunoa, ka kitea i runga ake nei, kei nga titi katoa te moka tuatoru mai i raro (CNF0), ka whakatakotohia ki te aratau tāuru mānu.

I te mea ka whakamahere ahau ki te mahi i tetahi atu mea me tenei maramara, mo te ngawari kua tautuhia e ahau nga uara MODE me te CNF mo nga rehita mana o raro me runga.

Te ahua penei

#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

Ko o matou titi kei te tauranga B (te wahitau turanga - 0x40010C00), waehere:

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

Na, ka taea e koe te tuhi whakamaramatanga mo te LAT, ka whakakorikoria e nga rehita BRR me BSRR:

/*** LAT pulse – high, then low */
#define LAT_pulse() _PORTB_(_BSRR) = (1<<14); _PORTB_(_BRR) = (1<<14)

#define LAT_low() _PORTB_(_BRR) = (1<<14)

(LAT_low ma te inertia noa, he pera tonu, kia noho tonu)

Inaianei he pai nga mea katoa, engari kaore e mahi. Na te mea ko te STM32 tenei, ka penapena hiko, ko te tikanga me whakaahei koe ki te karaka o nga peripheral e hiahiatia ana.

Whakakāhia te karaka

Ko te mataaratanga, e mohiotia ana ko te Karaka, te kawenga mo te karaka. A ka taea e taatau te kite i te whakapototanga RCC. Ka tirohia e matou i roto i nga tuhinga: ko te Tautuhi me te Mana Karaka tenei.

I korerohia i runga ake nei, Waimarie, ko te wahanga tino uaua o te kaupapa karaka i mahia mo matou e nga tangata o STM, ka nui te mihi ki a ratou (katahi ano ka hoatu e ahau he hononga ki paetukutuku a Di Halt, kia marama ai te rangiruatanga). Ko nga rehita anake e hiahia ana matou ki te whakamana i te karaka peripheral (Peripheral Clock Enable Registers). Tuatahi, me kimihia te wahitau turanga o te RCC, kei te timatanga o te "Mahere Mahere":

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

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

Na ka paato i te hono ka ngana koe ki te kimi i tetahi mea kei roto i te pereti, he pai ake ranei, haere ki nga whakaahuatanga o nga rehita whakaahei mai i nga waahanga mo whakahohea nga rehita. Ka kitea e matou te RCC_APB1ENR me te RCC_APB2ENR:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Na, kei roto i a raatau nga waahanga kei roto ko te karaka o te SPI2, IOPB (I/O Port B) me etahi atu mahi (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;

Ka kitea te waehere whakamutunga konei.

Mena kei a koe te whai waahi me te hiahia ki te whakamatautau, honoa te DM634 penei: DAI ki PB15, DCK ki PB13, LAT ki PB14. Ka tukuna e matou te taraiwa mai i te 5 volts, kaua e wareware ki te hono i nga papa.

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

STM8 PWM

PWM i runga i te STM8

I te wa e whakamahere noa ana ahau i tenei tuhinga, i whakatau ahau, hei tauira, ki te ngana ki te whakahaere i etahi mahi o te maramara tauhou ma te whakamahi noa i te papaaarangi, kia kore ai ahau e mutu ki te hanga hu me te kore hu. Ko te STM8 he pai mo tenei mahi: tuatahi, he tokorua nga papa Hainamana me STM8S103, tuarua, kaore i te tino rongonui, na reira ko te whakamatautau ki te panui me te rapu otinga i runga i te Ipurangi kei runga i te kore o enei tino otinga.

Kei te maramara hoki papararaunga и pukapuka tohutoro RM0016, i roto i te tuatahi he pinout me te rehita wahitau, i te tuarua - nga mea katoa. Ko te STM8 kua whakaritea ki C i roto i te IDE whakamataku ST Whakawhanake Ataata.

Karaka me te I/O

Ma te taunoa, ka mahi a STM8 i te auau o te 2 MHz, me whakatika tonu tenei.

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
HSI (High Tere Roo) Karaka
Ko te tohu karaka HSI i ahu mai i te oscillator RC 16 MHz o roto me te whakawehe programmable (1 ki te 8). Ka whakatakotoria ki te rehita wehewehe karaka (CLK_CKDIVR).
Tuhipoka: i te timatanga, ka tohua he oscillator HSI RC me te wehenga o te 8 hei puna matua mo te tohu karaka.

Ka kitea e matou te wahitau rehita kei roto i te papaaarangi, te whakaahuatanga i roto i te refman me te kite me whakakorehia te rehita:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

I te mea ka whakahaerehia e matou te PWM me te hono i nga rama, me titiro ki te pinout:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

He iti te maramara, he maha nga mahi e whakatarewa ana i runga i nga titi kotahi. Ko nga mea kei roto i nga taiapa tapawha ko te "taumahinga rereke", ka hurihia e "paita whiringa" (paita kōwhiringa) – he rite ki te Atmega fuses. Ka taea e koe te whakarereke i o raatau uara ma te papatono, engari kaore e tika ana, na te mea Ka whakahohehia te mahi hou i muri i te whakaara ano. He ngawari ake te whakamahi i te ST Visual Programmer (kua tangohia me te Visual Develop), ka taea te whakarereke i enei paita. E whakaatu ana te pinout kei te huna nga titi CH1 me CH2 o te wa tuatahi ki roto i nga taiapa tapawha; he mea tika ki te tautuhi i nga moka AFR1 me te AFR0 ki STVP, me te tuarua ka whakawhiti ano i te putanga CH1 o te wa tuarua mai i te PD4 ki te PC5.

No reira, e 6 nga titi ka whakahaere i nga rama: PC6, PC7 me PC3 mo te wa tuatahi, PC5, PD3 me PA3 mo te tuarua.

Ko te whakarite i nga titi I/O ki runga i te STM8 he maamaa ake, he arorau ake i te STM32:

  • taunga mai i te rehita ahunga raraunga a Atmega DDR (Rehita Aratohu Raraunga): 1 = putanga;
  • ko te rehita mana tuatahi CR1, ka puta, ka tautuhi i te aratau pana-kumea (1) ranei tuwhera awa (0); i te mea ka honoa e ahau nga rama ki te maramara me nga cathodes, ka waiho e ahau nga kore ki konei;
  • ko te rehita mana tuarua ko CR2, ka puta, ka tautuhi te tere karaka: 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

Tautuhinga PWM

Tuatahi, me tautuhi i nga kupu:

  • Auahatanga PWM – te auau e tohu ana te matawā;
  • Uta-aunoa, AR – uara ka taea te utaina ki runga ake nei ka tatauhia e te taima (te wa puhoi);
  • Whakahou Takahanga, UEV – he takahanga ka puta ina tatau te matama ki te AR;
  • Hurihanga Mahi PWM – PWM huringa mahi, e kiia ana ko te "tauwehe mahi";
  • Hopu/Whakataurite Uara – uara mo te hopu/whakataurite, kua tatauhia e te matawā ka mahi i tetahi mea (i roto i te take o te PWM, ka hurihia te tohu whakaputa);
  • Uara Utamua – uara kua utaina. Whakataurite uara e kore e taea te huri i te wa e tohu ana te taima, ki te kore ka pakaru te huringa PWM. Na reira, ko nga uara tuku hou ka tukuna ki roto i te kaitapa ka kumea ki waho ka tae te taima ki te mutunga o tana kaute ka tautuhi ano;
  • Tirohanga taha и Ko nga aratau-a-waenganui – te whakahāngaitanga i te taha o te taitapa me te waenganui, he rite ki a Atmel PWM Tere и Wāhanga-tika PWM.
  • OCiREF, Putanga Whakataurite Tohu Tohutoro – tohu putanga tohu, i roto i te meka, te mea e puta i runga i te titi e hāngai ana i roto i te aratau PWM.

I te mea kua maarama mai i te pinout, e rua nga taima e whai mana PWM - te tuatahi me te tuarua. Ko nga mea e rua he 16-bit, ko te tuatahi he maha nga waahanga taapiri (otira, ka taea e ia te tatau ki runga me raro). Me mahi rite taatau e rua, no reira ka whakatau ahau ki te tiimata me te mea tino rawakore te tuarua, kia kore ai e pohehe te whakamahi i tetahi mea kaore i kona. Ko etahi raruraru ko te whakaahuatanga o te mahi PWM o nga taima katoa i roto i te pukapuka tohutoro kei roto i te upoko mo te waahi tuatahi (17.5.7 PWM Mode), na me peke koe ki muri me muri puta noa i te tuhinga i nga wa katoa.

Ko te PWM i runga i te STM8 he painga nui mo te PWM i runga i Atmega:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
PWM Whakaritea Rohe
Te whirihoranga putea mai i raro ki runga
Kei te kaha te tatau o raro-runga mena ka whakawāteahia te moka DIR i te rehita TIM_CR1
Hei tauira:
Ka whakamahia e te tauira te aratau PWM tuatahi. Ko te tohu tohutoro PWM OCiREF e mau tonu ana ki te TIM1_CNT < TIM1_CCRi. Ki te kore he taumata iti. Mena he nui ake te uara whakatairite i roto i te rehita TIM1_CCRi i te uara uta aunoa (Rehita TIM1_ARR), ka mau te tohu OCiREF ki te 1. Mena he 0 te uara whakatairite, ka mau te OCiREF ki te kore....

Matawā STM8 i te wā kaupapa whakahou arowhai tuatahi whakatairite uara, katahi ka puta he tohu tohutoro. Ko te matawā a Atmega ka huri tuatahi ka whakataurite, ka puta compare value == 0 he ngira te whakaputanga, me pehea te mahi (hei tauira, ma te hurihuri i te arorau).

Na ko ta matou e hiahia ana kia mahia: 8-bit PWM (AR == 255), tatauhia mai i raro ki runga, whakatika i te taitapa. I te mea e hono ana nga topuku rama ki te maramara e nga cathodes, me whakaputa te PWM i te 0 (LED) tae noa ki te whakatairite uara a 1 muri.

Kua panuitia e matou etahi korero Aratau PWM, no reira ka kitea e matou te rehita e hiahiatia ana mo te taima tuarua ma te rapu i roto i te pukapuka tohutoro mo tenei rerenga (18.6.8 - TIMx_CCMR1):

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
110: Aratau PWM tuatahi – ina tatauhia mai i raro ki runga, ka kaha te hongere tuatahi i te wa TIMx_CNT <TIMx_CCR1. Ki te kore, karekau te hongere tuatahi. [kei roto ano i te tuhinga he kape-whakapiri pohehe mai i te taima 1] 111: Aratau PWM Tuarua – ina tatau mai i raro ki runga, karekau te hongere tuatahi i te wa TIMx_CNT < TIMx_CCR1. Ki te kore, kei te kaha te hongere tuatahi.

I te mea ko nga LED e hono ana ki te MK ma nga cathodes, ko te aratau tuarua e pai ana ki a maatau (ko te tuatahi ano, engari kaore ano matou i te mohio).

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Moka 3 OC1PE: Whakahohe titi 1 te utaina
0: Kua monoa te rehita o mua i te TIMx_CCR1. Ka taea e koe te tuhi ki TIMx_CCR1 i nga wa katoa. Ka mahi tonu te uara hou.
1: Kua whakahohea te rehita o mua i te TIMx_CCR1. Ka uru atu nga mahi panui/tuhi ki te rehita o mua. Ko te uara TIMx_CCR1 kua utaina kua utaina ki te rehita atarangi i ia huihuinga whakahou.
*Tuhipoka: Kia pai te mahi a te aratau PWM, me whakahohe nga rehita o mua. Kaore e tika ana i te aratau tohu kotahi (kua whakaritea te moka OPM ki te rehita TIMx_CR1).

Kaati, me huri tatou i nga mea katoa e hiahiatia ana mo nga hongere e toru o te taima tuarua:

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

E rua nga rehita moka-waru AR, he ngawari nga mea katoa:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Ka taea e te taima tuarua te tatau mai i raro ki runga, te tirohanga i te taha o te taitapa, kaore he mea hei whakarereke. Me tautuhi te whakawehenga auau, hei tauira, ki te 256. Mo te taima tuarua, kua tautuhia te kaiwehewehe ki te rehita TIM2_PSCR, he mana e rua:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Ko nga mea e toe ana ko te huri i nga whakatau me te taima tuarua ano. Ko te raruraru tuatahi ka whakatauhia e nga rehita Hopu/Whakataurite Whakahohea: e rua, e toru nga hongere e marara ana puta noa i a raatau. I konei ka taea ano e tatou te ako ka taea te whakarereke i te polarity o te tohu, i.e. i roto i te kaupapa, i taea te whakamahi i te Aratau PWM 1. Ka tuhia e matou:

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

Ka mutu, ka timata tatou i te taima i te rehita TIMx_CR1:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Me tuhi he tairitenga ngawari o AnalogWrite(), ka whakawhiti i nga uara tuturu ki te taima hei whakataurite. Ka whakaingoatia nga rehita Hopu/Whakaritea nga rehita, e rua o ratou mo ia hongere: nga moka iti-8 i roto i te TIM2_CCRxL me nga mea teitei i TIM2_CCRxH. I te mea kua hangahia e matou he PWM 8-bit, he nui noa te tuhi i nga waahanga iti rawa atu:

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

Ka kite te kaipanui aro nui he PWM paku to tatou, kaore e taea te whakaki i te 100% (i te uara teitei o te 255, ka huri te tohu mo te huringa taiwhanga kotahi). Mo nga LED kaore he mea nui, a ka taea e te kaipanui whakarongo te whakaaro me pehea te whakatika.

Ka mahi te PWM i runga i te taima tuarua, me neke ki te tuatahi.

He rite tonu nga moka o te matawā tuatahi i roto i nga rehita kotahi (he mea tika ko aua moka i noho "rahuitia" i te wa tuarua ka kaha te whakamahi i te tuatahi mo nga momo mea matatau katoa). Na reira, he nui noa ki te kimi i nga wahitau o nga rehita kotahi i roto i te papaaarangi me te kape i te waehere. Ana, huri i te uara o te kaiwehewehe auau, na te mea... e hiahia ana te kaima tuatahi kia kaua e whiwhi mana e rua, engari he uara moka-16 i roto i nga rehita e rua Prescaler Teitei и iti. Ka mahia e matou nga mea katoa ka... kare e mahi te taima tuatahi. He aha te take?

Ka taea anake te whakatau i te raru ma te tirotiro i te waahanga katoa mo nga rehita mana o te taima 1, kei reira ka rapua e matou te mea karekau i te taima tuarua. Ka noho 17.7.30 Rehita wehenga (TIM1_BKR), kei hea tenei moka:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Whakahohehia te putanga matua

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Ko te katoa mo te tino inaianei, te waehere i reira.

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

STM8 Multiplex

Whakamaha i runga i te STM8

Ko te kaupapa-iti tuatoru ko te hono i nga rama RGB e waru ki te matawā tuarua i roto i te aratau PWM me te whakaatu i nga tae rereke. I ahu mai i runga i te kaupapa o te LED multiplexing, ara, ki te whakahurihia e koe, ka whakawetohia e koe nga LED i te tino tere, ka puta te ahua ki a maatau kei te noho tonu (Tuhinga o mua, inertia o te tirohanga tirohanga). I mahia e au tetahi mea penei i runga i Arduino.

He penei te ahua o te algorithm mahi:

  • hono te anode o te RGB LED tuatahi;
  • ka tahuna, ka tukuna nga tohu e tika ana ki nga cathodes;
  • i tatari tae noa ki te mutunga o te huringa PWM;
  • hono te anode o te tuarua RGB LED;
  • tahuna...

Well, etc. Ko te tikanga, mo te mahi ataahua e hiahiatia ana kia honohia te anode me te LED "ka tahuna" i te wa ano. Ana, tata ranei. Ahakoa he aha, me tuhi tatou i tetahi waehere ka whakaputa i nga uara i roto i nga waahana e toru o te wa tuarua, ka huri i te wa ka tae ki te UEV, a i te wa ano ka huri i te RGB LED kaha inaianei.

I te mea he aunoa te hurihanga LED, me hanga e tatou he "whakamahara ataata" ka whiwhi raraunga te kaihautu aukati. He raupapa ngawari tenei:

uint8_t colors[8][3];

Hei whakarereke i te tae o tetahi LED motuhake, ka nui ki te tuhi i nga uara e hiahiatia ana ki tenei huinga. A ko te taurangi te kawenga mo te maha o te LED kaha

uint8_t cnt;

Demux

Mo te whakareatanga tika, me hiahia, he mea rerekee, he CD74HC238 demultiplexer. Demultiplexer - he maramara hei whakamahi i te kaiwhakahaere i roto i nga taputapu <<. Na roto i nga titi whakauru e toru (nga moka 0, 1 me te 2) ka whangaia e matou he nama moka-toru X, hei whakautu ka whakahohehia te nama whakaputa (1<<X). Ko nga toenga whakaurunga o te maramara ka whakamahia hei tauine i te hoahoa katoa. E hiahia ana matou ki tenei maramara ehara i te mea hei whakaiti noa i te maha o nga titi microcontroller e nohoia ana, engari mo te haumaru - kia kore ai e huri pohehe kia nui ake nga rama ka taea, kia kaua e tahuna te MK. He pene te utu o te maramara, me pupuri tonu ki roto i to whare rongoa o te kainga.

Ko ta maatau CD74HC238 te kawenga mo te tuku ngaohiko ki te anode o te LED e hiahiatia ana. I roto i te multiplex tonu, ka tukuna e ia te ngaohiko ki te pou ma te P-MOSFET, engari i roto i tenei whakaaturanga ka taea, na te mea ka kumea te 20 mA, e ai ki whakawākanga mōrahi tino i roto i te papanga raraunga. Mai Pepa Raraunga CD74HC238 e hiahia ana matou ki nga pinout me tenei pepa tinihanga:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
H = taumata ngaohiko teitei, L = taumata ngaohiko iti, X – kaua e whakaaro

Ka hono atu a E2 me E1 ki te whenua, E3, A0, A1 me A3 ki nga titi PD5, PC3, PC4 me PC5 o STM8. I te mea kei roto i te ripanga o runga ake nga taumata iti me nga taumata teitei, ka whirihorahia e matou enei titi hei titi pana.

PWM

Ko te PWM i te wa tuarua ka whirihorahia kia rite ki te korero o mua, e rua nga rereketanga:

Tuatahi, me whakaahei tatou i te aukati Whakahou Takahanga (UEV) ka karanga he mahi e takahuri ai te LED kaha. Ka mahia tenei ma te huri i te moka Whakahoutanga Whakahohe Whakahohe i roto i te rehita me te ingoa korero

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
Haukotia ka taea te rehita

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Ko te rereketanga tuarua e pa ana ki te ahuatanga o te maha, penei whakangahau – tiaho parapara o nga diodes. I roto i a maatau, ka puta pea na te mea ko te kaima, na te mea i aukati i te UEV, kei te haere tonu te tohu, karekau he wa ki te kaitakawaenga ki te huri i te LED i mua i te tiimata o te kaima ki te tuhi i tetahi mea ki nga titi. Hei karo i tenei, me huri koe i te arorau (0 = te kanapa teitei, 255 = karekau he rama) me te karo i nga uara o te huringa mahi. Ko era. Me whakarite i muri i te UEV ka puta katoa nga LED mo te huringa PWM kotahi.

Te huri polarity:

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

A ape i te tautuhi i te r, g me te b ki te 255 ka mahara ki te huripoki ina whakamahi ana.

Nga haukoti

Ko te ngako o te haukoti i etahi ahuatanga ka mutu te mahi a te maramara i te kaupapa matua ka karanga i etahi mahi o waho. Ka puta nga haukoti i runga i nga awe o waho, o roto ranei, tae atu ki te taima.

I te wa tuatahi i hangaia e matou he kaupapa i roto i te ST Visual Develop, i tua atu i main.c i whiwhi matou i tetahi matapihi me tetahi konae ngaro stm8_interrupt_vector.c, ka whakauruhia ki roto i te kaupapa. I roto i tenei kōnae, ka tautapahia he taumahi ki ia haukoti NonHandledInterrupt. Me herea ta tatou mahi ki te haukoti e hiahiatia ana.

He ripanga o nga vectors haukoti i te papararaunga raraunga, ka kitea nga mea e hiahiatia ana e matou:

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8
13 TIM2 whakahou/pupuhi
14 TIM2 hopu/whakataurite

Me huri tatou i te LED i te UEV, no reira me haukotia te #13.

No reira, tuatahi, i roto i te konae stm8_interrupt_vector.c Hurihia te ingoa taunoa o te taumahi e tika ana mo te aukati Nama 13 (IRQ13) ki a koe ake:

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

Tuarua, me hanga he konae main.h me nga ihirangi e whai ake nei:

#ifndef __MAIN_H
#define __MAIN_H

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

Ka mutu, tuhia tenei mahi ki to 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;
}

Ko te mea e toe ana ko te whakaahei i nga haukoti. Ka mahia tenei ma te whakamahi i te whakahau assembler rim - me rapu koe i roto Pukapuka Papatono:

//enable interrupts
_asm("rim");

Ko tetahi atu whakahau assembler sim – ka whakaweto i nga haukoti. Me whakawetohia i te wa e tuhia ana nga uara hou ki te "whakamahara ataata", kia kore ai e pahuatia te raupapatanga o te aukati i te wa he.

Waehere katoa - i runga i GitHub.

Pānuihia nga papaarangi 2: SPI i runga i te STM32; PWM, matawā me te haukoti i runga i te STM8

Mena ka kitea e tetahi he whai hua tenei tuhinga, kaore au i tuhi noa. Ka koa ahau ki te whiwhi korero me nga korero, ka ngana ahau ki te whakautu i nga mea katoa.

Source: will.com

Tāpiri i te kōrero