Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

В akụkụ mbụ Agbalịrị m ịgwa ndị injinia eletrọnịkị ihe omume ntụrụndụ bụ ndị tolitere site na Arduino uwe ogologo ọkpa otu na ihe kpatara ha ga-eji gụọ akwụkwọ data na akwụkwọ ndị ọzọ maka microcontrollers. Ihe odide ahụ bịara buru ibu, n'ihi ya, ekwere m nkwa igosi ihe atụ ndị bara uru n'isiokwu dị iche. Ọfọn, ọ kpọrọ onwe ya ero mmiri ara ...

Taa, m ga-egosi gị otu esi eji datasheets dozie nnọọ mfe, ma dị mkpa maka ọtụtụ ọrụ, ọrụ na STM32 (Blue Pill) na STM8 njikwa. A na-arara ọrụ ngosi ngosi niile na LEDs ọkacha mmasị m, anyị ga-enye ha ọkụ n'ọtụtụ buru ibu, nke anyị ga-eji ụdị peripherals na-adọrọ mmasị.

Edemede a tụgharịrị buru ibu ọzọ, yabụ maka ịdị mma ana m eme ọdịnaya ahụ:

STM32 Blue Pill: 16 LED nwere onye ọkwọ ụgbọ ala DM634
STM8: Ịtọlite ​​​​ntụtụ PWM isii
STM8: 8 RGB LEDs na ntụtụ atọ, nkwụsị

Disclaimer: Abụghị m onye injinia, anaghị m eme ka à ga-asị na m nwere ihe ọmụma miri emi na eletrọnịkị, ezubere isiokwu a maka ndị amateur dị ka m. N'ezie, echere m onwe m afọ abụọ gara aga dị ka ndị na-ege ntị lekwasịrị anya. Ọ bụrụ na mmadụ gwara m mgbe ahụ na datasheets na mgbawa amaghị ama adịghị atụ egwu ịgụ, agaraghị m etinye oge dị ukwuu na-achọ ụfọdụ koodu na ịntanetị na-emepụta crutches na mkpa na teepu nrapado.

Ihe a na-elekwasị anya n'isiokwu a bụ na akwụkwọ data, ọ bụghị ọrụ, ya mere koodu ahụ nwere ike ọ gaghị adị mma nke ukwuu ma na-enwekarị mgbagwoju anya. The oru ngo onwe ha dị nnọọ mfe, ọ bụ ezie na adabara a mbụ maara na ọhụrụ mgbawa.

Enwere m olileanya na isiokwu m ga-enyere mmadụ aka n'otu oge ahụ nke imikpu na ntụrụndụ.

NKM 32

16 LED nwere DM634 na SPI

Obere oru ngo na-eji Blue Pill (STM32F103C8T6) na onye ọkwọ ụgbọ ala DM634. Iji datasheets, anyị ga-achọpụta onye ọkwọ ụgbọ ala, ọdụ ụgbọ mmiri STM IO ma hazie SPI.

DM634

Mgbawa Taiwanese nwere 16 16-bit PWM mmepụta, enwere ike ijikọ na agbụ. Ụdị 12-bit dị ala dị ala ka amara site na ọrụ ụlọ Akpa ọkụ. N'otu oge, ịhọrọ n'etiti DM63x na TLC5940 a ma ama, ahọpụtara m DM maka ọtụtụ ihe kpatara ya: 1) TLC na Aliexpress bụ n'ezie adịgboroja, ma nke a abụghị; 2) DM nwere PWM kwụụrụ onwe ya na onye na-emepụta ugboro ugboro; 3) Enwere ike zụta ya n'efu na Moscow, kama ichere ngwugwu Ali. Ma, n'ezie, ọ bụ ihe na-adọrọ mmasị ịmụta otú e si ejikwa mgbawa n'onwe gị, kama iji ụlọ akwụkwọ dị njikere. A na-egosikwa ibe ugbu a na ngwugwu SSOP24; ọ dị mfe ire ya na nkwụnye ọkụ.

Ebe ọ bụ na onye nrụpụta bụ Taiwanese, akwụkwọ data e dere mgbawa na Chinese English, nke pụtara na ọ ga-atọ ụtọ. Mbụ anyị na-ele anya na pinout (Njikọ Pin) ịghọta nke ụkwụ iji jikọọ ihe, na nkọwa nke atụdo (Nkọwa Ntụtụ). 16 ntụtụ:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Isi mmalite DC Sink (Oghere igbapu)

Chee / Mbupute-mmiri mmiri - igbapu; isi iyi nke nbata ugbu a; a na-ejikọta mmepụta na ala na steeti na-arụ ọrụ - LED na-ejikọta onye ọkwọ ụgbọ ala site na cathodes. Eletriki, nke a bụ n'ezie, ọ bụghị "oghere igbapu" (oghe igbapu), mana na mpempe akwụkwọ data, a na-ahụkarị aha maka ntụtụ na ọnọdụ igbapu.

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Mpụga resistors n'etiti REXT na GND ka ịtọ uru mmepụta ugbu a

A na-etinye ihe mgbochi nrụtụ aka n'etiti pin na ala REXT, nke na-achịkwa nguzogide dị n'ime nke mpụta, lee eserese dị na ibe 9 nke akwụkwọ data ahụ. Na DM634, ngwanrọ nwekwara ike ịchịkwa nguzogide a, na-edozi nchapụta niile (nchapụta zuru ụwa ọnụ); Agaghị m abanye nkọwa n'isiokwu a, m ga-etinye naanị 2.2 - 3 kOhm resistor ebe a.

Iji ghọta otu esi ejikwa mgbawa, ka anyị lelee nkọwa nke interface ngwaọrụ:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Ee, ebe a, Chinese English na ebube ya niile. Ịsụgharị nke a bụ nsogbu, ị nwere ike ịghọta ya ma ọ bụrụ na ịchọrọ, mana enwere ụzọ ọzọ - lee ka esi akọwa njikọ na TLC5940 na-arụ ọrụ na akwụkwọ data:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
... Naanị ntụtụ atọ ka achọrọ iji tinye data n'ime ngwaọrụ ahụ. Ọnụ ịrị elu nke mgbaàmà SCLK na-atụgharị data site na pin SIN gaa na ndekọ nke ime. Mgbe ebufechara data niile, mgbama XLAT dị mkpụmkpụ dị mkpụmkpụ na-etinye data ebugharị n'usoro n'ime ndekọ nke ime. Ndebanye aha nke ime bụ ọnụ ụzọ mgbama XLAT kpalitere. A na-ebufe data niile kacha mkpa na mbụ.

