Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

В l-ewwel parti Ippruvajt ngħid lill-inġiniera tal-elettronika tal-passatemp li trabbew minn Arduino pants kif u għaliex għandhom jaqraw datasheets u dokumentazzjoni oħra għall-mikrokontrolluri. It-test irriżulta li kien kbir, għalhekk wiegħed li nuri eżempji prattiċi f'artiklu separat. Ukoll, sejjaħ lilu nnifsu faqqiegħ tal-ħalib...

Illum ser nuruk kif tuża datasheets biex issolvi pjuttost sempliċi, iżda meħtieġa għal ħafna proġetti, kompiti fuq kontrolluri STM32 (Blue Pill) u STM8. Il-proġetti demo kollha huma ddedikati għall-LEDs favoriti tiegħi, aħna se nixgħelhom fi kwantitajiet kbar, li għalihom ikollna nużaw kull xorta ta 'periferali interessanti.

It-test għal darb'oħra rriżulta li kien enormi, għalhekk għall-konvenjenza qed nagħmel il-kontenut:

STM32 Blue Pill: 16-il LED b'sewwieq DM634
STM8: Twaqqif ta 'sitt pins PWM
STM8: 8 LEDs RGB fuq tliet pinnijiet, tinterrompi

Ċaħda ta 'responsabbiltà: M'iniex inġinier, ma nippretendux li għandi għarfien profond fl-elettronika, l-artiklu huwa maħsub għal dilettanti bħali. Fil-fatt, jiena qiest lili nnifsi sentejn ilu bħala l-udjenza fil-mira. Kieku mbagħad xi ħadd qalli li datasheets fuq ċippa mhux familjari ma kinux tal-biża 'taqra, ma kontx inqatta' ħafna ħin infittex xi biċċiet ta 'kodiċi fuq l-Internet u nivvinta krozzi b'imqass u tejp li jwaħħal.

Il-fokus ta 'dan l-artikolu huwa fuq datasheets, mhux proġetti, għalhekk il-kodiċi jista' ma jkunx pulit ħafna u ħafna drabi skomdi. Il-proġetti nfushom huma sempliċi ħafna, għalkemm adattati għall-ewwel familjarità maċ-ċippa l-ġdida.

Nittama li l-artiklu tiegħi jgħin lil xi ħadd fi stadju simili ta 'immersjoni fil-passatemp.

STM32

16-il LED b'DM634 u SPI

Proġett żgħir li juża Blue Pill (STM32F103C8T6) u sewwieq LED DM634. Bl-użu ta ' datasheets, aħna ser insemmu s-sewwieq, il-portijiet STM IO u nikkonfiguraw SPI.

DM634

Ċippa Tajwaniża b'16-il output PWM ta '16-bit, tista' tiġi konnessa fi ktajjen. Il-mudell low-end 12-bit huwa magħruf minn proġett domestiku Lightpack. F'ħin wieħed, jagħżlu bejn id-DM63x u t-TLC5940 magħruf sew, għażilt DM għal diversi raġunijiet: 1) TLC fuq Aliexpress definittivament huwa falz, iżda dan mhuwiex; 2) DM għandu PWM awtonomu bil-ġeneratur tal-frekwenza tiegħu stess; 3) jista 'jinxtara rħas f'Moska, aktar milli stennija għal pakkett minn Ali. U, ovvjament, kien interessanti li titgħallem kif tikkontrolla ċ-ċippa lilek innifsek, aktar milli tuża librerija lesta. Iċ-ċipep issa huma ppreżentati prinċipalment fil-pakkett SSOP24; huma faċli biex issaldjar ma 'adapter.

Peress li l-manifattur huwa Tajwaniż, datasheet iċ-ċippa hija miktuba bl-Ingliż Ċiniż, li jfisser li se jkun pjaċevoli. L-ewwel inħarsu lejn il-pinout (Konnessjoni tal-Pin) biex tifhem liema riġel tgħaqqad x'għandek, u deskrizzjoni tal-brilli (Deskrizzjoni tal-Pin). 16-il pin:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Sorsi DC Sink (Ixxotta Miftuħa)

Sink / Output open-drain – drain; sors ta 'kurrent inflowing; l-output huwa konness ma 'l-art fl-istat attiv - l-LEDs huma konnessi mas-sewwieq permezz ta' katodi. Elettrikament, dan, ovvjament, mhuwiex "fossa miftuħa" (drenaġġ miftuħ), iżda fid-datasheets din id-denominazzjoni għal pinnijiet fil-modalità tad-drenaġġ spiss tinstab.

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Reżisturi esterni bejn REXT u GND biex jiġi stabbilit il-valur tal-kurrent tal-ħruġ

Reżistur ta 'referenza huwa installat bejn il-pin REXT u l-art, li jikkontrolla r-reżistenza interna tal-outputs, ara l-graff f'paġna 9 tad-datasheet. Fid-DM634, din ir-reżistenza tista 'tiġi kkontrollata wkoll permezz ta' softwer, li tistabbilixxi l-luminożità ġenerali (luminożità globali); Mhux se nidħol fid-dettalji f'dan l-artikolu, jien ser inpoġġi biss resistor ta '2.2 - 3 kOhm hawn.

Biex tifhem kif tikkontrolla ċ-ċippa, ejja nħarsu lejn id-deskrizzjoni tal-interface tal-apparat:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Iva, hawn hu, Ċiniż Ingliż fil-glorja kollha tiegħu. It-traduzzjoni ta 'dan hija problematika, tista' tifhimha jekk tixtieq, iżda hemm mod ieħor - ħares lejn kif il-konnessjoni mat-TLC5940 funzjonalment simili hija deskritta fid-datasheet:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
... Tliet pinnijiet biss huma meħtieġa biex tiddaħħal id-dejta fl-apparat. It-tarf li jogħla tas-sinjal SCLK ibiddel id-dejta mill-pin SIN għar-reġistru intern. Wara li d-dejta kollha tkun ġiet mgħobbija, sinjal XLAT għoli qasir iwaħħal id-dejta trasferita sekwenzjali fir-reġistri interni. Reġistri interni huma gradi triggered mil-livell tas-sinjal XLAT. Id-dejta kollha tiġi trażmessa l-aktar bit sinifikanti l-ewwel.

Lukkett – lukkett/lukkett/lock.
Xifer li jogħlew – it-tarf ta' quddiem tal-polz
MSB l-ewwel – l-aktar sinifikanti (l-aktar fuq ix-xellug) bit-quddiem.
għall-arloġġ data – jittrasmetti d-data b'mod sekwenzjali (bit b'bit).

Word lukkett spiss jinstab fid-dokumentazzjoni għaċ-ċipep u jiġi tradott b'diversi modi, għalhekk biex nifhem jien se nippermetti lili nnifsi

programm edukattiv żgħirIs-sewwieq LED huwa essenzjalment reġistru shift. "Shift" (shift) fl-isem - moviment bit-bit tad-data ġewwa l-apparat: kull bit ġdid imbuttat ġewwa jimbotta l-katina kollha 'l quddiem quddiemha. Peress li ħadd ma jrid josserva t-teptip kaotiku tal-LEDs matul ix-xift, il-proċess iseħħ f'reġistri buffer separati mir-reġistri tax-xogħol b'umidifikatur (lukkett) hija tip ta 'kamra ta' stennija fejn il-bits huma rranġati fis-sekwenza mixtieqa. Meta kollox ikun lest, ix-shutter jinfetaħ u l-bits imorru għax-xogħol, jissostitwixxu l-lott preċedenti. Kelma lukkett fid-dokumentazzjoni għall-mikroċirkwiti kważi dejjem jimplika tali umidifikatur, irrispettivament minn liema kombinazzjonijiet huwa użat.

Allura, it-trasferiment tad-dejta lejn id-DM634 jitwettaq bħal dan: issettja l-input DAI għall-valur tal-bit l-aktar sinifikanti tal-LED 'il bogħod, iġbed DCK 'l fuq u' l isfel; issettja l-input DAI għall-valur tal-bit li jmiss, iġbed DCK; u hekk sakemm il-bits kollha jkunu ġew trażmessi (imqabbad), wara li niġbdu LAT. Dan jista' jsir manwalment (bit-bang), iżda huwa aħjar li tuża interface SPI imfassal apposta għal dan, peress li huwa ppreżentat fuq l-STM32 tagħna f'żewġ kopji.

Pillola Blu STM32F103

Introduttorja: Il-kontrolluri STM32 huma ħafna aktar kumplessi minn Atmega328 milli jistgħu jidhru tal-biża '. Barra minn hekk, għal raġunijiet ta 'ffrankar tal-enerġija, kważi l-periferali kollha huma mitfija fil-bidu, u l-frekwenza tal-arloġġ hija 8 MHz mis-sors intern. Fortunatament, il-programmaturi STM kitbu kodiċi li jġib iċ-ċippa sa 72 MHz "ikkalkulat", u l-awturi ta 'l-IDEs kollha li naf inkludewha fil-proċedura ta' inizjalizzazzjoni, għalhekk m'għandniex bżonn arloġġ (iżda tista' jekk verament trid). Imma jkollok tixgħel il-periferali.

Dokumentazzjoni: Blue Pill hija mgħammra biċ-ċippa popolari STM32F103C8T6, hemm żewġ dokumenti utli għaliha:

Fid-datasheet nistgħu nkunu interessati fi:

  • Pinouts - chip pinouts - f'każ li niddeċiedu li nagħmlu l-bordijiet aħna stess;
  • Mappa tal-memorja – mappa tal-memorja għal ċippa speċifika. Il-Manwal ta’ Referenza għandu mappa għal-linja kollha, u jsemmi reġistri li tagħna m’għandux.
  • Tabella tad-Definizzjonijiet tal-Brilli – li telenka l-funzjonijiet ewlenin u alternattivi tal-brilli; għall-"pillola blu" tista 'ssib stampi aktar konvenjenti fuq l-Internet b'lista ta' labar u l-funzjonijiet tagħhom. Għalhekk, aħna immedjatament google Blue Pill pinout u jżommu din l-istampa fil-idejn:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
NB: kien hemm żball fl-istampa mill-Internet, li ġie nnutat fil-kummenti, grazzi għal dak. L-istampa ġiet sostitwita, iżda din hija lezzjoni - huwa aħjar li tiċċekkja l-informazzjoni mhux minn datasheets.

Inneħħu d-datasheet, niftħu l-Manwal ta’ Referenza, u minn issa ’l quddiem nużawha biss.
Proċedura: nittrattaw input/output standard, ikkonfiguraw SPI, nixgħel il-periferali meħtieġa.

Input Output

Fuq l-Atmega328, I/O huwa implimentat b'mod estremament sempliċi, u huwa għalhekk li l-abbundanza ta 'għażliet STM32 tista' tkun konfuża. Issa għandna bżonn biss konklużjonijiet, iżda anke dawn għandhom erba 'għażliet:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
drenaġġ miftuħ, push-pull, push-pull alternattiv, drain miftuħ alternattiv

"Iġbed-imbotta" (push-pull) hija l-output tas-soltu mill-Arduino, il-pin jista 'jieħu l-valur jew GĦOLJA jew BAXX. Iżda bi "fossa miftuħa" hemm diffikultajiet, għalkemm fil-fatt kollox huwa sempliċi hawn:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Konfigurazzjoni tal-output / meta l-port jiġi assenjat għall-output: / output buffer attivat: / – mod ta’ drain miftuħ: “0” fir-reġistru tal-ħruġ jippermetti N-MOS, “1” fir-reġistru tal-ħruġ iħalli l-port fil-modalità Hi-Z ( P-MOS mhux attivat ) / – modalità push-pull: “0” fir-reġistru tal-ħruġ jattiva N-MOS, “1” fir-reġistru tal-ħruġ jattiva P-MOS.

Id-differenza kollha bejn il-fossa miftuħa (drenaġġ miftuħ) minn “push-pull” (push-pull) hija li fl-ewwel pin ma tistax taċċetta l-istat GĦOLJA: meta tikteb waħda fir-reġistru tal-output, tmur fil-mod ta 'reżistenza għolja (impedenza għolja, Hi-Z). Meta tikteb żero, il-pin jaġixxi l-istess fiż-żewġ modi, kemm loġikament kif ukoll elettrikament.

Fil-modalità tal-ħruġ normali, il-pin sempliċement ixandar il-kontenut tar-reġistru tal-ħruġ. Fl-"alternattiva" hija kkontrollata mill-periferali korrispondenti (ara 9.1.4):

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Jekk bit tal-port huwa kkonfigurat bħala pin ta 'funzjoni alternattiva, ir-reġistru tal-pin huwa diżattivat u l-pin huwa konness mal-pin periferali.

Il-funzjonalità alternattiva ta’ kull pin hija deskritta fi Definizzjonijiet tal-Pin Id-datasheet tinsab fuq l-immaġini mniżżla. Għall-mistoqsija dwar x'għandek tagħmel jekk pin ikollu diversi funzjonijiet alternattivi, it-tweġiba tingħata b'nota f'qiegħ il-paġna fid-datasheet:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Jekk periferali multipli jużaw l-istess pin, biex jiġi evitat kunflitt bejn funzjonijiet alternattivi, għandu jintuża periferali wieħed biss kull darba, toggled bl-użu tal-periferali arloġġ enable bit (fir-reġistru RCC xieraq).

Fl-aħħarnett, labar fil-modalità tal-ħruġ għandhom ukoll veloċità tal-arloġġ. Din hija karatteristika oħra li tiffranka l-enerġija; fil-każ tagħna, aħna biss issettjawha għall-massimu u ninsewha.