Latch - latch/latch/mkpọchi.
Ọnụ na-ebili - na-eduga ọnụ nke usu
MSB mbụ - kacha pụta ìhè (n'aka ekpe) ntakịrị n'ihu.
ka elekere data - nyefee data n'usoro (bit na bit).

Okwu lash a na-ahụkarị na akwụkwọ maka ibe ma sụgharịa ya n'ụzọ dị iche iche, ya mere maka nghọta m ga-ahapụ onwe m.

obere mmemme mmụtaOnye ọkwọ ụgbọ ala LED bụ n'ezie ndekọ ngbanwe. "Shift" (mgbanwe) na aha - bitwise mmegharị nke data n'ime ngwaọrụ: ọhụrụ ọ bụla bit ọhụrụ kwaba n'ime na-akpali dum yinye na-aga n'ihu ya. Ebe ọ bụ na ọ dịghị onye chọrọ ịhụ chaotic blinking nke LEDs n'oge ngbanwe, usoro a na-ewere ọnọdụ na ndekọ nchekwa nke kewapụrụ na ndekọ na-arụ ọrụ site na damper (lash) bụ ụdị ụlọ nchere ebe a na-ahazi ibe n'usoro n'usoro achọrọ. Mgbe ihe niile dị njikere, ihe mkpuchi ahụ ga-emepe ma ibe n'ibe na-arụ ọrụ, dochie ogbe gara aga. Okwu lash N'ime akwụkwọ maka microcircuits, ọ fọrọ nke nta ka ọ bụrụ mgbe niile na-egosi iru mmiri dị otú ahụ, n'agbanyeghị ụdị njikọ ọ na-eji.

Ya mere, data nyefe na DM634 na-rụrụ dị ka nke a: tọọ DAI ntinye aka uru nke kasị dị ịrịba bit nke anya LED, sere DCK elu na ala; tọọ ntinye DAI na uru nke bit ọzọ, dọpụta DCK; na ihe ndị ọzọ ruo mgbe ebisara ibe n'ibe niile (emechiela), mgbe nke ahụ gasịrị, anyị na-adọta LAT. Enwere ike iji aka mee nke a (bit-mgba), ma ọ ka mma iji SPI interface ahaziri maka nke a, ebe ọ bụ na e gosipụtara ya na STM32 anyị na mbipụta abụọ.

Ọgwụ na-acha anụnụ anụnụ STM32F103

Okwu mmalite: Ndị na-ahụ maka STM32 dị mgbagwoju anya karịa Atmega328 karịa ka ha nwere ike iyi egwu. Ọzọkwa, n'ihi ihe kpatara nchekwa ike, ihe fọrọ nke nta ka ọ bụrụ akụkụ niile na-agbanyụ na mmalite, na oge elekere bụ 8 MHz site na isi mmalite. Ọ dabara nke ọma, ndị na-eme mmemme STM dere koodu nke na-ebute mgbawa ahụ ruo 72 MHz “gbakọọ”, na ndị dere IDE niile m maara gụnyere ya na usoro mmalite, yabụ na anyị achọghị ịme elekere (mana). ị nwere ike ma ọ bụrụ na ị chọrọ n'ezie). Mana ị ga-agbanyerịrị mpụta.

Akwụkwọ: Blue Pill nwere mgbawa STM32F103C8T6 na-ewu ewu, enwere akwụkwọ abụọ bara uru maka ya:

Na mpempe akwụkwọ data anyị nwere ike ịmasị:

  • Pinouts - mgbawa pinouts - ọ bụrụ na anyị kpebie ịme mbadamba n'onwe anyị;
  • Map ebe nchekwa – maapụ ebe nchekwa maka mgbawa akọwapụtara. Akwụkwọ ntuziaka ahụ nwere maapụ maka ahịrị ahụ dum, ọ na-ekwukwa aha ndekọ nke anyị enweghị.
  • Tebụl nkọwa nkọwa - na-edepụta isi na ọrụ ndị ọzọ nke ntụtụ; maka "ọgwụ na-acha anụnụ anụnụ" ị nwere ike ịhụ foto ndị dị mma na ịntanetị na ndepụta nke pin na ọrụ ha. Ya mere, anyị ozugbo google Blue Pill pinout ma debe foto a n'aka:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
NB: enwere njehie na foto a sitere na ịntanetị, nke edepụtara na nkwupụta, daalụ maka nke ahụ. Edochiela foto a, mana nke a bụ nkuzi - ọ ka mma ịlele ozi ọ bụghị site na akwụkwọ data.

Anyị na-ewepụ akwụkwọ data ahụ, mepee akwụkwọ ntuziaka, ma site ugbu a gaa n'ihu, anyị na-eji naanị ya.
Usoro: anyị na-emeso ntinye / mmepụta ọkọlọtọ, hazie SPI, gbanye ihe ndị dị mkpa.

Ntinye ntinye

Na Atmega328, a na-emejuputa I/O nke ukwuu, nke mere na ọtụtụ nhọrọ STM32 nwere ike ịgbagwoju anya. Ugbu a anyị chọrọ naanị nkwubi okwu, ma ọbụna ndị a nwere nhọrọ anọ:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
ghe oghe ihiẹn, ihiẹn-oriri, ihiẹn-oriri ọzọ, ihiẹn oghe ọzọ

"Pull-push" (push-esiri) bụ mmepụta a na-emekarị site na Arduino, pin nwere ike iburu uru ma ọ bụ elu ma ọ bụ ala. Ma na "oghere igbapu" e nwere ihe isi ike, ọ bụ ezie na n'ezie ihe niile dị mfe ebe a:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Nhazi mmepụta / mgbe a na-ekenye ọdụ ụgbọ mmiri ka ọ pụta: / mmepụta ihe na-eme ka ọ bụrụ: / - ọnọdụ drain na-emeghe: "0" na ndekọ mmepụta na-enyere N-MOS aka, "1" na ndekọ mmepụta na-ahapụ ọdụ ụgbọ mmiri na ọnọdụ Hi-Z ( P-MOS adịghị arụ ọrụ ) / – push-pull mode: "0" na ndekọ mmepụta na-arụ ọrụ N-MOS, "1" na ndekọ mmepụta na-arụ ọrụ P-MOS.

Ọdịiche niile dị n'etiti oghere mepere emepe (oghe igbapu) site na "push-pull" (push-esiri) bụ na na ntụtụ mbụ enweghị ike ịnakwere steeti HIGH: mgbe ị na-ede otu na ndekọ mmepụta, ọ na-abanye n'ime ọnọdụ nguzogide dị elu (elu impedance, Ndewo-Z). Mgbe ị na-ede efu, ntụtụ na-eme otu ihe ahụ na ụdịdị abụọ ahụ, ma n'ụzọ ezi uche dị na ya ma na ọkụ eletrik.

Na ọnọdụ mmepụta nkịtị, ntụtụ ahụ na-agbasa ọdịnaya nke ndekọ mmepụta. Na "ọzọ" a na-achịkwa ya site na mpaghara kwekọrọ (lee 9.1.4):

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Ọ bụrụ na ahaziri bit ọdụ ụgbọ mmiri dị ka ntụtụ ọrụ ọzọ, ndebanye aha pin nwere nkwarụ ma jikọọ ntụtụ ahụ na ntụtụ dị n'akụkụ.

A kọwara ọrụ ọzọ nke ntụtụ ọ bụla na Nkọwapụta Pin Mpempe akwụkwọ data dị na onyonyo ebudatara. Maka ajụjụ nke ihe ị ga-eme ma ọ bụrụ na ntụtụ nwere ọtụtụ ọrụ ọzọ, a na-enye azịza ya site na ndetu ala ala n'ala na akwụkwọ data:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Ọ bụrụ na ọtụtụ mpụta na-eji otu ntụtụ ahụ, iji zere esemokwu n'etiti ọrụ ndị ọzọ, ọ bụ naanị otu akụkụ ka a ga-eji n'otu oge, gbanye ya site na iji obere elekere na-enye ohere (na ndekọ RCC kwesịrị ekwesị).