Allura: qed nużaw SPI, li jfisser li żewġ pinnijiet (b'dejta u b'sinjal ta 'arloġġ) għandhom ikunu "funzjoni alternattiva push-pull", u ieħor (LAT) għandu jkun "push-pull regolari". Imma qabel tassenjahom, ejja nittrattaw SPI.

SPI

Programm ieħor edukattiv żgħir

SPI jew Serial Peripheral Interface (interface periferali serjali) huwa interface sempliċi u effettiv ħafna għall-konnessjoni ta 'MK ma' MKs oħra u d-dinja ta 'barra b'mod ġenerali. Il-prinċipju tat-tħaddim tiegħu diġà ġie deskritt hawn fuq, fejn dwar is-sewwieq LED Ċiniż (fil-manwal ta 'referenza, ara t-taqsima 25). SPI jista 'jopera fil-modalità master ("master") u slave ("slave"). SPI għandu erba 'kanali bażiċi, li mhux kollha jistgħu jintużaw:

  • MOSI, Output Master / Input Slav: dan il-pin jittrasmetti data fil-modalità master, u jirċievi data fil-modalità slave;
  • MISO, Master Input / Slave Output: għall-kuntrarju, jirċievi fil-kaptan, u jittrasmetti fl-iskjav;
  • SCK, Serial Clock: jistabbilixxi l-frekwenza tat-trażmissjoni tad-dejta fil-kaptan jew jirċievi sinjal tal-arloġġ fl-iskjav. Essenzjalment tolqot taħbita;
  • SS, Slave Select: bl-għajnuna ta 'dan il-kanal, l-iskjav jaf li xi ħaġa hija mfittxija mingħandu. Fuq STM32 tissejjaħ NSS, fejn N = negattiv, i.e. il-kontrollur isir skjav jekk ikun hemm art f'dan il-kanal. Jikkombina tajjeb mal-modalità Open Drain Output, iżda dik hija storja oħra.

Bħal kull ħaġa oħra, SPI fuq STM32 hija rikka f'funzjonalità, li tagħmilha kemmxejn diffiċli biex tinftiehem. Pereżempju, tista 'taħdem mhux biss ma' SPI, iżda wkoll b'interface I2S, u fid-dokumentazzjoni d-deskrizzjonijiet tagħhom huma mħallta, huwa meħtieġ li jinqata 'l-eċċess f'waqtu. Il-kompitu tagħna huwa estremament sempliċi: għandna bżonn biss li nibagħtu data bl-użu ta' MOSI u SCK biss. Immorru għat-taqsima 25.3.4 (komunikazzjoni half-duplex, komunikazzjoni half-duplex), fejn insibu Arloġġ 1 u wajer tad-dejta unidirezzjonali 1 (sinjal ta' arloġġ 1 u fluss ta' dejta unidirezzjonali):

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
F'dan il-mod, l-applikazzjoni tuża SPI jew fil-mod ta 'trażmissjoni biss jew ta' riċeviment biss. / Il-mod ta 'trażmissjoni biss huwa simili għall-modalità duplex: id-dejta hija trażmessa fuq il-pin tat-trasmissjoni (MOSI fil-modalità master jew MISO fil-mod slave), u l-pin ta' riċeviment (MISO jew MOSI rispettivament) jista 'jintuża bħala pin I/O regolari . F'dan il-każ, l-applikazzjoni teħtieġ biss li tinjora l-buffer Rx (jekk tinqara, ma jkun hemm l-ebda data trasferita hemmhekk).

Kbir, il-pin MISO huwa ħieles, ejja nqabbdu s-sinjal LAT miegħu. Ejja nħarsu lejn Slave Select, li fuq l-STM32 jista 'jiġi kkontrollat ​​b'mod programmatiku, li huwa estremament konvenjenti. Naqraw il-paragrafu tal-istess isem fit-taqsima 25.3.1 Deskrizzjoni Ġenerali SPI:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Kontroll tas-softwer NSS (SSM = 1) / Informazzjoni dwar l-għażla tal-iskjavi tinsab fil-bit SSI tar-reġistru SPI_CR1. Il-pin NSS estern jibqa' ħieles għal ħtiġijiet oħra ta' applikazzjoni.

Wasal iż-żmien li tikteb lir-reġistri. Iddeċidejt li nuża SPI2, tfittex l-indirizz bażi tagħha fid-datasheet - fit-taqsima 3.3 Mappa tal-Memorja:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Ukoll, ejja nibdew:

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

Iftaħ it-taqsima 25.3.3 bit-titlu li jispjega lilu nnifsu “Konfigurazzjoni ta’ SPI fil-Modalità Master”:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

1. Issettja l-frekwenza tal-arloġġ tas-serje b'bits BR[2:0] fir-reġistru SPI_CR1.

Ir-reġistri jinġabru fit-taqsima tal-manwal ta' referenza tal-istess isem. bidla fl-indirizz (Indirizz offset) għal CR1 – 0x00, b'mod awtomatiku l-bits kollha jitneħħew (Irrisettja l-valur 0x0000):

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Il-bits BR jistabbilixxu d-diviżur tal-arloġġ tal-kontrollur, u b'hekk jiddeterminaw il-frekwenza li fiha l-SPI se jopera. Il-frekwenza STM32 tagħna se tkun 72 MHz, is-sewwieq LED, skont id-datasheet tiegħu, jopera bi frekwenza sa 25 MHz, għalhekk għandna bżonn naqsmu b'erbgħa (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. Issettja l-bits CPOL u CPHA biex tiddefinixxi r-relazzjoni bejn it-trasferiment tad-dejta u l-ħin tal-arloġġ tas-serje (ara d-dijagramma f’paġna 240)

Peress li qed naqraw datasheet hawn u mhux inħarsu lejn skematiċi, ejja nagħtu ħarsa aktar mill-qrib lejn id-deskrizzjoni tat-test tal-bits CPOL u CPHA f'paġna 704 (Deskrizzjoni Ġenerali SPI):

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Fażi tal-arloġġ u polarità
Bl-użu tal-bits CPOL u CPHA tar-reġistru SPI_CR1, tista 'tagħżel b'mod programmatiku erba' relazzjonijiet ta 'ħin. Il-bit CPOL (polarità tal-arloġġ) jikkontrolla l-istat tas-sinjal tal-arloġġ meta l-ebda data ma tkun qed tiġi trażmessa. Dan il-bit jikkontrolla l-modi master u slave. Jekk CPOL jiġi reset, il-pin SCK huwa baxx fil-mod ta 'mistrieħ. Jekk il-bit CPOL huwa ssettjat, il-pin SCK huwa għoli waqt il-mod ta 'mistrieħ.
Meta l-bit CPHA (fażi tal-arloġġ) jiġi ssettjat, l-istrobe tat-trap tal-bit għoli huwa t-tieni tarf tas-sinjal SCK (li jaqa 'jekk CPOL ikun ċar, jogħlew jekk CPOL ikun issettjat). Id-dejta tinqabad mit-tieni bidla fis-sinjal tal-arloġġ. Jekk il-bit CPHA huwa ċar, l-istrobe tat-trap tal-bit għoli huwa x-xifer li jogħlew tas-sinjal SCK (xifer li jaqa 'jekk CPOL huwa ssettjat, tarf li jogħlew jekk CPOL jitneħħa). Id-dejta tinqabad mal-ewwel bidla fis-sinjal tal-arloġġ.

Wara li assorbit dan l-għarfien, naslu għall-konklużjoni li ż-żewġ bits għandhom jibqgħu żerijiet, għaliex Irridu li s-sinjal SCK jibqa 'baxx meta ma jintużax, u d-dejta tiġi trażmessa fuq ix-xifer li jogħlew tal-polz (ara Fig. Xifer Rising fid-datasheet DM634).

Mill-mod, hawn l-ewwel iltqajna ma 'karatteristika tal-vokabularju fl-iskedi tad-dejta ST: fihom il-frażi "reset the bit to zero" hija miktuba biex reset daqsxejnimma le biex tnaddaf ftit, bħal, pereżempju, Atmega.

3. Issettja l-bit DFF biex tiddetermina jekk il-blokk tad-dejta huwiex format ta '8-bit jew 16-bit

Ħadt speċifikament DM16 ta '634-il bit sabiex ma niddejjaqx bit-trażmissjoni tad-dejta PWM ta' 12-il bit, bħall-DM633. Jagħmel sens li tissettja DFF għal wieħed:

#define DFF         0x0800

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

4. Ikkonfigura l-bit LSBFIRST fir-reġistru SPI_CR1 biex tiddetermina l-format tal-blokk

LSBFIRST, kif jissuġġerixxi isimha, tikkonfigura t-trażmissjoni bl-inqas bit sinifikanti l-ewwel. Iżda DM634 irid jirċievi data li tibda mill-aktar bit sinifikanti. Għalhekk, inħalluha reset.

5. Fil-modalità tal-ħardwer, jekk ikun meħtieġ input mill-pin NSS, applika sinjal għoli għall-pin NSS matul is-sekwenza kollha tat-trasferiment tal-byte. Fil-modalità tas-softwer NSS, issettja l-bits SSM u SSI fir-reġistru SPI_CR1. Jekk il-pin NSS għandu jintuża bħala output, il-bit SSOE biss jeħtieġ li jiġi ssettjat.

Installa SSM u SSI biex tinsa dwar il-modalità tal-ħardwer NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Il-bits MSTR u SPE għandhom jiġu ssettjati (jibqgħu ssettjati biss jekk is-sinjal NSS huwa għoli)

Fil-fatt, b'dawn il-bits aħna nnominaw l-SPI tagħna bħala kaptan u nixgħluh:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI huwa kkonfigurat, ejja immedjatament niktbu funzjonijiet li jibagħtu bytes lis-sewwieq. Kompli aqra 25.3.3 "Konfigurazzjoni ta' SPI fil-modalità master":

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Ordni tat-trasferiment tad-data
It-trasmissjoni tibda meta byte jinkiteb fil-buffer Tx.
Il-byte tad-data huwa mgħobbi fir-reġistru shift fi parallel modalità (mill-xarabank intern) matul it-trażmissjoni tal-ewwel bit, wara li tiġi trażmessa lil sekwenzjali Modalità tal-pin MOSI, l-ewwel jew l-aħħar bit 'il quddiem skont l-issettjar tal-bit LSBFIRST fir-reġistru CPI_CR1. Il-bandiera TXE hija ssettjata wara t-trażmissjoni tad-dejta minn Tx buffer għal shift register, u jiġġenera wkoll interruzzjoni jekk il-bit TXEIE fir-reġistru CPI_CR1 ikun issettjat.

Enfasizzat ftit kliem fit-traduzzjoni biex niġbed l-attenzjoni għal karatteristika waħda tal-implimentazzjoni SPI fil-kontrolluri STM. Fuq Atmega il-bandiera TXE (Tx Vojta, Tx huwa vojt u lest biex jirċievi data) huwa ssettjat biss wara li l-byte kollu jkun intbagħat barra. U hawn din il-bandiera hija ssettjata wara li l-byte ikun ġie mdaħħal fir-reġistru intern tal-bidla. Peress li hija mbuttata hemm bil-bits kollha fl-istess ħin (b'mod parallel), u mbagħad id-dejta tiġi trasferita b'mod sekwenzjali, TXE jiġi stabbilit qabel ma l-byte jintbagħat kompletament. Dan huwa importanti għaliex fil-każ tas-sewwieq LED tagħna, għandna bżonn iġbed il-pin LAT wara li tibgħat Kollha data, i.e. Il-bandiera TXE waħedha mhux se tkun biżżejjed għalina.

Dan ifisser li għandna bżonn bandiera oħra. Ejja nħarsu lejn 25.3.7 - "Bnadar tal-Istat":

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
<...>
Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
bandiera BUSY
Il-bandiera BSY hija ssettjata u kklerjata mill-ħardwer (il-kitba fuqha m'għandha l-ebda effett). Il-bandiera BSY tindika l-istat tas-saff ta 'komunikazzjoni SPI.
Jissettja mill-ġdid:
meta t-trasferiment jitlesta (ħlief fil-modalità master jekk it-trasferiment ikun kontinwu)
meta SPI tkun diżattivata
meta jseħħ żball fil-modalità master (MODF=1)
Jekk it-trasferiment ma jkunx kontinwu, il-bandiera BSY titneħħa bejn kull trasferiment tad-dejta

Okay, dan se jkun utli. Ejja nsiru nafu fejn jinsab il-buffer Tx. Biex tagħmel dan, aqra "Reġistru tad-Data SPI":

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Bits 15:0 DR[15:0] Reġistru tad-Dejta
Data riċevuta jew data li għandha tiġi trażmessa.
Ir-reġistru tad-dejta huwa maqsum f'żewġ buffers - wieħed għall-kitba (buffer tat-trażmissjoni) u wieħed għall-qari (buffer tar-riċeviment). Il-kitba fir-reġistru tad-dejta tikteb fil-buffer Tx, u l-qari mir-reġistru tad-dejta se jirritorna l-valur li jinsab fil-buffer Rx.

Ukoll, u r-reġistru tal-istatus, fejn jinstabu l-bnadar TXE u BSY:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Aħna niktbu:

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

Ukoll, peress li għandna bżonn nittrasmettu 16-il darba żewġ bytes, skont in-numru ta 'outputs tas-sewwieq LED, xi ħaġa bħal din:

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

Imma għadna ma nafux kif niġbdu l-pin LAT, għalhekk se mmorru lura għall-I/O.

Assenjar labar

Fl-STM32F1, ir-reġistri responsabbli għall-istat tal-brilli huma pjuttost mhux tas-soltu. Huwa ċar li hemm aktar minnhom minn Atmega, iżda huma wkoll differenti minn ċipep STM oħra. Taqsima 9.1 Deskrizzjoni Ġenerali tal-GPIO:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Kull wieħed mill-għan ġenerali I/O ports (GPIO) għandha żewġ reġistri ta’ konfigurazzjoni ta’ 32 bit (GPIOx_CRL u GPIOx_CRH), żewġ reġistri tad-dejta ta’ 32 bit (GPIOx_IDR u GPIOx_ODR), reġistru ta’ sett/reset ta’ 32 bit (GPIOx_BSRR), reġistru ta’ reset ta’ 16-bit (GPIOx_BRR) u 32- reġistru tal-imblukkar tal-bit (GPIOx_LCKR).

L-ewwel żewġ reġistri huma mhux tas-soltu, u wkoll pjuttost inkonvenjenti, minħabba li s-16-il pin tal-port huma mferrxa fuqhom f'format ta '"erba' bits għal kull ħu". Dawk. labar minn żero sa sebgħa huma f'CRL, u l-bqija huma f'CRH. Fl-istess ħin, ir-reġistri li jifdal fihom b'suċċess il-bits tal-brilli kollha tal-port - ħafna drabi jibqgħu nofs "riżervati".

Għas-sempliċità, ejja nibdew mill-aħħar tal-lista.

M'għandniex bżonn reġistru tal-imblukkar.

Ir-reġistri ssettjati u reset huma pjuttost umoristiċi peress li jidduplikaw parzjalment lil xulxin: tista 'tikteb kollox biss f'BSRR, fejn is-16-il bit ogħla se jerġgħu jissettjaw il-pin għal żero, u dawk aktar baxxi se jkunu ssettjati għal 1, jew tista' wkoll uża BRR, is-16-il bit t'isfel li reset biss il-pin . Jogħġobni t-tieni għażla. Dawn ir-reġistri huma importanti għaliex jipprovdu aċċess atomiku għall-brilli:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Issettja jew Irrisettja Atomika
M'hemmx bżonn li l-interruzzjonijiet jiġu ddiżattivati ​​meta tipprogramma GPIOx_ODR fil-livell tal-bit: bit wieħed jew aktar jistgħu jinbidlu b'operazzjoni waħda ta' kitba atomika APB2. Dan jinkiseb billi tikteb "1" fir-reġistru ta 'sett/reset (GPIOx_BSRR jew, għal reset biss, GPIOx_BRR) tal-bit li jeħtieġ li jinbidel. Bits oħra se jibqgħu mhux mibdula.

Ir-reġistri tad-dejta għandhom ismijiet pjuttost li jispjegaw lilhom infushom - IDR = input Reġistru tad-Direzzjoni, reġistru tad-dħul; ODR = output Reġistru tad-Direzzjoni, reġistru tal-ħruġ. Mhux se jkollna bżonnhom fil-proġett attwali.

U finalment, reġistri ta 'kontroll. Peress li aħna interessati fit-tieni pins SPI, jiġifieri PB13, PB14 u PB15, aħna immedjatament inħarsu lejn CRH:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

U naraw li se jkollna bżonn niktbu xi ħaġa f'bits minn 20 sa 31.

Diġà dehret hawn fuq dak li rridu mill-brilli, għalhekk hawn se nagħmel mingħajr screenshot, ngħid biss li MODE tispeċifika d-direzzjoni (input jekk iż-żewġ bits huma ssettjati għal 0) u l-veloċità tal-pin (neħtieġu 50MHz, i.e. it-tnejn pin għal "1"), u CNF jistabbilixxi l-mod: regolari "push-pull" - 00, "alternattiva" - 10. B'mod awtomatiku, kif naraw hawn fuq, il-brilli kollha għandhom it-tielet bit mill-qiegħ (CNF0), tissettjahom għall-mod input floating.

Peress li qed nippjana li nagħmel xi ħaġa oħra b'din iċ-ċippa, għas-sempliċità ddefinijt il-valuri kollha possibbli MODE u CNF kemm għar-reġistri ta 'kontroll ta' taħt kif ukoll ta 'fuq.

B'xi mod bħal dan

#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

Il-brilli tagħna jinsabu fuq il-port B (indirizz bażi – 0x40010C00), kodiċi:

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

U, għalhekk, tista 'tikteb definizzjonijiet għal LAT, li se jkunu twitched mir-reġistri BRR u 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 biss bl-inerzja, dejjem kien hekk, ħalliha tibqa)

Issa kollox huwa kbir, iżda ma jaħdimx. Minħabba li dan huwa STM32, jiffrankaw l-elettriku, li jfisser li għandek bżonn tippermetti l-arloġġ tal-periferali meħtieġa.

Ixgħel l-arloġġ

L-arloġġ, magħruf ukoll bħala Arloġġ, huwa responsabbli għall-arloġġ. U diġà nistgħu ninnutaw l-abbrevjazzjoni RCC. Infittxuha fid-dokumentazzjoni: dan huwa Irrisettja u Kontroll tal-Arloġġ.

Kif intqal hawn fuq, fortunatament, l-aktar parti diffiċli tas-suġġett tal-clocking saret għalina minn nies mill-STM, li għalih nirringrazzjawhom ħafna (għal darb’oħra nagħti link għal Il-websajt ta' Di Halt, biex tagħmilha ċara kemm hi konfuża). Għandna bżonn biss reġistri responsabbli biex jippermettu l-arloġġ periferali (Peripheral Clock Enable Registers). L-ewwel, ejja nsibu l-indirizz bażi tal-RCC, huwa fil-bidu nett tal-"Mappa tal-Memorja":

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

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

U mbagħad jew ikklikkja fuq il-link fejn tipprova ssib xi ħaġa fil-pjanċa, jew, ħafna aħjar, tgħaddi mid-deskrizzjonijiet tar-reġistri abilitanti mit-taqsimiet dwar jippermettu r-reġistri. Fejn insibu RCC_APB1ENR u RCC_APB2ENR:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

U dawn, għalhekk, fihom bits li jinkludu l-clocking ta 'SPI2, IOPB (I/O Port B) u funzjonijiet alternattivi (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;

Il-kodiċi finali jista 'jinstab hawn.

Jekk għandek l-opportunità u x-xewqa li tittestja, imbagħad qabbad id-DM634 bħal dan: DAI għal PB15, DCK għal PB13, LAT għal PB14. Aħna qawwa lis-sewwieq minn 5 volts, ma ninsewx li jgħaqqdu l-grounds.

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

STM8 PWM

PWM fuq STM8

Meta kont qed nippjana dan l-artikolu, iddeċidejt, bħala eżempju, li nipprova nikkontrolla xi funzjonalità ta 'ċippa mhux familjari bl-użu biss ta' datasheet, sabiex ma nispiċċax b'żarbun mingħajr stivali. STM8 kien ideali għal dan ir-rwol: l-ewwelnett, kelli koppja ta 'bordijiet Ċiniżi ma' STM8S103, u t-tieni, mhuwiex popolari ħafna, u għalhekk it-tentazzjoni li taqra u ssib soluzzjoni fuq l-Internet tistrieħ fuq in-nuqqas ta 'dawn is-soluzzjonijiet stess.

Iċ-ċippa għandha wkoll datasheet и manwal ta’ referenza RM0016, fl-ewwel hemm indirizzi ta 'pinout u reġistru, fit-tieni - kull ħaġa oħra. STM8 huwa pprogrammat f'C f'IDE terribbli ST Viżwali Żviluppa.

Clocking u I/O

B'mod awtomatiku, STM8 jaħdem bi frekwenza ta' 2 MHz, dan għandu jiġi kkoreġut immedjatament.

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Arloġġ HSI (Veloċità Għolja Intern).
Is-sinjal tal-arloġġ HSI huwa derivat minn oxxillatur RC intern ta '16 MHz b'diviżur programmabbli (1 sa 8). Huwa ssettjat fir-reġistru tad-diviżur tal-arloġġ (CLK_CKDIVR).
Nota: fil-bidu, oxxillatur HSI RC b'diviżur ta '8 jintgħażel bħala s-sors ewlieni tas-sinjal tal-arloġġ.

Insibu l-indirizz tar-reġistru fid-datasheet, id-deskrizzjoni f'refman u naraw li r-reġistru jeħtieġ li jiġi kklerjat:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Peress li se nħaddmu PWM u nqabbdu l-LEDs, ejja nħarsu lejn il-pinout:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Iċ-ċippa hija żgħira, ħafna funzjonijiet huma sospiżi fuq l-istess labar. Dak li hemm fil-parentesi huwa "funzjonalità alternattiva", huwa mibdul b'"bytes ta' għażla" (għażla bytes) – xi ħaġa bħal fjusis Atmega. Tista 'tbiddel il-valuri tagħhom b'mod programmatiku, iżda mhux meħtieġ, għaliex Il-funzjonalità l-ġdida tiġi attivata biss wara reboot. Huwa aktar faċli li tuża ST Visual Programmer (imniżżel bil-Visual Develop), li jista 'jbiddel dawn il-bytes. Il-pinout juri li l-brilli CH1 u CH2 tal-ewwel timer huma moħbija f'parentesi kwadri; huwa meħtieġ li jiġu stabbiliti l-bits AFR1 u AFR0 f'STVP, u t-tieni wieħed jittrasferixxi wkoll l-output CH1 tat-tieni tajmer minn PD4 għal PC5.

Għalhekk, 6 pins se jikkontrollaw l-LEDs: PC6, PC7 u PC3 għall-ewwel timer, PC5, PD3 u PA3 għat-tieni.

It-twaqqif tal-pinnijiet I/O infushom fuq STM8 huwa aktar sempliċi u aktar loġiku milli fuq STM32:

  • familjari mir-reġistru tad-direzzjoni tad-data Atmega DDR (Reġistru tad-Direzzjoni tad-Data): 1 = output;
  • l-ewwel reġistru ta 'kontroll CR1, meta joħroġ, jistabbilixxi l-modalità push-pull (1) jew drain miftuħ (0); peress li nqabbad l-LEDs maċ-ċippa bil-katodi, inħalli żero hawn;
  • it-tieni reġistru tal-kontroll CR2, meta joħroġ, jistabbilixxi l-veloċità tal-arloġġ: 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

Issettjar PWM

L-ewwel, ejja niddefinixxu t-termini:

  • Frekwenza PWM – il-frekwenza li biha jimmarka t-tajmer;
  • Awto-rikarigu, AR – valur awtoloadable sa liema l-arloġġ se jgħodd (perjodu tal-impuls);
  • Avveniment ta' Aġġornament, UEV – avveniment li jseħħ meta t-tajmer ikun għodd għal AR;
  • Ċiklu ta' Dazju PWM – Iċ-ċiklu tad-dazju PWM, spiss imsejjaħ “fattur tad-dazju”;
  • Qbid/Qabbel il-Valur – valur għall-qbid/tqabbil, li għalih għadd it-tajmer se tagħmel xi ħaġa (fil-każ ta 'PWM, jaqleb is-sinjal tal-ħruġ);
  • Valur tat-tagħbija minn qabel – valur mgħobbi minn qabel. Qabbel il-valur ma jistax jinbidel waqt li t-tajmer ikun qed jimmarka, inkella ċ-ċiklu PWM jinkiser. Għalhekk, valuri trażmessi ġodda jitqiegħdu f'buffer u jinġibdu 'l barra meta t-tajmer jilħaq it-tmiem tal-countdown tiegħu u jiġi reset;
  • Allinjat mat-tarf и Modi allinjati maċ-ċentru – allinjament tul il-fruntiera u fiċ-ċentru, l-istess bħal ta’ Atmel PWM veloċi и PWM korrett fil-fażi.
  • OCiREF, Output Qabbel Sinjal ta' Referenza – sinjal ta 'output ta' referenza, fil-fatt, dak li jidher fuq il-pin korrispondenti fil-modalità PWM.

Kif diġà jidher ċar mill-pinout, żewġ tajmers għandhom kapaċitajiet PWM - l-ewwel u t-tieni. It-tnejn huma 16-bit, l-ewwel għandu ħafna karatteristiċi addizzjonali (b'mod partikolari, jista 'jgħodd kemm 'il fuq kif ukoll 'l isfel). Jeħtieġ li t-tnejn naħdmu indaqs, għalhekk iddeċidejt li nibda bit-tieni waħda ovvjament ifqar, biex ma nużax aċċidentalment xi ħaġa li ma tkunx hemm. Xi problema hija li d-deskrizzjoni tal-funzjonalità PWM tat-tajmers kollha fil-manwal ta 'referenza tinsab fil-kapitolu dwar l-ewwel tajmer (17.5.7 Modalità PWM), għalhekk għandek taqbeż 'il quddiem u lura fid-dokument kollu l-ħin kollu.

PWM fuq STM8 għandu vantaġġ importanti fuq PWM fuq Atmega:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
PWM Allinjat tal-Konfini
Konfigurazzjoni tal-kont minn isfel għal fuq
L-għadd minn isfel għal fuq huwa attiv jekk il-bit DIR fir-reġistru TIM_CR1 jitneħħa
Eżempju
L-eżempju juża l-ewwel modalità PWM. Is-sinjal ta' referenza PWM OCiREF jinżamm għoli sakemm TIM1_CNT < TIM1_CCRi. Inkella tieħu livell baxx. Jekk il-valur tal-paragun fir-reġistru TIM1_CCRi huwa akbar mill-valur awtoload (reġistru TIM1_ARR), is-sinjal OCiREF jinżamm f'1. Jekk il-valur tal-paragun huwa 0, OCiREF jinżamm fuq żero....

STM8 timer matul avveniment ta' aġġornament il-kontrolli l-ewwel qabbel il-valur, u mbagħad biss jipproduċi sinjal ta 'referenza. It-tajmer ta 'Atmega l-ewwel jingħalaq u mbagħad iqabbel, li jirriżulta compare value == 0 l-output huwa labra, li trid tiġi ttrattata b'xi mod (per eżempju, billi taqleb b'mod programmatiku l-loġika).

Allura dak li rridu nagħmlu: 8-bit PWM (AR == 255), għadd minn isfel għal fuq, allinjament tul il-fruntiera. Peress li l-bozoz tad-dawl huma konnessi maċ-ċippa permezz ta’ katodi, il-PWM għandu joħroġ 0 (LED mixgħul) sakemm qabbel il-valur u 1 wara.

Diġà qrajna dwar xi wħud Mod PWM, għalhekk insibu r-reġistru meħtieġ tat-tieni timer billi nfittxu fil-manwal ta’ referenza għal din il-frażi (18.6.8 - TIMx_CCMR1):

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
110: L-ewwel modalità PWM – meta tgħodd minn isfel għal fuq, l-ewwel kanal huwa attiv waqt li TIMx_CNT < TIMx_CCR1. Inkella, l-ewwel kanal huwa inattiv. [aktar fid-dokument hemm kopja-pejst żbaljata minn timer 1] 111: It-tieni modalità PWM – meta tgħodd minn isfel għal fuq, l-ewwel kanal huwa inattiv waqt li TIMx_CNT < TIMx_CCR1. Inkella, l-ewwel kanal huwa attiv.

Peress li l-LEDs huma konnessi mal-MK permezz ta 'katodi, it-tieni modalità taqbel magħna (l-ewwel waħda wkoll, iżda għadna ma nafux dan).

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Bit 3 OC1PE: Ippermetti l-preload tal-pin 1
0: Ir-reġistru tat-tagħbija minn qabel fuq TIMx_CCR1 huwa diżattivat. Tista' tikteb lil TIMx_CCR1 fi kwalunkwe ħin. Il-valur il-ġdid jaħdem immedjatament.
1: Ir-reġistru tat-tagħbija minn qabel fuq TIMx_CCR1 huwa attivat. Operazzjonijiet ta' qari/kitba jaċċessaw ir-reġistru ta' preload. Il-valur preloaded TIMx_CCR1 jitgħabba fir-shadow register matul kull avveniment ta' aġġornament.
*Nota: Biex il-modalità PWM taħdem sew, ir-reġistri tal-preload iridu jkunu attivati. Dan mhux meħtieġ fil-mod ta 'sinjal wieħed (il-bit OPM huwa ssettjat fir-reġistru TIMx_CR1).

Tajjeb, ejja nixgħel dak kollu li għandna bżonn għat-tliet kanali tat-tieni timer:

#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 jikkonsisti f'żewġ reġistri ta' tmien bit, kollox huwa sempliċi:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

It-tieni timer jista 'jgħodd biss minn isfel għal fuq, allinjament tul il-fruntiera, xejn m'għandu jinbidel. Ejja nissettjaw id-diviżur tal-frekwenza, pereżempju, għal 256. Għat-tieni tajmer, id-diviżur huwa ssettjat fir-reġistru TIM2_PSCR u huwa qawwa ta 'żewġ:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Li jibqa 'huwa li tixgħel il-konklużjonijiet u t-tieni timer innifsu. L-ewwel problema tissolva bir-reġistri Qbid/Qabbel Jippermettu: hemm żewġ, tliet kanali mferrxa madwarhom b'mod asimmetriku. Hawnhekk nistgħu nitgħallmu wkoll li huwa possibbli li tinbidel il-polarità tas-sinjal, i.e. fil-prinċipju, kien possibbli li tuża PWM Mode 1. Aħna niktbu:

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

U fl-aħħarnett, nibdew it-tajmer fir-reġistru TIMx_CR1:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Ejja nikteb analogu sempliċi ta 'AnalogWrite(), li se tittrasferixxi l-valuri attwali lit-tajmer għal tqabbil. Ir-reġistri huma msemmija b'mod prevedibbli Qbid/Qabbel reġistri, hemm tnejn minnhom għal kull kanal: it-8 bits ta 'ordni baxx f'TIM2_CCRxL u dawk ta' ordni għolja f'TIM2_CCRxH. Peress li ħloqna PWM 8-bit, huwa biżżejjed li tikteb biss l-inqas bits sinifikanti:

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

Il-qarrej attent jinduna li għandna PWM kemmxejn difettuż, li ma jistax jipproduċi 100% mili (b'valur massimu ta '255, is-sinjal huwa maqlub għal ċiklu wieħed ta' tajmer). Għall-LEDs dan ma jimpurtax, u l-qarrej attent diġà jista 'raden kif jirranġaha.

PWM fuq it-tieni timer jaħdem, ejja ngħaddu għall-ewwel.

L-ewwel timer għandu eżattament l-istess bits fl-istess reġistri (huwa biss li dawk il-bits li baqgħu "riżervati" fit-tieni timer jintużaw b'mod attiv fl-ewwel għal kull xorta ta 'affarijiet avvanzati). Għalhekk, huwa biżżejjed li ssib l-indirizzi tal-istess reġistri fid-datasheet u tikkopja l-kodiċi. Ukoll, ibdel il-valur tad-diviżur tal-frekwenza, għax... l-ewwel timer irid jirċievi mhux qawwa ta 'tnejn, iżda valur eżatt ta' 16-il bit f'żewġ reġistri Prescaler Għoli и Baxxa. Nagħmlu kollox u... l-ewwel timer ma jaħdimx. X'ġara?

Il-problema tista 'tiġi solvuta biss billi tħares mit-taqsima kollha dwar ir-reġistri ta' kontroll ta 'timer 1, fejn infittxu dak li t-tieni timer ma jkollux. Ha jkun hemm 17.7.30 Break register (TIM1_BKR), fejn hemm dan il-bit:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Ippermetti l-output prinċipali

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Dak kollu żgur issa, il-kodiċi hemm.

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

STM8 Multiplex

Multiplexing fuq STM8

It-tielet mini-proġett huwa li tgħaqqad tmien LEDs RGB mat-tieni timer fil-modalità PWM u tagħmilhom juru kuluri differenti. Hija bbażata fuq il-kunċett ta 'multiplexing LED, li huwa li jekk tixgħel u titfi l-LEDs ħafna, malajr ħafna, jidher lilna li huma kontinwament mixgħula (persistenza tal-vista, inerzja tal-perċezzjoni viżwali). Darba għamilt xi ħaġa bħal din fuq Arduino.

L-algoritmu tax-xogħol jidher bħal dan:

  • konness l-anodu tal-ewwel LED RGB;
  • mixgħulha, tibgħat is-sinjali meħtieġa lill-katodi;
  • stenniet sat-tmiem taċ-ċiklu PWM;
  • konness l-anodu tat-tieni RGB LED;
  • xegħlu...

Ukoll, eċċ. Naturalment, għal tħaddim sabiħ huwa meħtieġ li l-anodu jkun imqabbad u l-LED "jinqabad" fl-istess ħin. Ukoll, jew kważi. Fi kwalunkwe każ, irridu nikteb kodiċi li joħroġ valuri fi tliet kanali tat-tieni tajmer, nibdilhom meta jintlaħaq UEV, u fl-istess ħin ibiddel l-LED RGB attiv bħalissa.

Peress li l-bdil tal-LED huwa awtomatiku, għandna bżonn noħolqu "memorja tal-vidjo" li minnha l-immaniġġjar tal-interruzzjoni jirċievi d-dejta. Din hija firxa sempliċi:

uint8_t colors[8][3];

Sabiex jinbidel il-kulur ta 'LED speċifiku, ikun biżżejjed li tikteb il-valuri meħtieġa f'din il-firxa. U l-varjabbli se jkun responsabbli għan-numru tal-LED attiv

uint8_t cnt;

Demux

Għal multiplexing xieraq, għandna bżonn, stramba biżżejjed, demultiplexer CD74HC238. Demultiplexer - ċippa li timplimenta l-operatur fil-ħardwer <<. Permezz ta 'tliet pins ta' input (bits 0, 1 u 2) aħna għalfha numru ta 'tliet bit X, u bi tweġiba jattiva n-numru tal-ħruġ (1<<X). L-inputs li jifdal taċ-ċippa jintużaw biex iskalaw id-disinn kollu. Neħtieġu din iċ-ċippa mhux biss biex tnaqqas in-numru ta 'labar okkupati tal-mikrokontrollur, iżda wkoll għas-sigurtà - sabiex ma tixgħelx aċċidentalment aktar LEDs milli jkun possibbli u ma ħruqx l-MK. Iċ-ċippa tiswa penny u għandha dejjem tinżamm fil-kabinett tal-mediċina tad-dar tiegħek.

Is-CD74HC238 tagħna se jkun responsabbli għall-provvista ta 'vultaġġ lill-anodu tal-LED mixtieq. F'multiplex sħiħ, ikun jipprovdi vultaġġ lill-kolonna permezz ta 'P-MOSFET, iżda f'din id-demo huwa possibbli direttament, għaliex jiġbed 20 mA, skond klassifikazzjonijiet massimi assoluti fid-datasheet. Minn Folja tad-dejta CD74HC238 għandna bżonn pinouts u din il-cheat sheet:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
H = livell ta 'vultaġġ għoli, L = livell ta' vultaġġ baxx, X - ma jimpurtax

Aħna ngħaqqdu E2 u E1 ma 'l-art, E3, A0, A1 u A3 għal pins PD5, PC3, PC4 u PC5 ta' STM8. Peress li t-tabella t'hawn fuq fiha kemm livelli baxxi kif ukoll għoljin, aħna kkonfiguraw dawn il-brilli bħala pinnijiet push-pull.

PWM

PWM fuq it-tieni timer huwa kkonfigurat bl-istess mod bħal fl-istorja preċedenti, b'żewġ differenzi:

L-ewwel, irridu nippermettu l-interruzzjoni mixgħula Aġġornament Avveniment (UEV) li se jsejjaħ funzjoni li taqleb l-LED attiv. Dan isir billi tinbidel il-bit Aġġorna Interrupt Enable f’reġistru b’isem li jgħid

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
Tinterrompi l-abilitazzjoni tar-reġistru

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

It-tieni differenza hija relatata mal-fenomenu tal-multiplexing, bħal ghosting – tiddix parassitiku tad-dijodi. Fil-każ tagħna, jista 'jidher minħabba l-fatt li t-tajmer, wara li kkawża interruzzjoni fuq l-UEV, ikompli jimmarka, u l-immaniġġjar tal-interruzzjoni m'għandux ħin biex jaqleb l-LED qabel it-tajmer jibda jikteb xi ħaġa lill-brilli. Biex tiġġieled dan, ikollok taqleb il-loġika (0 = luminożità massima, 255 = xejn mhu mixgħul) u tevita valuri estremi taċ-ċiklu tad-dazju. Dawk. tiżgura li wara UEV l-LEDs jintefa kompletament għal ċiklu wieħed PWM.

Bidla tal-polarità:

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

Evita li tissettja r, g u b għal 255 u ftakar li taqlebhom meta tużahom.

Interruzzjonijiet

L-essenza ta 'interruzzjoni hija li taħt ċerti ċirkostanzi ċ-ċippa tieqaf teżegwixxi l-programm prinċipali u ssejjaħ xi funzjoni esterna. L-interruzzjonijiet iseħħu minħabba influwenzi esterni jew interni, inkluż it-tajmer.

Meta ħloqna l-ewwel proġett f'ST Visual Develop, minbarra main.c irċevejna tieqa b'fajl misterjuż stm8_interrupt_vector.c, awtomatikament inkluż fil-proġett. F'dan il-fajl, funzjoni hija assenjata għal kull interruzzjoni NonHandledInterrupt. Irridu norbtu l-funzjoni tagħna mal-interruzzjoni mixtieqa.

Id-datasheet għandha tabella ta’ interrupt vectors, fejn insibu dawk li neħtieġu:

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8
13 TIM2 aġġornament/overflow
14 TIM2 qbid/tqabbil

Għandna bżonn nibdlu l-LED fl-UEV, għalhekk għandna bżonn l-interruzzjoni #13.

Għaldaqstant, l-ewwel nett, fil-fajl stm8_interrupt_vector.c ibdel l-isem default tal-funzjoni responsabbli għall-interruzzjoni Nru 13 (IRQ13) għal tiegħek:

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

It-tieni nett, ikollna noħolqu fajl main.h bil-kontenut li ġej:

#ifndef __MAIN_H
#define __MAIN_H

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

U fl-aħħarnett, ikteb din il-funzjoni fil tiegħek 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;
}

Jibqa' biss li tippermetti l-interruzzjonijiet. Dan isir bl-użu tal-kmand tal-assemblatur rim - ser ikollok tfittex għaliha fi Manwal ta 'Programmar:

//enable interrupts
_asm("rim");

Kmand ieħor tal-assemblatur huwa sim – jitfi l-interruzzjonijiet. Għandhom jintfew waqt li jkunu qed jinkitbu valuri ġodda fil-"memorja tal-vidjo", sabiex interruzzjoni kkawżata fil-mument ħażin ma tħassarx il-firxa.

Il-kodiċi kollu - fuq GitHub.

Qari ta' datasheets 2: SPI fuq STM32; PWM, tajmers u interruzzjonijiet fuq STM8

Jekk mill-inqas xi ħadd isib dan l-artiklu utli, allura ma ktibtux għalxejn. Inkun kuntent li nirċievi kummenti u rimarki, nipprova nwieġeb kollox.

Sors: www.habr.com

Żid kumment