N'ikpeazụ, atụdo na ọnọdụ mmepụta nwekwara ọsọ elekere. Nke a bụ ihe ọzọ na-azọpụta ike; n'ọnọdụ anyị, anyị na-edozi ya na nke kachasị ma chefuo ya.

Yabụ: anyị na-eji SPI, nke pụtara na ntụtụ abụọ (ya na data yana akara elekere) kwesịrị ịbụ “ọrụ push-pull ọzọ”, nke ọzọ (LAT) kwesịrị ịbụ “pullpull mgbe niile”. Mana tupu ekenye ha, ka anyị na-emeso SPI.

SPI

Obere mmemme mmụta ọzọ

SPI ma ọ bụ Serial Peripheral Interface (serial peripheral interface) bụ interface dị mfe ma dị irè maka ijikọ MK na ndị MK ndị ọzọ na ụwa dị n'èzí n'ozuzu. A kọwalarị ụkpụrụ nke ọrụ ya n'elu, ebe gbasara onye ọkwọ ụgbọ ala China LED (na akwụkwọ ntuziaka, lee ngalaba 25). SPI nwere ike ịrụ ọrụ na ọnọdụ nna ukwu (“nna ukwu”) na ohu (“ohu”). SPI nwere ọwa anọ bụ isi, nke enweghị ike iji ha niile:

  • MOSI, Mmepụta Master / Ntinye ohu: ntụtụ a na-ebufe data na ọnọdụ nna ukwu, wee nata data na ọnọdụ ohu;
  • MISO, Nna-ukwu Ntinye / Mmepụta Ohu: n'ụzọ megidere ya, ọ na-anata na nna ukwu, na-ebufe na ohu;
  • SCK, Serial Clock: na-edobe ugboro nke nnyefe data na nna ukwu ma ọ bụ nata akara elekere n'ime ohu ahụ. N'ezie ịkụ ọkpọ;
  • SS, Nhọrọ ohu: site n'enyemaka nke ọwa a, ohu ahụ maara na a chọrọ ihe n'aka ya. Na STM32 a na-akpọ ya NSS, ebe N = adịghị mma, i.e. onye njikwa na-aghọ ohu ma ọ bụrụ na e nwere ala na ọwa a. Ọ na-ejikọta nke ọma na ụdị mmepụta ihe mepere emepe, mana nke ahụ bụ akụkọ ọzọ.

Dị ka ihe ọ bụla ọzọ, SPI na STM32 bara ụba na arụmọrụ, nke na-eme ka ọ sie ike nghọta. Dịka ọmụmaatụ, ọ nwere ike ịrụ ọrụ ọ bụghị naanị na SPI, kamakwa na interface I2S, na n'ime akwụkwọ ahụ, a na-agwakọta nkọwa ha, ọ dị mkpa ka ebipụ ihe ndị ahụ n'oge kwesịrị ekwesị. Ọrụ anyị dị nnọọ mfe: naanị anyị kwesịrị izipu data site na iji naanị MOSI na SCK. Anyị na-aga na ngalaba 25.3.4 (nkwukọrịta ọkara duplex, nkwurịta okwu ọkara duplex), ebe anyị na-ahụ. Elekere 1 na waya data unidirectional 1 ( mgbama elekere 1 na iyi data unidirectional 1):

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
N'ụdị a, ngwa a na-eji SPI n'ụdị nnyefe naanị ma ọ bụ naanị nnabata. / Nyefe naanị mode yiri duplex mode: data na-ebunye na nnyefe pin (MOSI na master mode ma ọ bụ MISO na ohu mode), na enweta pin (MISO ma ọ bụ MOSI karị) nwere ike iji dị ka a mgbe I / O pin. . N'okwu a, ngwa ahụ kwesịrị ileghara ihe nchekwa Rx anya (ọ bụrụ na agụ ya, a gaghị enwe data ebufe ebe ahụ).

Ọ dị mma, pin MISO bụ n'efu, ka anyị jikọọ akara LAT na ya. Ka anyị leba anya na Slave Select, nke nwere ike ịchịkwa na STM32 na mmemme, nke dị oke mma. Anyị na-agụ paragraf nke otu aha ahụ na ngalaba 25.3.1 SPI General Description:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Njikwa ngwanrọ NSS (SSM = 1) / Ozi nhọrọ ohu dị na ntakịrị SSI nke ndebanye aha SPI_CR1. Pin NSS dị n'èzí ka bụ n'efu maka mkpa ngwa ndị ọzọ.

Oge erugo idegara ndị ndekọ aha. Ekpebiri m iji SPI2, chọọ adreesị ntọala ya na mpempe akwụkwọ data - na ngalaba 3.3 Map ebe nchekwa:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Ọfọn, ka anyị malite:

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

Mepee ngalaba 25.3.3 nwere aha nkọwa onwe ya "Ịhazi SPI na ọnọdụ Master":

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

1. Tọọ ugboro elekere na nkeji BR[2:0] na ndekọ SPI_CR1.

A na-anakọta akwụkwọ ndekọ aha na ngalaba ntuziaka nke otu aha ahụ. Mgbanwe adreesị (Akwụsị adreesịmaka CR1 - 0x00, site na ndabara, a na-ehichapụ ibe n'ibe niile (Tọgharịa uru 0x0000):

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Bits BR na-edobe nkesa elekere njikwa, si otú a na-achọpụta ugboro ole SPI ga-arụ ọrụ. Ugboro STM32 anyị ga-abụ 72 MHz, onye ọkwọ ụgbọ ala LED, dị ka akwụkwọ data ya si dị, na-arụ ọrụ ugboro ruru 25 MHz, yabụ anyị kwesịrị kewaa site na anọ (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. Tọọ ibe CPOL na CPHA iji kọwapụta mmekọrịta dị n'etiti ịnyefe data na oge elekere (lee eserese na ibe 240)

Ebe anyị na-agụ akwụkwọ data ebe a ma ghara ilele schematics, ka anyị lebakwuo anya na nkọwa ederede nke ibe CPOL na CPHA na ibe 704 (SPI General Description):

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Oge elekere na polarity
Iji ibe CPOL na CPHA nke ndebanye aha SPI_CR1, ị nwere ike họrọ mmekọrịta oge anọ na mmemme. CPOL (oge polarity) bit na-achịkwa ọnọdụ mgbama elekere mgbe enweghị data na-ebufe. Nke a bit na-achịkwa ndị nna ukwu na ndị ohu ụdịdị. Ọ bụrụ na emegharịrị CPOL, pin SCK dị ala na ọnọdụ izu ike. Ọ bụrụ na edobere bit CPOL, pin SCK dị elu n'oge ọnọdụ izu ike.
Mgbe CPHA (elekere oge) bit atọrọ, elu bit ọnyà strobe bụ nsọtụ nke abụọ nke SCK mgbaàmà (ada ma ọ bụrụ na CPOL doro anya, na-ebili ma ọ bụrụ na CPOL). A na-ejide data ahụ site na mgbanwe nke abụọ na mgbama elekere. Ọ bụrụ na CPHA bit doro anya, nnukwu ọnyà ọnyà dị elu bụ ịrị elu nke mgbaàmà SCK (ọdịda ọdịda ma ọ bụrụ na edobere CPOL, na-ebili ma ọ bụrụ na CPOL kpochapụrụ). A na-ejide data na mgbanwe mbụ na mgbama elekere.

N'ịbụ ndị etinyere ihe ọmụma a, anyị na-abịa na nkwubi okwu na ibe abụọ ahụ ga-anọgide na-efu, n'ihi na Anyị chọrọ ka akara SCK ka ọ dị ala mgbe ọ naghị eji ya, yana nyefee data na nsọtụ ịrị elu nke usu (lee fig. Edge na-ebili na mpempe akwụkwọ DM634).

Site n'ụzọ, ebe a anyị na mbụ zutere a akụkụ nke okwu na ST datasheets: n'ime ha nkebi ahịrịokwu "tọgharịa bit na efu" e dere. iji tọgharịa ntakịrịma ọ bụghị ikpochapụ ntakịrị, dị ka, ọmụmaatụ, Atmega.

3. Tọọ DFF bit iji chọpụta ma data ngọngọ bụ 8-bit ma ọ bụ 16-bit format

Ana m ewere DM16 634-bit kpọmkwem ka m ghara inye nsogbu na ịnyefe 12-bit PWM data, dị ka DM633. Ọ bụ ihe ezi uche dị na ịtọ DFF ka ọ bụrụ otu:

#define DFF         0x0800

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

4. Hazie ntakịrị LSBFIRST na aha SPI_CR1 iji chọpụta usoro ngọngọ

LSBFIRST, dị ka aha ya na-egosi, na-ahazi nnyefe na obere ntakịrị ihe mbụ. Mana DM634 chọrọ ịnata data na-amalite site na ntakịrị ntakịrị. Ya mere, anyị na-ahapụ ya nrụpụta.

5. N'ọnọdụ ngwaike, ọ bụrụ na achọrọ ntinye sitere na pin NSS, tinye akara ngosi dị elu na pin NSS n'oge usoro mbufe byte dum. N'ụdị ngwanrọ NSS, tọọ SSM na SSI ibe n'ime ndekọ SPI_CR1. Ọ bụrụ na a ga-eji ntụtụ NSS mee ihe dị ka mmepụta, ọ bụ naanị ntakịrị SSOE kwesịrị ịtọ.

Wụnye SSM na SSI ka ichefu maka ọnọdụ ngwaike NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. A ghaghị ịtọ ntọala MSTR na SPE (ha na-anọgide naanị ma ọ bụrụ na mgbaàmà NSS dị elu)

N'ezie, site na ibe ndị a anyị na-akọwapụta SPI anyị dị ka nna ukwu wee gbanye ya:

#define MSTR        0x0004
#define SPE         0x0040

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

A haziri SPI, ka anyị dee ọrụ ozugbo na-ezigara onye ọkwọ ụgbọ ala bytes. Gaa n'ihu na-agụ 25.3.3 "Ịhazi SPI na ọnọdụ nna ukwu":

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Usoro mbufe data
Mbufe na-amalite mgbe edere byte na nchekwa Tx.
A na-ebunye byte data n'ime ndekọ mgbanwe na yiri mode (si n'ime ụgbọ ala) n'oge nnyefe nke mbụ bit, mgbe nke a na-ebunye ya usoro Ụdị ntụtụ MOSI, nke mbụ ma ọ bụ nke ikpeazụ ga-aga n'ihu dabere na ntọala LSBFIRST bit na aha CPI_CR1. Edobere ọkọlọtọ TXE ka ebufe data gasịrị site na nchekwa Tx ka ị gbanwee aha ndebanye aha, ma na-ebute nkwụsịtụ ma ọ bụrụ na edobere ntakịrị TXEIE na aha CPI_CR1.

Akọwapụtara m okwu ole na ole na ntụgharị asụsụ iji dọta uche gaa n'otu akụkụ nke mmejuputa SPI na njikwa STM. Na Atmega ọkọlọtọ TXE (Tx efu, Tx bụ ihe efu ma dị njikere ịnata data) naanị mgbe ezipụchara byte dum pụọ. Na ebe a ka edobere ọkọlọtọ a mgbe etinyere byte n'ime ndekọ mgbanwe n'ime. Ebe ọ bụ na a na-ebugharị ya na ihe niile n'otu oge (n'otu oge), wee nyefee data ahụ n'usoro, a na-edozi TXE tupu ezipụ byte kpamkpam. Nke a dị mkpa n'ihi na N'ihe banyere onye ọkwọ ụgbọ ala LED anyị, anyị kwesịrị ịdọrọ pin LAT mgbe anyị zigachara всех data, i.e. Ọkọlọtọ TXE naanị agaghị ezuru anyị.

Nke a pụtara na anyị chọrọ ọkọlọtọ ọzọ. Ka anyị leba anya na 25.3.7 - "Ọkọlọtọ ọnọdụ":

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
<…>
Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Ọkọlọtọ aka ọrụ
Edobere ma kpochapụ ọkọlọtọ BSY site na ngwaike (ịdere ya ihe enweghị mmetụta). Ọkọlọtọ BSY na-egosi ọnọdụ oyi akwa nkwukọrịta SPI.
Ọ na-emegharị:
mgbe emechara mbufe (belụsọ na ọnọdụ nna ukwu ma ọ bụrụ na mbufe na-aga n'ihu)
mgbe SPI nwere nkwarụ
mgbe njehie ọnọdụ ọnọdụ mere (MODF=1)
Ọ bụrụ na mbufe anaghị aga n'ihu, a na-ehichapụ ọkọlọtọ BSY n'etiti mbufe data ọ bụla

Ọ dị mma, nke a ga-aba uru. Ka anyị chọpụta ebe nchekwa Tx dị. Iji mee nke a, gụọ "Ndebanye aha data SPI":

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Bits 15:0 DR[15:0] Ndebanye aha data
Data enwetara ma ọ bụ data ga-ebufe.
A na-ekewa akwụkwọ ndekọ data ụzọ abụọ - otu maka ide (buffer transmit) na otu maka ịgụ (nata ihe nchekwa). Ide ede na ndekọ data na-edegara Tx buffer, na ịgụ site na ndekọ data ga-eweghachite uru dị na nchekwa Rx.

Ọfọn, yana ndekọ ọkwa, ebe a na-ahụ ọkọlọtọ TXE na BSY:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Anyị na-ede:

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

Ọfọn, ebe ọ bụ na anyị kwesịrị ibunye 16 ugboro abụọ bytes, dị ka ọnụ ọgụgụ nke LED ọkwọ ụgbọala pụta, ihe dị ka nke a:

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

Mana anyị amaghị ka esi dọpụ pin LAT, yabụ anyị ga-alaghachi na I/O.

Na-ekenye atụdo

Na STM32F1, ndebanye aha maka steeti ntụtụ bụ ihe ọhụrụ. O doro anya na enwere ọtụtụ n'ime ha karịa Atmega, mana ha dịkwa iche na ibe STM ndị ọzọ. Nkeji 9.1 Nkọwa izugbe nke GPIO:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Nke ọ bụla n'ime ọdụ ụgbọ mmiri I/O izugbe (GPIO) nwere ndekọ nhazi 32-bit abụọ (GPIOx_CRL na GPIOx_CRH), akwụkwọ ndekọ data 32-bit abụọ (GPIOx_IDR na GPIOx_ODR), ndebanye aha nhazi 32-bit (GPIOx_BSRR), ndekọ nrụpụta 16-bit (GPIOx_BRR) na 32- ndekọ nkwụsịtụ ntakịrị (GPIOx_LCKR).

Ndebanye aha abụọ mbụ bụ ihe a na-adịghị ahụkebe, ọ dịkwaghị mma, n'ihi na ntụtụ ọdụ ụgbọ mmiri iri na isii na-agbasa n'ofe ha na usoro "bit anọ kwa nwanne". Ndị ahụ. atụdo zero ruo asaa dị na CRL, ndị ọzọ nọ na CRH. N'otu oge ahụ, akwụkwọ ndekọ ndị fọdụrụ na-enwe nke ọma nke ntanye nke ọdụ ụgbọ mmiri niile - na-abụkarị ọkara "echekwara".

Maka mfe, ka anyị malite na njedebe nke ndepụta ahụ.

Anyị achọghị ndekọ mgbochi.

Ndekọ ntọala na ndezigharị na-atọ ọchị n'ihi na ha na-emegharị ibe ha: ị nwere ike dee ihe niile naanị na BSRR, ebe ibe 16 dị elu ga-emegharị pin ka ọ bụrụ efu, na ndị dị ala ga-edobe 1, ma ọ bụ ị nwekwara ike. jiri BRR, nke dị ala 16 ibe n'ime ha na-emegharị pin. Nhọrọ nke abụọ masịrị m. Ndebanye aha ndị a dị mkpa n'ihi na ha na-enye ohere atomiki na ntụtụ:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Tọọ atọm ma ọ bụ Tọgharịa
Ọ dịghị mkpa iji gbanyụọ nkwụsịtụ mgbe ị na-eme mmemme GPIOx_ODR na ọkwa bit: otu ma ọ bụ karịa nwere ike ịgbanwe site na otu ọrụ ide ihe APB2. A na-enweta nke a site n'ịde "1" na ndebanye aha ntọala/tọgharịa (GPIOx_BSRR ma ọ bụ, maka nrụpụta naanị, GPIOx_BRR) nke ntakịrị nke kwesịrị ịgbanwe. Iberibe ndị ọzọ agaghị agbanwe agbanwe.

Ndebanye aha data nwere aha nkọwa nke onwe - IDR = ndenye Ndebanye aha ntụziaka, ndebanye aha; ODR = mmepụta Ndebanye aha ntụziaka, ndekọ mmepụta. Anyị agaghị achọ ha na ọrụ ugbu a.

Na n'ikpeazụ, akara ndekọ. Ebe ọ bụ na anyị nwere mmasị na ntụtụ SPI nke abụọ, ya bụ PB13, PB14 na PB15, anyị na-ele anya ozugbo na CRH:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Anyị na-ahụkwa na anyị ga-achọ ide ihe na ibe n'ibe site na 20 ruo 31.

Anyị achọpụtala n'elu ihe anyị chọrọ site na ntụtụ, yabụ ebe a, m ga-eme na-enweghị nseta ihuenyo, naanị m ga-ekwu na MODE na-akọwapụta ntụziaka (ntinye ma ọ bụrụ na etinyere ibe n'ibe abụọ na 0) na ọsọ pin (anyị chọrọ 50MHz, i.e. ma pin na "1"), na CNF na-esetịpụ ọnọdụ ahụ: mgbe niile "push-pull" - 00, "ọzọ" - 10. Site na ndabara, dị ka anyị na-ahụ n'elu, ihe atụdo niile nwere nke atọ site na ala (CNF0), ọ na-edobe ha na ọnọdụ ntinye ese n'elu mmiri.

Ebe ọ bụ na m na-eme atụmatụ ime ihe ọzọ na mgbawa a, maka ịdị mfe, akọwawo m ụkpụrụ MODE na CNF niile nwere ike ime maka ndekọ nchịkwa nke ala na nke elu.

N'ụzọ ụfọdụ dị ka nke a

#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

Ntụtụ anyị dị na ọdụ ụgbọ mmiri B (adreesị ntọala - 0x40010C00), koodu:

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

Ya mere, ị nwere ike dee nkọwa maka LAT, nke BRR na BSRR ga-agbanwe:

/*** 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 naanị site na inertia, ọ na-adị ka nke ahụ, hapụ ya ka ọ nọrọ)

Ugbu a ihe niile dị mma, ma ọ naghị arụ ọrụ. N'ihi na nke a bụ STM32, ha na-echekwa ọkụ eletrik, nke pụtara na ị ga-eme ka clocking nke mpaghara achọrọ.

Gbanwuo clocking

Elekere ahụ, nke a makwaara dị ka elekere, na-ahụ maka imechi. Na anyị nwere ike ugbua na-achọpụta mbiri nke RCC. Anyị na-achọ ya na akwụkwọ: nke a bụ Tọgharia na elekere njikwa.

Dị ka e kwuru n'elu, ọ dabara nke ọma, akụkụ kasị sie ike nke isiokwu clocking bụ ndị sitere na STM mere anyị, nke anyị na-ekele ha nke ukwuu (ọzọkwa, m ga-enye njikọ. Ebe nrụọrụ weebụ Di Halt, iji mee ka o doo anya otú ọ dị mgbagwoju anya). Naanị ndebanye aha anyị chọrọ maka ime ka imechi elekere anya (Mpempepe Elekere Enable Registers). Mbụ, ka anyị chọta isi adreesị nke RCC, ọ bụ na nnọọ mmalite nke "Memory Map":

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

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

Ma wee pịa njikọ ebe ị na-agbalị ịchọta ihe dị na efere ahụ, ma ọ bụ, nke ka mma, gaa na nkọwa nke ndekọ ndị na-enyere aka site na ngalaba banyere. mee ka ndekọ. Ebe anyị ga-ahụ RCC_APB1ENR na RCC_APB2ENR:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Na ha, ya mere, nwere ibe n'ibe gụnyere clocking nke SPI2, IOPB (I/O Port B) na ndị ọzọ ọrụ (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;

Enwere ike ịchọta koodu ikpeazụ ebe a.

Ọ bụrụ na ị nwere ohere na ọchịchọ ịnwale, jikọọ DM634 dị ka nke a: DAI na PB15, DCK na PB13, LAT na PB14. Anyị na-enye onye ọkwọ ụgbọ ala ike site na 5 volts, echefula ijikọ ala.

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

STM8 PWM

PWM na STM8

Mgbe m na-eme atụmatụ naanị isiokwu a, ekpebiri m, dị ka ihe atụ, iji gbalịa ịmụta ụfọdụ ọrụ nke mgbawa na-amaghị nke ọma na-eji naanị akwụkwọ data, ka m wee ghara ịkwụsị na onye na-emepụta akpụkpọ ụkwụ na-enweghị akpụkpọ ụkwụ. STM8 dị mma maka ọrụ a: nke mbụ, enwere m bọọdụ ndị China nwere STM8S103, na nke abụọ, ọ naghị ewu ewu nke ukwuu, yabụ ọnwụnwa ịgụ na ịchọta azịza na ịntanetị dabere na enweghị azịza ndị a.

Ihe mgbawa nwekwara akwụkwọ data и akwụkwọ ntuziaka RM0016, na mbụ e nwere pinout na aha adreesị, na nke abụọ - ihe ọ bụla ọzọ. A haziri STM8 na C na IDE dị egwu ST Visual Mmepe.

Clocking na I/O

Site na ndabara, STM8 na-arụ ọrụ na ugboro 2 MHz, nke a ga-edozirịrị ozugbo.

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
HSI (High Speed ​​​​Internal) elekere
A na-enweta akara elekere HSI site na oscillator 16 MHz RC dị n'ime nwere nkesa mmemme (1 ruo 8). Etinyere ya na ndekọ nkesa elekere (CLK_CKDIVR).
Mara: na mbido, a na-ahọrọ oscillator HSI RC nwere nkesa 8 dị ka isi mmalite nke mgbama elekere.

Anyị na-ahụ adreesị ndekọ na mpempe akwụkwọ data, nkọwa na refman wee hụ na ekwesịrị ikpochapụ ndekọ ahụ:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Ebe anyị ga-agba ọsọ PWM wee jikọọ LEDs, ka anyị lelee pinout:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Ihe mgbawa ahụ dị ntakịrị, ọtụtụ ọrụ na-akwụsịtụ n'otu ntụtụ. Ihe dị na brackets square bụ "ọrụ ọzọ", a na-atụgharị ya site na "nhọrọ bytes" (bytes nhọrọ) - ihe dị ka Atmega fuses. Ị nwere ike ịgbanwe ụkpụrụ ha programmatically, ma ọ dịghị mkpa, n'ihi na A na-arụ ọrụ ọhụrụ a naanị ka ịmalitegharịchara ya. Ọ dị mfe iji ST Visual Programmer (butere na Visual Develop), nke nwere ike ịgbanwe bytes ndị a. Pinout na-egosi na CH1 na CH2 ntụtụ nke oge mbụ na-ezobe na brackets square; ọ dị mkpa ịtọ AFR1 na AFR0 bits na STVP, nke abụọ ga-ebufekwa mmepụta CH1 nke oge nke abụọ site na PD4 gaa na PC5.

Ya mere, ntụtụ 6 ga-achịkwa LEDs: PC6, PC7 na PC3 maka oge mbụ, PC5, PD3 na PA3 maka nke abụọ.

Ịtọlite ​​ntụtụ I/O n'onwe ha na STM8 dị mfe na ezi uche karịa na STM32:

  • maara nke ọma site na ndekọ ntụziaka data Atmega DDR (Ndebanye aha ntuziaka data): 1 = mmepụta;
  • ndekọ nchịkwa nke mbụ CR1, mgbe mmepụta, na-edozi ọnọdụ push-pull (1) ma ọ bụ oghere oghere (0); ebe m na-ejikọta LEDs na mgbawa na cathodes, m na-ahapụ zeros ebe a;
  • ndekọ nchịkwa nke abụọ CR2, mgbe mmepụta, na-edozi ọsọ elekere: 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

Ntọala PWM

Nke mbụ, ka anyị kọwapụta okwu ndị a:

  • PWM Ugboro – ugboro nke ngụ oge na-akọrọ;
  • Bugharịa akpaaka, AR - ọnụ ahịa nwere ike ibugharị nke onye ngụ oge ga-agụta (oge pulse);
  • Mmelite mmemme, UEV - ihe omume na-eme mgbe oge gụchara AR;
  • Usoro ọrụ PWM - okirikiri ọrụ PWM, nke a na-akpọkarị "ihe kpatara ọrụ";
  • Were/Tụlee Uru - uru maka ijide / ntụnyere, nke oge gụpụtara ya ga-eme ihe (n'ihe banyere PWM, ọ na-atụgharị mgbama mmepụta);
  • Bugharịa Uru – uru ebugoro. Tulee uru enweghị ike ịgbanwe mgbe ngụ oge na-akụ, ma ọ bụghị ya, okirikiri PWM ga-agbaji. Ya mere, a na-etinye ụkpụrụ ebugharị ọhụrụ na nchekwa ma dọpụta ya mgbe ngụ oge ruru na njedebe nke ngụkọ ya wee tọgharịa;
  • N'akụkụ kwadoro и Ụdị agbakọrọ n'etiti - nhazi n'akụkụ oke na n'etiti, dị ka Atmel's PWM ngwa ngwa и PWM ziri ezi-usoro.
  • OCiREF, Mmepụta atụnyere nrịbama ntụaka - mgbama mmepụta ihe, n'ezie, ihe na-egosi na ntụtụ kwekọrọ na ọnọdụ PWM.

Dị ka o doro anya na pinout, oge abụọ nwere ikike PWM - nke mbụ na nke abụọ. Ha abụọ bụ 16-bit, nke mbụ nwere ọtụtụ atụmatụ ndị ọzọ (karịsịa, ọ nwere ike ịgụta ma elu na ala). Anyị kwesịrị ma na-arụ ọrụ hà, otú ahụ ka m kpebiri na-amalite na o doro anya na ndị dara ogbenye nke abụọ, ka ọ ghara na mberede na-eji ihe na-adịghị n'ebe ahụ. Ụfọdụ nsogbu bụ na nkọwa nke ọrụ PWM nke oge niile na akwụkwọ ntuziaka dị n'isiakwụkwọ banyere oge mbụ (17.5.7 PWM Mode), yabụ ị ga-awụlikwa elu na azụ n'ime akwụkwọ ahụ oge niile.

PWM na STM8 nwere uru dị mkpa karịa PWM na Atmega:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
PWM kwadoro oke
Nhazi akaụntụ site na ala ruo n'elu
Ngụ mgbago elu na-arụ ọrụ ma ọ bụrụ na ekpochapụ ntakịrị DIR dị na ndebanye aha TIM_CR1
Ihe nlele:
Ihe atụ na-eji ọnọdụ PWM mbụ. A na-ejide akara nrịbama PWM OCIREF ogologo oge TIM1_CNT <TIM1_CCRi. Ma ọ bụghị ya, ọ na-ewe obere ọkwa. Ọ bụrụ na uru ntụnyere dị na ndebanye aha TIM1_CCRi karịrị uru akpaaka (Tim1_ARR ndebanye aha), akara OciREF na-ejide na 1. Ọ bụrụ na uru ntụnyere bụ 0, OCIREF na-ejide na efu....

STM8 ngụ oge n'oge emelite omume buru ụzọ lelee tụnyere uru, na naanị mgbe ahụ na-emepụta akara ngosi. Ngụ oge Atmega na-ebu ụzọ kposara wee tụnye ya, na-ebute ya compare value == 0 mmepụta bụ agịga, nke a ga-emerịrị n'ụzọ ụfọdụ (dịka ọmụmaatụ, site n'iji mmemme tụgharịa uche).

Yabụ ihe anyị chọrọ ime: 8-bit PWM (AR == 255), na-agụta site na ala ruo n'elu, nhazi n'akụkụ oke. Ebe ọ bụ na ejikọrọ ọkụ ọkụ na mgbawa site na cathodes, PWM kwesịrị iwepụta 0 (LED na) ruo mgbe tụnyere uru na 1 mgbe.

Anyị agụọla banyere ụfọdụ Ọnọdụ PWM, yabụ anyị na-ahụ akwụkwọ ndekọ achọrọ nke oge nke abụọ site n'ịchọ n'akwụkwọ ntuziaka maka nkebi ahịrịokwu a (18.6.8 - TIMx_CCMR1):

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
110: Ọnọdụ PWM mbụ - mgbe a na-agụta site na ala ruo n'elu, ọwa nke mbụ na-arụ ọrụ mgbe TIMx_CNT <TIMx_CCR1. Ma ọ bụghị ya, ọwa nke mbụ anaghị arụ ọrụ. 1: Ụdị PWM nke abụọ - mgbe a na-agụta site na ala ruo n'elu, ọwa nke mbụ anaghị arụ ọrụ mgbe TIMx_CNT <TIMx_CCR111. Ma ọ bụghị ya, ọwa mbụ na-arụ ọrụ.

Ebe ọ bụ na ejikọtara LEDs na MK site na cathodes, ọnọdụ nke abụọ dabara anyị (nke mbụ kwa, mana anyị amaghị nke ahụ).

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Bit 3 OC1PE: Kwado eburu ntụtụ 1
0: Akwụsịla ndebanye aha bu ụzọ na TIMx_CCR1. Ị nwere ike idegara TIMx_CCR1 akwụkwọ n'oge ọ bụla. Uru ọhụrụ na-arụ ọrụ ozugbo.
1: Agbanyere aha mbụ na TIMx_CCR1. Gụọ/dee arụmọrụ nweta ndebanye aha bu ụzọ. A na-ebunye uru TIMx_CCR1 etinyegoro n'ime ndebanye aha onyinyo n'oge mmemme mmelite ọ bụla.
*Rịba ama: Ka ọnọdụ PWM rụọ ọrụ nke ọma, a ga-agbanyerịrị akwụkwọ ndebanye aha. Nke a adịghị mkpa na otu ọnọdụ mgbaama (obere OPM bit na ndebanye aha TIMx_CR1).

Ọ dị mma, ka anyị gbanye ihe niile anyị chọrọ maka ọwa atọ nke oge nke abụọ:

#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 nwere ndekọ abụọ-bit asatọ, ihe niile dị mfe:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Oge nke abụọ nwere ike ịgụta naanị site na ala ruo n'elu, nhazi n'akụkụ oke, ọ dịghị ihe ọ bụla kwesịrị ịgbanwe. Ka anyị dobe nkesa ugboro ugboro, dịka ọmụmaatụ, na 256. Maka oge nke abụọ, a na-edozi nkesa na ndekọ TIM2_PSCR ma bụrụ ike nke abụọ:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Ihe niile fọdụrụ bụ ịgbanye nkwubi okwu na oge nke abụọ n'onwe ya. A na-edozi nsogbu mbụ site na ndekọ Were/ tulee Kwado: enwere ọwa abụọ, atọ gbasasịrị n'ofe ha asymmetrically. N'ebe a, anyị nwekwara ike ịmụta na ọ ga-ekwe omume ịgbanwe polarity nke mgbaàmà, i.e. na ụkpụrụ, ọ ga-ekwe omume iji PWM Mode 1. Anyị na-ede:

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

N'ikpeazụ, anyị na-amalite ngụ oge na ndebanye aha TIMx_CR1:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Ka anyị dee analogue dị mfe nke AnalogWrite (), nke ga-ebufe ezigbo ụkpụrụ na ngụ oge maka ntụnyere. A na-akpọ aha ndekọ aha ndị ahụ nke ọma Were / tulee ndekọ, enwere abụọ n'ime ha maka ọwa ọ bụla: 8 bits dị ala na TIM2_CCRxL na ndị dị elu na TIM2_CCRxH. Ebe ọ bụ na anyị ekepụtala PWM 8-bit, o zuru ezu ide naanị ntakịrị ntakịrị:

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

Onye na-agụ nke ọma ga-achọpụta na anyị nwere PWM nwere ntụpọ, enweghị ike ịmepụta 100% njupụta (na ọnụ ahịa kachasị elu nke 255, a na-atụgharị mgbaàmà maka otu oge okirikiri). Maka LEDs nke a adịghị mkpa, na onye na-agụ akwụkwọ nwere ike ịma otú e si edozi ya.

PWM na oge nke abụọ na-arụ ọrụ, ka anyị gaa na nke mbụ.

Ngụ oge mbụ nwere kpọmkwem otu ibe n'ibe n'otu ndekọ (ọ bụ naanị na ibe n'ibe ndị fọdụrụ "echekwabara" na nke abụọ n'oge na-arụsi ọrụ ike na mbụ maka ụdị ihe ọ bụla dị elu). Ya mere, o zuru ezu ịchọta adreesị nke otu ndekọ aha na akwụkwọ data ma detuo koodu ahụ. Ọfọn, gbanwee uru nke nkesa ugboro ugboro, n'ihi na ... onye na-agụ oge mbụ chọrọ ịnata ọ bụghị ike nke abụọ, mana ọnụ ahịa 16-bit kpọmkwem na ndekọ abụọ Prescaler High и Low. Anyị na-eme ihe niile na ... oge mbụ anaghị arụ ọrụ. Kedu ihe ọ bụ?

Enwere ike idozi nsogbu ahụ naanị site n'ịleba anya na ngalaba dum gbasara ndekọ nchịkwa nke ngụ oge 1, ebe anyị na-achọ nke oge nke abụọ na-enweghị. A ga-enwe 17.7.30 ndebanye aha (TIM1_BKR), ebe enwere ntakịrị ihe a:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Kwado mmepụta isi

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Nke ahụ bụ ihe niile n'ezie ugbu a, koodu Ebe ahụ.

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

STM8 Multiplex

Multiplexing na STM8

Obere oru ngo nke atọ bụ ijikọ RGB LED asatọ na oge nke abụọ na ọnọdụ PWM ma mee ka ha gosipụta agba dị iche iche. Ọ dabere na echiche nke LED multiplexing, nke bụ na ọ bụrụ na ịgbanwuo ma gbanyụọ LEDs ngwa ngwa, ọ ga-adị anyị ka ha na-anọ mgbe niile (ntachi obi nke ọhụụ, inertia nke nghọta anya). Emere m otu oge ihe dị ka nke a na Arduino.

Algọridim ọrụ dị ka nke a:

  • jikọọ anode nke mbụ RGB LED;
  • gbanye ya, na-eziga akara ngosi dị mkpa na cathodes;
  • chere ruo mgbe ọgwụgwụ nke PWM okirikiri;
  • jikọọ anode nke abụọ RGB LED;
  • gbanye ya...

Ọfọn, wdg. N'ezie, maka ọrụ mara mma ọ chọrọ ka ejikọrọ anode na LED "na-agbanye" n'otu oge ahụ. Ọfọn, ma ọ bụ fọrọ nke nta. N'ọnọdụ ọ bụla, anyị kwesịrị ide koodu nke ga-emepụta ụkpụrụ na ọwa atọ nke oge nke abụọ, gbanwee ha mgbe UEV ruru, ma n'otu oge ahụ gbanwee RGB LED na-arụ ọrụ ugbu a.

Ebe ọ bụ na ngbanwe LED na-akpaghị aka, anyị kwesịrị ịmepụta "ebe nchekwa vidiyo" nke onye nkwụsịtụ ga-enweta data. Nke a bụ usoro dị mfe:

uint8_t colors[8][3];

Iji gbanwee agba nke otu LED, ọ ga-ezuru iji dee ụkpụrụ achọrọ n'ime usoro a. Na mgbanwe ga-abụ maka ọnụ ọgụgụ nke LED na-arụ ọrụ

uint8_t cnt;

Demux

Maka ịgbazigharị nke ọma, anyị chọrọ, n'ụzọ zuru oke, CD74HC238 demultiplexer. Demultiplexer - mgbawa na-arụ ọrụ na ngwaike <<. Site na ntinye ntinye atọ (bits 0, 1 na 2) anyị na-enye ya ọnụọgụ atọ-bit X, na nzaghachi ọ na-eme ka nọmba mmepụta rụọ ọrụ (1<<X). A na-eji ihe ndị fọdụrụ nke mgbawa mee ihe iji mee ka nhazi ahụ dum. Anyị chọrọ mgbawa a ọ bụghị naanị iji belata ọnụ ọgụgụ nke ntụtụ nke microcontroller, kamakwa maka nchekwa - ka ọ ghara ịgbanye ọkụ ọkụ na mberede karịa ka o kwere mee ma ghara ịkụ MK ọkụ. Ihe mgbawa ahụ na-efu otu penny ma ekwesịrị idobe ya na kọbọd ọgwụ ụlọ gị mgbe niile.

CD74HC238 anyị ga-ahụ maka ịnye voltaji na anode nke LED achọrọ. Na multiplex zuru ezu, ọ ga-enye voltaji na kọlụm site na P-MOSFET, ma na ngosi a ọ ga-ekwe omume ozugbo, n'ihi na ọ na-adọta 20 mA, dị ka kacha kacha ratings na mpempe akwụkwọ data. Site na Mpempe akwụkwọ CD74HC238 anyị chọrọ pinouts na akwụkwọ aghụghọ a:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
H = elu voltaji larịị, L = obere voltaji larịị, X – echekwala

Anyị na-ejikọta E2 na E1 na ala, E3, A0, A1 na A3 na pin PD5, PC3, PC4 na PC5 nke STM8. Ebe ọ bụ na tebụl dị n'elu nwere ma ọkwa dị ala na nke dị elu, anyị na-ahazi ntụtụ ndị a dị ka ntụtụ-adọkpụ.

PWM

A na-ahazi PWM na oge nke abụọ n'otu ụzọ ahụ dị na akụkọ gara aga, yana ọdịiche abụọ:

Nke mbụ, anyị kwesịrị ịgbanye nkwụsịtụ ahụ Melite mmemme (UEV) nke ga-akpọ ọrụ na-atụgharị ọkụ ọkụ na-arụ ọrụ. A na-eme nke a site n'ịgbanwe ntakịrị Kwado nkwụsịtụ melite n'akwụkwọ ndekọ aha nwere aha

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
Kwụsị ndebanye aha

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Nke abụọ dị iche na-metụtara onu nke multiplexing, dị ka ghosting - parasitic ọkụ nke diodes. N'ọnọdụ anyị, ọ nwere ike ịpụta n'ihi na ngụ oge, ebe ọ kpatara nkwụsịtụ na UEV, na-aga n'ihu na-akara aka, na nkwụsịtụ njikwa enweghị oge iji gbanwee LED tupu oge amalite ide ihe na atụdo. Iji luso nke a ọgụ, ị ga-atụgharị mgbagha ahụ (0 = nchapụta kachasị, 255 = ọ nweghị ihe na-enwu) wee zere ụkpụrụ okirikiri ọrụ dị oke egwu. Ndị ahụ. hụ na mgbe UEV gachara, LED na-apụ kpamkpam maka otu okirikiri PWM.

Na-agbanwe polarity:

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

Zere ịtọ r, g na b na 255 ma cheta ịtụgharị ha mgbe ị na-eji ha.

Na-akwụsị

Ihe kacha mkpa nke nkwụsịtụ bụ na n'ọnọdụ ụfọdụ mgbawa na-akwụsị ime mmemme bụ isi wee kpọọ ụfọdụ ọrụ mpụga. Nkwụsị na-eme n'ihi mmetụta mpụga ma ọ bụ nke ime, gụnyere oge.

Mgbe mbụ anyị kere ọrụ na ST Visual Develop, na mgbakwunye na main.c anyị nwetara windo nwere faịlụ dị omimi stm8_interrupt_vector.c, na-akpaghị aka gụnyere na oru ngo. Na faịlụ a, a na-ekenye ọrụ maka nkwụsịtụ nke ọ bụla NonHandledInterrupt. Anyị kwesịrị ijikọ ọrụ anyị na nkwụsịtụ achọrọ.

Akwụkwọ data ahụ nwere tebụl nke vectors nkwụsịtụ, ebe anyị na-ahụ ndị anyị chọrọ:

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8
13 TIM2 nwelite/ njupụta
14 TIM2 jide/ tulee

Anyị kwesịrị ịgbanwe LED na UEV, yabụ anyị kwesịrị ịkwụsị #13.

N'ihi ya, nke mbụ, na faịlụ stm8_interrupt_vector.c gbanwee aha ndabara nke ọrụ maka nkwụsịtụ Nke 13 (IRQ13) ka ọ bụrụ nke gị:

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

Nke abụọ, anyị ga-emepụta faịlụ main.h ya na ọdịnaya ndị a:

#ifndef __MAIN_H
#define __MAIN_H

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

N'ikpeazụ, dee ọrụ a n'ime gị 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;
}

Naanị ihe fọdụrụ bụ ime ka nkwụsịtụ kwụsị. A na-eme nke a site na iji iwu mkpokọta rim - ị ga-achọ ya n'ime Mmemme ntuziaka:

//enable interrupts
_asm("rim");

Iwu ọzọ onye na-agbakọta bụ sim – gbanyụọ nkwụsịtụ. A ga-agbanyụrịrị ha mgbe a na-ede ụkpụrụ ọhụrụ na "ebe nchekwa vidiyo", ka nkwụsịtụ kpatara n'oge na-ezighị ezi ghara imebi usoro ahụ.

Koodu niile - na GitHub.

Gụọ akwụkwọ data 2: SPI na STM32; PWM, ngụ oge na nkwụsị na STM8

Ọ bụrụ na ọ dịkarịa ala mmadụ hụrụ akụkọ a bara uru, mgbe ahụ, edeghị m ya n'efu. M ga-enwe obi ụtọ ịnata nkwupụta na nkwupụta, m ga-agbalị ịza ihe niile.

isi: www.habr.com

Tinye a comment