Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

В a ’chiad phàirt Dh'fheuch mi ri innse dha innleadairean dealanach cur-seachad a dh'fhàs suas bho Arduino pants ciamar agus carson a bu chòir dhaibh duilleagan-dàta agus sgrìobhainnean eile a leughadh airson microcontrollers. Thionndaidh an teacsa gu bhith mòr, agus mar sin gheall mi eisimpleirean practaigeach a shealltainn ann an artaigil air leth. Uill, thug e balgan-buachair bainne air fhèin...

An-diugh bidh mi a 'sealltainn dhut mar a chleachdas tu bileagan-dàta airson fuasgladh gu math sìmplidh, ach riatanach airson mòran phròiseactan, gnìomhan air luchd-riaghlaidh STM32 (Blue Pill) agus STM8. Tha a h-uile pròiseact demo coisrigte dha na LEDan as fheàrr leam, bidh sinn gan lasadh ann am meudan mòra, agus feumaidh sinn a h-uile seòrsa de iomaill inntinneach a chleachdadh.

Bha an teacsa a-rithist fìor mhòr, agus mar sin airson goireasachd tha mi a’ dèanamh an t-susbaint:

Pill gorm STM32: 16 LED le draibhear DM634
STM8: A’ stèidheachadh sia prìneachan PWM
STM8: 8 RGB LED air trì prìneachan, a’ briseadh

Àicheadh: Chan e innleadair a th’ annam, chan eil mi a’ gabhail orm gu bheil eòlas domhainn agam air electronics, tha an artaigil airson neo-dhreuchdail mar mise. Gu dearbh, bha mi gam mheas fhèin o chionn dà bhliadhna mar an luchd-èisteachd cuimsichte. Nam biodh cuideigin air innse dhomh an uairsin nach robh clàran dàta air sliseag air nach robh mi eòlach eagallach a leughadh, cha bhithinn air tòrr ùine a chaitheamh a’ coimhead airson pìosan còd air an eadar-lìn agus a’ cruthachadh bagaichean le siosar agus teip adhesive.

Tha fòcas an artaigil seo air clàran-dàta, chan e pròiseactan, agus mar sin is dòcha nach bi an còd gu math sgiobalta agus gu tric gann. Tha na pròiseactan fhèin gu math sìmplidh, ged a tha iad freagarrach airson a 'chiad eòlas air a' chip ùr.

Tha mi an dòchas gun cuidich an artaigil agam cuideigin aig an aon ìre de bhogadh sa chur-seachad.

STM32

16 LED le DM634 agus SPI

Pròiseact beag a 'cleachdadh Blue Pill (STM32F103C8T6) agus dràibhear DM634 LED. A’ cleachdadh dhuilleagan-dàta, obraichidh sinn a-mach an draibhear, puirt STM IO agus rèitichidh sinn SPI.

DM634

Faodar chip Taiwanese le toraidhean 16 16-bit PWM, a cheangal ann an slabhraidhean. Tha am modail deireadh ìosal 12-bit aithnichte bho phròiseact dachaigheil Pacaid aotrom. Aig aon àm, a 'taghadh eadar an DM63x agus an TLC5940 ainmeil, thagh mi DM airson grunn adhbharan: 1) Tha TLC air Aliexpress gu cinnteach meallta, ach chan eil am fear seo; 2) Tha PWM neo-eisimeileach aig DM le gineadair tricead fhèin; 3) faodar a cheannach gu saor ann am Moscow, an àite a bhith a’ feitheamh ri parsail bho Ali. Agus, gu dearbh, bha e inntinneach ionnsachadh mar a chumas tu smachd air a’ chip thu fhèin, seach a bhith a’ cleachdadh leabharlann deiseil. Tha sgoltagan a-nis air an taisbeanadh sa mhòr-chuid ann am pasgan SSOP24; tha iad furasta an solder gu inneal-atharrachaidh.

Leis gur e Taiwanese an neach-dèanamh, dàta tha a’ chip sgrìobhte ann am Beurla Sìneach, a tha a’ ciallachadh gum bi e spòrsail. An toiseach bheir sinn sùil air a’ phìos (Ceangal Pin) tuigsinn dè an cas a cheanglas dè ris, agus tuairisgeul air na prìneachan (Tuairisgeul prìne). 16 pìosan:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Stòran sinc DC (Drain Fosgailte)

Sinc / Toradh drèana fosgailte - drèanadh; stòr sruthadh a-steach; tha an toradh ceangailte ris an talamh anns an stàit ghnìomhach - tha na LEDan ceangailte ris an dràibhear le cathodes. Gu dealanach, chan e “drèanadh fosgailte” a tha seo, gu dearbh.drèana fosgailte), ach ann an clàran-duilleig lorgar an sònrachadh seo airson prìneachan ann am modh drèanaidh gu tric.

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
resistors taobh a-muigh eadar REXT agus GND gus luach sruth toraidh a shuidheachadh

Tha resistor iomraidh air a chuir a-steach eadar am prìne REXT agus an talamh, a bhios a’ cumail smachd air strì an aghaidh nan toraidhean a-staigh, faic an graf air duilleag 9 den duilleag-dàta. Anns an DM634, faodar smachd a chumail air an aghaidh seo le bathar-bog, a’ suidheachadh an soilleireachd iomlan (soilleireachd cruinne); Cha tèid mi a-steach gu mion-fhiosrachadh san artaigil seo, cuiridh mi dìreach resistor 2.2 - 3 kOhm an seo.

Gus tuigse fhaighinn air mar a chumas tu smachd air a’ chip, leig dhuinn sùil a thoirt air an tuairisgeul air eadar-aghaidh an uidheim:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Seadh, seo e, Beurla Sìneach na glòir gu lèir. Tha eadar-theangachadh seo na dhuilgheadas, tuigidh tu e ma thogras tu, ach tha dòigh eile ann - coimhead air mar a tha an ceangal ris an TLC5940 a tha coltach ri gnìomh air a mhìneachadh anns a’ bhileag-dàta:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
... Chan eil a dhìth ach trì prìneachan gus dàta a chuir a-steach don inneal. Bidh oir àrdachaidh comharra SCLK a’ gluasad an dàta bhon phrìne SIN chun chlàr a-staigh. Às deidh a h-uile dàta a bhith air a luchdachadh, bidh comharra XLAT goirid àrd a’ slaodadh an dàta a chaidh a ghluasad gu sreath a-steach do na clàran a-staigh. Is e clàran a-staigh geataichean a tha air am brosnachadh le ìre chomharran XLAT. Tha a h-uile dàta air a ghluasad gu ìre as cudromaiche an toiseach.

Latch - latch/latch/glas.
Àrdachadh oir - oir air thoiseach air a 'pulse
MSB an toiseach - an rud as cudromaiche (air an taobh chlì) air adhart.
gus dàta a ghleusadh - tar-chuir dàta ann an òrdugh (beagan air bheag).

Am facal latch gu tric air a lorg anns na sgrìobhainnean airson chips agus air eadar-theangachadh ann an diofar dhòighean, mar sin air sgàth tuigse leigidh mi leam fhìn

prògram foghlaim beagTha an draibhear LED gu ìre mhòr na chlàr gluasad. "Shift" (gluasad) anns an ainm - gluasad dàta bitwise taobh a-staigh an inneal: bidh gach pìos ùr a thèid a ghluasad a-staigh a’ putadh an t-sèine gu lèir air adhart air a bheulaibh. Leis nach eil duine airson a bhith a ’faicinn priobadh chaotic de na LEDan rè an gluasad, bidh am pròiseas a’ tachairt ann an clàran bufair air an sgaradh bho na clàran obrach le damper (latch) na sheòrsa de rùm feitheimh far a bheil na pìosan air an rèiteachadh san t-sreath a tha thu ag iarraidh. Nuair a bhios a h-uile càil deiseil, fosglaidh an còmhlaiche agus thèid na pìosan a dh'obair, a 'dol an àite a' bhaidse a bh 'ann roimhe. Facal latch anns na sgrìobhainnean airson microcircuits cha mhòr an-còmhnaidh a 'ciallachadh a leithid de thaomadh, ge bith dè an co-mheasgachaidhean a thathas a' cleachdadh.

Mar sin, thèid gluasad dàta chun DM634 a dhèanamh mar seo: cuir a-steach an DAI gu luach a’ phàirt as cudromaiche den LED as fhaide, tarraing DCK suas is sìos; suidhich an cuir a-steach DAI gu luach an ath rud, tarraing DCK; agus mar sin air adhart gus am bi na pìosan uile air an tar-chuir (glaiste a-steach), às deidh sin bidh sinn a’ tarraing LAT. Faodar seo a dhèanamh le làimh (bit-bang), ach tha e nas fheàrr eadar-aghaidh SPI a chleachdadh gu sònraichte airson seo, leis gu bheil e air a thaisbeanadh air ar STM32 ann an dà leth-bhreac.

Pill gorm STM32F103

Ro-ràdh: Tha luchd-riaghlaidh STM32 tòrr nas iom-fhillte na Atmega328 na dh’ fhaodadh iad a bhith eagallach. A bharrachd air an sin, airson adhbharan sàbhalaidh lùtha, tha cha mhòr a h-uile iomall air a chuir dheth aig an toiseach, agus tha tricead a ’ghleoc 8 MHz bhon stòr a-staigh. Gu fortanach, sgrìobh prògramadairean STM còd a bheir a’ chip suas chun an “àireamhaichte” 72 MHz, agus thug ùghdaran nan IDEan air fad as aithne dhomh a-steach e sa mhodh tòiseachaidh, agus mar sin chan fheum sinn gleoc (ach faodaidh tu ma tha thu dha-rìribh ag iarraidh). Ach feumaidh tu na peripherals a thionndadh air.

Sgrìobhainnean: Tha Blue Pill uidheamaichte leis a’ chip STM32F103C8T6 mòr-chòrdte, tha dà sgrìobhainn feumail air a shon:

Anns a’ bhileag dh’ fhaodadh gum biodh ùidh againn ann an:

  • Pinouts – pinouts chip – gun fhios nach co-dhùin sinn na bùird a dhèanamh sinn fhìn;
  • Mapa cuimhne - mapa cuimhne airson sliseag sònraichte. Tha mapa anns an Leabhar-làimhe Iomraidh airson an loidhne gu lèir, agus tha e a' toirt iomradh air clàran nach eil aig an fheadhainn againn.
  • Clàr mìneachaidh prìne – a’ liostadh prìomh ghnìomhan agus gnìomhan eile prìneachan; airson an “gorm pill” gheibh thu dealbhan nas goireasaiche air an eadar-lìn le liosta de phrìneachan agus na gnìomhan aca. Mar sin, bidh sinn sa bhad google Blue Pill pinout agus cùm an dealbh seo ri làimh:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
NB: bha mearachd san dealbh bhon eadar-lìn, a chaidh a thoirt fa-near anns na beachdan, tapadh leat airson sin. Chaidh an dealbh a chuir na àite, ach is e leasan a tha seo - tha e nas fheàrr fiosrachadh a sgrùdadh chan ann bho dhuilleagan-dàta.

Bidh sinn a’ toirt air falbh an duilleag-dhuilleag, a’ fosgladh an Leabhar-iùil Iomraidh, agus bho seo a-mach cha chleachd sinn ach e.
Modh-obrach: bidh sinn a’ dèiligeadh ri cuir a-steach / toradh àbhaisteach, a’ rèiteachadh SPI, a’ tionndadh air na h-iomaill riatanach.

Teachd a-steach Toradh

Air an Atmega328, tha I / O air a chuir an gnìomh gu sìmplidh, agus is e sin as coireach gum faod pailteas roghainnean STM32 a bhith troimh-chèile. A-nis chan fheum sinn ach co-dhùnaidhean, ach tha ceithir roghainnean ann eadhon:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
drèana fosgailte, putadh-tarraing, putadh-tarraing eile, drèanadh fosgailte eile

"Pull-putadh" (putadh-tarraing) an toradh àbhaisteach bhon Arduino, faodaidh am prìne an luach a ghabhail an dàrna cuid HIGH no LOW. Ach le “drèana fosgailte” tha sin ann duilgheadasan, ged a tha a h-uile dad sìmplidh an seo:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Rèiteachadh toraidh / nuair a thèid am port a shònrachadh airson toradh: / bufair toraidh air a chomasachadh: / - modh drèanaidh fosgailte: tha “0” anns a’ chlàr toraidh a’ comasachadh N-MOS, tha “1” anns a’ chlàr toraidh a’ fàgail a’ phort ann am modh Hi-Z ( Chan eil P-MOS air a ghnìomhachadh) / - modh push-pull: bidh “0” anns a’ chlàr toraidh a’ gnìomhachadh N-MOS, bidh “1” anns a’ chlàr toraidh a’ gnìomhachadh P-MOS.

Tha a h-uile eadar-dhealachadh eadar drèanadh fosgailte (drèana fosgailte) bho “push-pull” (putadh-tarraing(impedance àrd, Hi-Z). Nuair a bhios tu a’ sgrìobhadh neoni, bidh am prìne gad ghiùlan fhèin mar an ceudna anns an dà mhodh, an dà chuid gu loidsigeach agus gu dealanach.

Ann am modh toraidh àbhaisteach, bidh am prìne dìreach a’ craoladh susbaint a’ chlàr toraidh. Anns an "eile" tha e fo smachd na peripherals co-fhreagarrach (faic 9.1.4):

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Ma tha pìos port air a rèiteachadh mar phrìne gnìomh eile, tha an clàr prìne à comas agus tha am prìne ceangailte ris a’ phrìne iomaill.

Tha gnìomhachd eile gach prìne air a mhìneachadh ann an Mìneachaidhean prìne Tha an dàta air an dealbh a chaidh a luchdachadh sìos. Don cheist dè a nì thu ma tha grunn ghnìomhan eile aig prìne, tha am freagairt air a thoirt seachad le bonn-nota anns a’ bhileag:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Ma bhios ioma iomaill a’ cleachdadh an aon phrìne, gus còmhstri eadar gnìomhan eile a sheachnadh, cha bu chòir ach aon iomaill a chleachdadh aig an aon àm, air a thogail le bhith a’ cleachdadh a’ ghloc iomaill (ann an clàr iomchaidh RCC).

Mu dheireadh, tha astar gleoc aig prìneachan ann am modh toraidh cuideachd. Is e feart sàbhalaidh lùtha eile a tha seo; anns a ’chùis againn, tha sinn dìreach ga shuidheachadh chun ìre as àirde agus ga dhìochuimhneachadh.

Mar sin: tha sinn a’ cleachdadh SPI, a tha a’ ciallachadh gum bu chòir dà phrìne (le dàta agus le comharra gleoc) a bhith nan “gnìomh tarraing-tarraing eile”, agus gum bu chòir fear eile (LAT) a bhith mar “tarraing-tarraing cunbhalach”. Ach mus sònrachadh iad, leig dhuinn dèiligeadh ri SPI.

SPI

Prògram foghlaim beag eile

Tha SPI no Eadar-aghaidh Iomallach Serial (eadar-aghaidh sreathach iomaill) na eadar-aghaidh sìmplidh agus fìor èifeachdach airson MK a cheangal ri MKs eile agus an saoghal a-muigh san fharsaingeachd. Tha am prionnsapal obrachadh aige air a mhìneachadh gu h-àrd mar-thà, far a bheil mu dheidhinn an dràibhear LED Sìneach (anns an leabhar-làimhe fiosrachaidh, faic earrann 25). Faodaidh SPI obrachadh ann am modh maighstir (“maighstir”) agus tràill (“tràill”). Tha ceithir seanalan bunaiteach aig SPI, agus chan fhaodar a h-uile gin dhiubh a chleachdadh:

  • MOSI, Prìomh Thoradh / Cur-a-steach Tràille: bidh am prìne seo a’ sgaoileadh dàta ann am prìomh mhodh, agus a’ faighinn dàta ann am modh tràillean;
  • MISO, Prìomh Chur a-steach / Toradh Tràille: air an làimh eile, bidh e a’ faighinn anns a ’mhaighstir, agus a’ sgaoileadh anns an tràill;
  • SCK, Cloc Sreathach: a ’suidheachadh tricead tar-chuir dàta anns a’ mhaighstir no a ’faighinn comharra cloc anns an tràill. Gu bunaiteach a 'bualadh buillean;
  • SS, Tràill Tagh: le cuideachadh bhon t-sianal seo, tha fios aig an tràill gu bheil rudeigin ag iarraidh bhuaithe. Air STM32 canar NSS ris, far a bheil N = àicheil, i.e. bidh an rianadair na thràill ma tha talamh san t-sianal seo. Bidh e a’ tighinn còmhla gu math leis a ’mhodh Open Drain Output, ach sin sgeulachd eile.

Mar a h-uile càil eile, tha SPI air STM32 beairteach ann an comas-gnìomh, a tha ga dhèanamh rudeigin duilich a thuigsinn. Mar eisimpleir, faodaidh e obrachadh chan ann a-mhàin le SPI, ach cuideachd le eadar-aghaidh I2S, agus anns na sgrìobhainnean tha na tuairisgeulan aca measgaichte, feumar an còrr a ghearradh dheth ann an deagh àm. Tha an obair againn gu math sìmplidh: chan fheum sinn ach dàta a chuir a-steach a’ cleachdadh MOSI agus SCK a-mhàin. Bidh sinn a’ dol gu earrann 25.3.4 (conaltradh leth-duplex, conaltradh leth-dùbailte), far an lorg sinn 1 ghleoc agus 1 uèir dàta aon-stiùiridh (comharra gleoc 1 agus sruth dàta aon-stiùiridh 1):

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Anns a’ mhodh seo, bidh an aplacaid a’ cleachdadh SPI ann am modh tar-chuir a-mhàin no faighinn a-mhàin. / Tha modh tar-chuir a-mhàin coltach ri modh dà-fhillte: tha dàta air a ghluasad air a’ phrìne tar-chuir (MOSI ann am prìomh mhodh no MISO ann am modh tràillean), agus faodar am prìne faighinn (MISO no MOSI fa leth) a chleachdadh mar phrìne I / O cunbhalach . Anns a 'chùis seo, chan fheum an aplacaid ach am bufair Rx a leigeil seachad (ma thèid a leughadh, cha bhi dàta air a ghluasad an sin).

Sgoinneil, tha am prìne MISO an-asgaidh, ceangail sinn an comharra LAT ris. Bheir sinn sùil air Tagh Tràillean, a dh’ fhaodar air an STM32 a smachdachadh gu prògramach, a tha air leth goireasach. Leugh sinn am paragraf den aon ainm ann an earrann 25.3.1 SPI Tuairisgeul Coitcheann:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Tha fiosrachadh smachd bathar-bog NSS (SSM = 1) / tràilleachd ann am pìos SSI de chlàr SPI_CR1. Tha am prìne NSS taobh a-muigh fhathast saor airson feumalachdan tagraidh eile.

Tha an t-àm ann sgrìobhadh chun na clàran. Cho-dhùin mi SPI2 a chleachdadh, coimhead airson a sheòladh bunaiteach anns a’ chlàr-dhuilleag - ann an earrann 3.3 Mapa Cuimhne:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Uill, tòisichidh sinn:

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

Fosgail earrann 25.3.3 leis an tiotal fèin-mhìneachaidh “Configuring SPI in Master Mode”:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

1. Suidhich tricead gleoc sreathach le pìosan BR[2:0] sa chlàr SPI_CR1.

Tha na clàran air an cruinneachadh anns an earrann leabhran fiosrachaidh den aon ainm. Gluasad seòlaidh (Seòladh dheth) airson CR1 - 0x00, gu bunaiteach thèid a h-uile pìos a ghlanadh (Ath-shuidhich luach 0x0000):

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Bidh na pìosan BR a’ suidheachadh an roinneadh gleoc smachd, mar sin a’ dearbhadh dè cho tric sa bhios an SPI ag obair. Bidh an tricead STM32 againn 72 MHz, bidh an draibhear LED, a rèir a bhileig, ag obair le tricead suas ri 25 MHz, agus mar sin feumaidh sinn a roinn le ceithir (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. Suidhich na pìosan CPOL agus CPHA gus an dàimh eadar gluasad dàta agus àm gleoc sreathach a mhìneachadh (faic an dealbh air duilleag 240)

Leis gu bheil sinn a’ leughadh duilleag-dàta an seo agus gun a bhith a’ coimhead air sgeamaichean, leig dhuinn sùil nas mionaidiche a thoirt air an tuairisgeul teacsa air na pìosan CPOL agus CPHA air duilleag 704 (SPI Tuairisgeul Coitcheann):

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Ìre cloc agus polarity
A’ cleachdadh na pìosan CPOL agus CPHA den chlàr SPI_CR1, faodaidh tu ceithir dàimhean tìm a thaghadh gu prògramach. Bidh am pìos CPOL (polarity cloc) a 'cumail smachd air staid comharra a' ghleoc nuair nach eil dàta ga ghluasad. Bidh am pìos seo a’ cumail smachd air modhan maighstir is tràillean. Ma thèid CPOL ath-shuidheachadh, tha am prìne SCK ìosal ann am modh fois. Ma tha am pìos CPOL air a shuidheachadh, tha am prìne SCK àrd rè modh fois.
Nuair a thèid am pìos CPHA (ìre cloc) a shuidheachadh, is e an strobe ribe bit àrd an dàrna oir den chomharra SCK (a 'tuiteam ma tha CPOL soilleir, ag èirigh ma tha CPOL air a shuidheachadh). Tha an dàta air a ghlacadh leis an dàrna atharrachadh ann an comharra a’ ghleoc. Ma tha am pìos CPHA soilleir, is e an strobe ribe bit àrd oir àrdachaidh comharra SCK (oir tuiteam ma tha CPOL air a shuidheachadh, oir ag èirigh ma thèid CPOL fhuadach). Tha dàta air a ghlacadh aig a’ chiad atharrachadh ann an comharra a’ ghleoc.

Às deidh dhuinn an t-eòlas seo a ghabhail a-steach, thig sinn chun cho-dhùnadh gum feum an dà phìos fuireach neoni, oir Tha sinn airson gum fuirich an comharra SCK ìosal nuair nach eilear ga chleachdadh, agus gum bi dàta air a ghluasad air oir àrdachaidh na cuisle (faic Fig. Ag èirigh Iomall anns a’ chlàr DM634).

Co-dhiù, an seo thachair sinn an toiseach ri feart den bhriathrachas ann an clàran-dàta ST: annta tha an abairt “ath-shuidhich am pìos gu neoni” sgrìobhte gus beagan ath-shuidheachadhach chan eil beagan a ghlanadh, mar, mar eisimpleir, Atmega.

3. Suidhich am pìos DFF gus dearbhadh a bheil am bloc dàta ann an cruth 8-bit no 16-bit

Ghabh mi gu sònraichte 16-bit DM634 gus nach cuir mi dragh air a bhith a’ toirt seachad dàta PWM 12-bit, mar an DM633. Tha e ciallach DFF a shuidheachadh gu aon:

#define DFF         0x0800

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

4. Dèan rèiteachadh air a 'phìos LSBFIRST anns a' chlàr SPI_CR1 gus an cruth bloca a dhearbhadh

Bidh LSBFIRST, mar a tha an t-ainm a’ moladh, a’ rèiteachadh tar-chuir leis a’ phàirt as lugha an-toiseach. Ach tha DM634 airson dàta fhaighinn bhon ìre as cudromaiche. Mar sin, bidh sinn ga fhàgail ath-shuidheachadh.

5. Ann am modh bathar-cruaidh, ma tha feum air cuir a-steach bhon phrìne NSS, cuir comharra àrd ris a’ phrìne NSS rè an t-sreath gluasaid byte gu lèir. Ann am modh bathar-bog NSS, suidhich na pìosan SSM agus SSI anns a’ chlàr SPI_CR1. Ma tha prìne NSS gu bhith air a chleachdadh mar thoradh, chan fheumar ach am pìos SSOE a shuidheachadh.

Stàlaich SSM agus SSI gus dìochuimhneachadh mun mhodh bathar-cruaidh NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Feumaidh na pìosan MSTR agus SPE a bhith air an suidheachadh (cha bhith iad air an suidheachadh ach ma tha an comharra NSS àrd)

Gu fìrinneach, leis na pìosan sin bidh sinn ag ainmeachadh ar SPI mar mhaighstir agus ga thionndadh air:

#define MSTR        0x0004
#define SPE         0x0040

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

Tha SPI air a rèiteachadh, leig dhuinn gnìomhan a sgrìobhadh sa bhad a chuireas bytes chun draibhear. Lean air adhart a’ leughadh 25.3.3 “A’ rèiteachadh SPI ann am prìomh mhodh”:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Òrdugh gluasad dàta
Bidh tar-chuir a’ tòiseachadh nuair a thèid byte a sgrìobhadh chun bufair Tx.
Tha am byte dàta air a luchdachadh a-steach don chlàr shift aig co-shìnte modh (bhon bhus a-staigh) rè sgaoileadh a’ chiad phìos, às deidh sin thèid a ghluasad gu sreathach Modh prìne MOSI, an toiseach no am pìos mu dheireadh air adhart a rèir suidheachadh pìos LSBFIRST sa chlàr CPI_CR1. Tha bratach TXE air a shuidheachadh às deidh sgaoileadh dàta bho bufair Tx gu clàr gluasad, agus cuideachd a’ gineadh brisidh ma tha am pìos TXEIE sa chlàr CPI_CR1 air a shuidheachadh.

Thog mi beagan fhaclan san eadar-theangachadh gus aire a tharraing gu aon fheart de bhuileachadh SPI ann an luchd-riaghlaidh STM. Air Atmega tha bratach TXE (Tx Falamh, Tx falamh agus deiseil airson dàta fhaighinn) air a shuidheachadh dìreach às deidh am byte gu lèir a chuir a-muigh. Agus an seo tha am bratach seo air a shuidheachadh an dèidh don byte a bhith air a chuir a-steach don chlàr shift a-staigh. Leis gu bheil e air a phutadh an sin leis na pìosan uile aig an aon àm (ann an co-shìnte), agus an uairsin thèid an dàta a ghluasad ann an òrdugh, tha TXE air a shuidheachadh mus tèid am byte a chuir gu tur. Tha seo cudromach oir a thaobh an draibhear LED againn, feumaidh sinn am prìne LAT a tharraing às deidh a chuir всех dàta, i.e. Cha bhi bratach TXE leis fhèin gu leòr dhuinn.

Tha seo a’ ciallachadh gu bheil feum againn air bratach eile. Bheir sinn sùil air 25.3.7 - “Brataichean Inbhe”:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
<…>
Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Bratach GNÀTHACH
Tha bratach BSY air a shuidheachadh agus air a ghlanadh le bathar-cruaidh (chan eil buaidh aig sgrìobhadh thuige). Tha bratach BSY a’ comharrachadh staid ìre conaltraidh SPI.
Bidh e ag ath-shuidheachadh:
nuair a bhios an gluasad deiseil (ach a-mhàin ann am modh maighstir ma tha an gluasad leantainneach)
nuair a tha SPI à comas
nuair a thachras mearachd modh maighstir (MODF=1)
Mura h-eil an gluasad leantainneach, thèid bratach BSY a ghlanadh eadar gach gluasad dàta

Ceart gu leòr, thig seo gu feum. Feuch an lorg sinn a-mach càite a bheil am bufair Tx. Gus seo a dhèanamh, leugh “Clàr Dàta SPI”:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Pìosan 15:0 DR[15:0] Clàr dàta
Dàta air fhaighinn no dàta ri thoirt seachad.
Tha an clàr dàta air a roinn ann an dà bufair - aon airson sgrìobhadh (bufair tar-chuir) agus aon airson leughadh (faigh bufair). Bidh sgrìobhadh chun chlàr dàta a’ sgrìobhadh chun bufair Tx, agus tillidh leughadh bhon chlàr dàta an luach a tha sa bhufair Rx.

Uill, agus an clàr inbhe, far an lorgar na brataichean TXE agus BSY:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Bidh sinn a’ sgrìobhadh:

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

Uill, leis gu feum sinn 16 tursan dà bytes a thar-chuir, a rèir an àireamh de thoraidhean draibhearan LED, rudeigin mar seo:

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

Ach chan eil fios againn ciamar a tharraingeas sinn am prìne LAT fhathast, agus mar sin thèid sinn air ais gu I/O.

A 'sònrachadh phònaichean

Anns an STM32F1, tha na clàran le uallach airson staid nam prìneachan gu math neo-àbhaisteach. Tha e soilleir gu bheil barrachd dhiubh ann na Atmega, ach tha iad cuideachd eadar-dhealaichte bho chips STM eile. Earrann 9.1 Tuairisgeul Coitcheann air GPIO:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Gach aon de na puirt I/O adhbhar coitcheann (GPIO) tha dà chlàr rèiteachaidh 32-bit (GPIOx_CRL agus GPIOx_CRH), dà chlàr dàta 32-bit (GPIOx_IDR agus GPIOx_ODR), clàr seata / ath-shuidheachadh 32-bit (GPIOx_BSRR), clàr ath-shuidheachadh 16-bit (GPIOx_BRR) agus 32- clàr bacadh bit (GPIOx_LCKR).

Tha a’ chiad dà chlàr neo-àbhaisteach, agus cuideachd gu math mì-ghoireasach, leis gu bheil na prìneachan puirt 16 sgapte thairis orra ann an cruth “ceithir pìosan gach bràthair”. An fheadhainn sin. tha prìneachan neoni gu seachd ann an CRL, agus tha an còrr ann an CRH. Aig an aon àm, tha na clàran a tha air fhàgail gu soirbheachail a’ toirt a-steach pìosan de phrìneachan a’ phuirt - gu tric bidh an leth “glèidhte” air fhàgail.

Airson sìmplidh, leig dhuinn tòiseachadh bho dheireadh na liosta.

Chan eil feum againn air clàr bacaidh.

Tha na clàran seata agus ath-shuidheachadh gu math èibhinn leis gu bheil iad gu ìre a’ dùblachadh a chèile: faodaidh tu a h-uile dad a sgrìobhadh ann am BSRR a-mhàin, far an ath-shuidhich na pìosan 16 as àirde am prìne gu neoni, agus thèid an fheadhainn as ìsle a shuidheachadh gu 1, no faodaidh tu cuideachd cleachd BRR, agus na 16 pìosan as ìsle dhiubh dìreach ath-shuidhich am prìne . Is toil leam an dàrna roghainn. Tha na clàran sin cudromach oir tha iad a’ toirt cothrom atamach air prìneachan:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Atamach Suidhich no Ath-shuidheachadh
Chan eil feum air casg a chuir air nuair a bhios tu a’ prògramadh GPIOx_ODR aig ìre bit: faodar aon phìos no barrachd atharrachadh le aon obrachadh sgrìobhaidh atamach APB2. Tha seo air a choileanadh le bhith a’ sgrìobhadh “1” dhan chlàr seata/ath-shuidheachadh (GPIOx_BSRR no, airson ath-shuidheachadh a-mhàin, GPIOx_BRR) den phìos a dh’fheumar atharrachadh. Fuirichidh pìosan eile gun atharrachadh.

Tha ainmean gu math mìneachail aig na clàran dàta - IDR = Input Clàr stiùiridh, clàr a-steach; ODR = Species Clàr stiùiridh, clàr toraidh. Cha bhith feum againn orra sa phròiseact làithreach.

Agus mu dheireadh, smachd air clàran. Leis gu bheil ùidh againn anns an dàrna prìneachan SPI, is e sin PB13, PB14 agus PB15, bheir sinn sùil sa bhad air CRH:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Agus chì sinn gum feum sinn rudeigin a sgrìobhadh ann am pìosan bho 20 gu 31.

Tha sinn mu thràth air faighinn a-mach os cionn na tha sinn ag iarraidh bho phrìneachan, mar sin an seo nì mi às aonais dealbh-sgrìn, canaidh mi gu bheil MODE a’ sònrachadh an stiùiridh (cuir a-steach ma tha an dà phìos air an suidheachadh gu 0) agus astar prìne (feumaidh sinn 50MHz, i.e. an dà chuid prìne gu “1”), agus bidh CNF a’ suidheachadh a’ mhodh: “push-pull” cunbhalach – 00, “eile” – 10. Gu gnàthach, mar a chì sinn gu h-àrd, tha an treas pìos aig a h-uile prìne bhon bhonn (CNF0), cuiridh e iad gu modh cuir a-steach fleòdraidh.

Leis gu bheil mi an dùil rudeigin eile a dhèanamh leis a ’chip seo, airson sìmplidheachd tha mi air a h-uile luach MODE agus CNF a mhìneachadh airson gach cuid na clàran smachd ìosal agus àrd.

An dòigh air choireigin mar seo

#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

Tha na prìnichean againn suidhichte air port B (seòladh bunaiteach - 0x40010C00), còd:

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

Agus, mar sin, faodaidh tu mìneachaidhean a sgrìobhadh airson LAT, a bhios air an tionndadh le clàran BRR agus 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 dìreach le inertia, bha e a-riamh mar sin, leig leis fuireach)

A-nis tha a h-uile dad math, ach chan eil e ag obair. Leis gur e STM32 a tha seo, bidh iad a’ sàbhaladh dealan, a tha a’ ciallachadh gum feum thu gleocadh a dhèanamh air na h-iomaill a tha a dhìth.

Tionndaidh air gleoc

Tha uallach air an uaireadair, ris an canar cuideachd Clock, airson gleoc. Agus dh’ fhaodadh sinn an giorrachadh RCC fhaicinn mu thràth. Bidh sinn a’ coimhead air a shon anns na sgrìobhainnean: is e seo Ath-shuidheachadh agus Smachd Cloc.

Mar a chaidh a ràdh gu h-àrd, gu fortanach, chaidh am pàirt as duilghe den chuspair gleocaidh a dhèanamh dhuinn le daoine bho STM, agus tha sinn a’ toirt taing mhòr dhaibh (a-rithist bheir mi ceangal gu Làrach-lìn Di Halt, gus a dhèanamh soilleir dè cho troimh-chèile a tha e). Chan fheum sinn ach clàran le uallach airson gleocadh iomaill a chomasachadh (Clàran Cumasaich Cloc Iomallach). An toiseach, lorg sinn seòladh bunaiteach an RCC, tha e aig fìor thoiseach na “Memory Map”:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

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

Agus an uairsin an dàrna cuid cliog air a’ cheangal far am feuch thu ri rudeigin a lorg air a’ phlàta, no, fada nas fheàrr, gabh tro na tuairisgeulan air na clàran comasachaidh bho na h-earrannan mu dheidhinn cuir an comas clàran. Càite am faigh sinn RCC_APB1ENR agus RCC_APB2ENR:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Agus tha iad, a rèir sin, a’ toirt a-steach pìosan a tha a’ toirt a-steach gleocadh SPI2, IOPB (I/O Port B) agus gnìomhan eile (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;

Gheibhear an còd deireannach an seo.

Ma tha cothrom agad agus miann deuchainn a dhèanamh, ceangail an DM634 mar seo: DAI gu PB15, DCK gu PB13, LAT gu PB14. Bidh sinn a 'toirt cumhachd don dràibhear bho 5 volts, na dì-chuimhnich ceangal a dhèanamh air na gàrraidhean.

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

STM8 PWM

PWM air STM8

Nuair a bha mi dìreach a’ dealbhadh an artaigil seo, cho-dhùin mi, mar eisimpleir, feuchainn ri maighstireachd a dhèanamh air cuid de ghnìomhachd de chip air nach robh mi eòlach a’ cleachdadh dìreach duilleag-dàta, gus nach biodh greusaiche gun bhrògan agam. Bha STM8 air leth freagarrach airson na dreuchd seo: an toiseach, bha dà bhòrd Sìneach agam le STM8S103, agus san dàrna àite, chan eil fèill mhòr air, agus mar sin tha am buaireadh airson fuasgladh a leughadh agus a lorg air an eadar-lìn an urra ri dìth nam fuasglaidhean sin.

Tha aig a’ chip cuideachd dàta и Leabhar fiosrachaidh RM0016, anns a 'chiad tha pinout agus seòlaidhean clàraidh, anns an dàrna - a h-uile càil eile. Tha STM8 air a phrògramadh ann an C ann an IDE uamhasach ST Lèirsinne leasachadh.

Cloc agus I/O

Gu gnàthach, bidh STM8 ag obrachadh aig tricead 2 MHz, feumar seo a cheartachadh sa bhad.

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Cloc HSI (Àrd-astar a-staigh).
Tha an comharra cloc HSI a’ tighinn bho oscillator 16 MHz RC a-staigh le roinneadh prògramaichte (1 gu 8). Tha e suidhichte ann an clàr roinneadh nan gleoc (CLK_CKDIVR).
Nota: aig an toiseach, tha oscillator HSI RC le roinneadh 8 air a thaghadh mar phrìomh thùs comharra a’ ghleoc.

Lorgaidh sinn seòladh a’ chlàir anns a’ chlàr-dhuilleag, an tuairisgeul ann an refman agus chì sinn gum feumar an clàr a ghlanadh:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Leis gu bheil sinn gu bhith a’ ruith PWM agus a’ ceangal nan LEDs, leig dhuinn sùil a thoirt air a’ phrìne:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Tha a’ chip beag, tha mòran ghnìomhan crochte air na h-aon phrìneachan. Is e na tha eadar camagan ceàrnagach “gnìomh eile”, tha e air a thionndadh le “roghainn bytes” (bytes roghainn) - rudeigin mar fuses Atmega. Faodaidh tu na luachan aca atharrachadh gu prògramach, ach chan eil feum air, oir Cha tèid an gnìomh ùr a chuir an gnìomh ach às deidh ath-thòiseachadh. Tha e nas fhasa ST Visual Programmer a chleachdadh (air a luchdachadh sìos le Visual Develop), as urrainn na bytes sin atharrachadh. Tha am pinout a’ sealltainn gu bheil prìneachan CH1 agus CH2 a’ chiad timer falaichte ann an camagan ceàrnagach; feumar na pìosan AFR1 agus AFR0 a shuidheachadh ann an STVP, agus gluaisidh an dàrna fear cuideachd toradh CH1 an dàrna timer bho PD4 gu PC5.

Mar sin, bidh smachd aig prìneachan 6 air na LEDs: PC6, PC7 agus PC3 airson a’ chiad timer, PC5, PD3 agus PA3 airson an dàrna fear.

Tha a bhith a’ stèidheachadh na prìneachan I/O iad fhèin air STM8 nas sìmplidhe agus nas loidsigeach na air STM32:

  • eòlach bho chlàr stiùireadh dàta Atmega DDR (Clàr stiùireadh dàta): 1 = toradh;
  • a 'chiad chlàr smachd CR1, nuair a bhios an toradh, a' suidheachadh a 'mhodh push-pull (1) no drèanadh fosgailte (0); Leis gu bheil mi a 'ceangal nan LEDs ris a' chip le cathodes, bidh mi a 'fàgail neamhan an seo;
  • tha an dàrna clàr smachd CR2, nuair a bhios an toradh, a’ suidheachadh astar a’ ghleoc: 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

Suidheachadh PWM

An toiseach, mìnichidh sinn na teirmean:

  • Tricead PWM - tricead leis a bheil an timer a 'gleusadh;
  • Ath-luchdachadh gu fèin-ghluasadach, AR - luach fèin-luchdachadh suas ris am bi an timer a’ cunntadh (ùine cuisle);
  • Tachartas Ùrachaidh, UEV - tachartas a thachras nuair a tha an timer air cunntadh gu AR;
  • Cearcall Dleastanas PWM - cearcall dleastanais PWM, ris an canar gu tric “factar dleastanais”;
  • Glac/Dèan coimeas eadar luach - luach airson glacadh / coimeas, ris a bheil an timer air cunntadh nì e rudeigin (a thaobh PWM, bidh e a’ tionndadh a’ chomharra toraidh);
  • Luach ro-luchdachadh - luach ro-luchdaichte. Dèan coimeas eadar luach chan urrainn dhuinn atharrachadh fhad ‘s a tha an timer a’ strì, air neo brisidh cearcall PWM. Mar sin, tha luachan ùra tar-chuir air an cur ann am bufair agus air an tarraing a-mach nuair a ruigeas an timer deireadh a chunntadh sìos agus a thèid ath-shuidheachadh;
  • Edge-aligned и Modhan stèidhichte air meadhan - co-thaobhadh ri taobh na crìche agus sa mheadhan, an aon rud ri Atmel's PWM luath и PWM ceart gu ìre.
  • OCiREF, Toradh Dèan coimeas eadar Comharra Iomraidh - comharra toraidh iomraidh, gu dearbh, na tha a’ nochdadh air a ’phrìne co-fhreagarrach ann am modh PWM.

Mar a tha soilleir mar-thà bhon pinout, tha comasan PWM aig dà timers - a’ chiad agus an dàrna fear. Tha an dà chuid 16-bit, tha tòrr fheartan a bharrachd aig a’ chiad fhear (gu sònraichte, faodaidh e cunntadh suas is sìos). Feumaidh sinn an dà chuid a bhith ag obair co-ionann, agus mar sin chuir mi romhpa tòiseachadh leis an dàrna fear a tha follaiseach nas bochda, gus nach cleachd sinn rudeigin nach eil ann gun fhiosta. Is e duilgheadas a th’ ann gu bheil an tuairisgeul air gnìomhachd PWM a h-uile timers anns an leabhar-làimhe iomraidh anns a’ chaibideil mun chiad timer (17.5.7 Modh PWM), agus mar sin feumaidh tu leum air ais is air adhart tron ​​​​sgrìobhainn fad na h-ùine.

Tha buannachd chudromach aig PWM air STM8 thairis air PWM air Atmega:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
PWM co-cheangailte ris a’ chrìoch
Rèiteachadh cunntais bho bhonn gu mullach
Tha cunntadh bhon bhonn gu h-àrd gnìomhach ma thèid am pìos DIR sa chlàr TIM_CR1 a ghlanadh
Eisimpleir:
Bidh an eisimpleir a’ cleachdadh a’ chiad mhodh PWM. Tha an comharra iomraidh PWM OCiREF air a chumail àrd cho fada ri TIM1_CNT < TIM1_CCRi. Mur eil, bheir e ìre ìosal. Ma tha an luach coimeas ann an clàr TIM1_CCRi nas àirde na an luach fèin-luchdachadh (clàr TIM1_ARR), tha an comharra OCiREF air a chumail aig 1. Mas e 0 an luach coimeas, tha OCiREF air a chumail aig neoni....

timer STM8 rè tachartas ùrachadh seicean an toiseach coimeas a dhèanamh eadar luach, agus dìreach an uairsin a’ toirt a-mach comharra fiosrachaidh. Bidh timer Atmega an-toiseach a ’sgrìobadh suas agus an uairsin a’ dèanamh coimeas, agus mar thoradh air sin thig compare value == 0 tha an toradh na shnàthad, ris am feumar dèiligeadh ann an dòigh air choireigin (mar eisimpleir, le bhith a’ tionndadh an loidsig gu prògramach).

Mar sin na tha sinn airson a dhèanamh: PWM 8-bit (AR == 255), a’ cunntadh bho bhonn gu mullach, co-thaobhadh ri taobh na crìche. Leis gu bheil na bleibean solais ceangailte ris a’ chip le catodes, bu chòir don PWM 0 (LED air) a chuir a-mach gus an tèid coimeas a dhèanamh eadar luach agus 1 às deidh.

Tha sinn air leughadh mu chuid mu thràth Modh PWM, mar sin lorg sinn an clàr a tha a dhìth den dàrna timer le bhith a’ lorg san leabhar-làimhe iomraidh airson an abairt seo (18.6.8 - TIMx_CCMR1):

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
110: A’ chiad mhodh PWM - nuair a bhios tu a’ cunntadh bho bhonn gu mullach, tha a’ chiad seanal gnìomhach fhad ‘s a tha TIMx_CNT < TIMx_CCR1. Rud eile, tha a’ chiad seanal neo-ghnìomhach. [A bharrachd anns an sgrìobhainn tha lethbhreac-past mearachdach bho timer 1] 111: An dàrna modh PWM - nuair a thathar a’ cunntadh bho bhonn gu mullach, tha a’ chiad seanal neo-ghnìomhach fhad ‘s a tha TIMx_CNT < TIMx_CCR1. Rud eile, tha a’ chiad sianal gnìomhach.

Leis gu bheil na LEDs ceangailte ris an MK le cathodes, tha an dàrna modh a ’freagairt oirnn (a’ chiad fhear cuideachd, ach chan eil fios againn fhathast).

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Bit 3 OC1PE: Dèan comas air prìne 1 ro-luchdachadh
0: Tha clàr ro-luchdachadh air TIMx_CCR1 à comas. Faodaidh tu sgrìobhadh gu TIMx_CCR1 uair sam bith. Bidh an luach ùr ag obair sa bhad.
1: Tha clàr ro-luchdachadh air TIMx_CCR1 air a chomasachadh. Obraichean leughaidh / sgrìobhaidh faigh cothrom air a’ chlàr ro-luchdachadh. Tha an luach ro-luchdaichte TIMx_CCR1 air a luchdachadh a-steach don chlàr sgàil rè gach tachartas ùrachaidh.
* Nòta: Airson modh PWM a bhith ag obair ceart, feumaidh na clàran ro-luchdachadh a bhith comasach. Chan eil seo riatanach ann am modh comharra singilte (tha am pìos OPM suidhichte ann an clàr TImx_CR1).

Ceart gu leòr, tionndaidhidh sinn air a h-uile dad a dh ’fheumas sinn airson na trì seanalan den dàrna 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);

Tha AR air a dhèanamh suas de dhà chlàr ochd pìosan, tha a h-uile dad sìmplidh:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Chan urrainn don dàrna timer cunntadh ach bho bhonn gu mullach, co-thaobhadh ri taobh na crìche, chan fheumar dad atharrachadh. Suidhichidh sinn an roinneadh tricead, mar eisimpleir, gu 256. Airson an dàrna timer, tha an roinneadh air a shuidheachadh sa chlàr TIM2_PSCR agus tha e na chumhachd dà:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Chan eil air fhàgail ach na co-dhùnaidhean a thionndadh agus an dàrna timer fhèin. Tha a 'chiad duilgheadas air a rèiteachadh le clàran Glac/Dèan coimeas Ceadaich: tha dà, trì seanalan sgapte thairis orra gu neo-chothromach. An seo faodaidh sinn cuideachd ionnsachadh gu bheil e comasach atharrachadh polarity a 'chomharra, i.e. ann am prionnsapal, bha e comasach Modh PWM 1 a chleachdadh. Bidh sinn a’ sgrìobhadh:

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

Agus mu dheireadh, bidh sinn a’ tòiseachadh air an timer sa chlàr TImx_CR1:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Sgrìobhamaid analogue sìmplidh de AnalogWrite(), a ghluaiseas na fìor luachan chun an timer airson coimeas. Tha na clàran air an ainmeachadh mar as àbhaist Glac/Dèan coimeas eadar clàran, tha dhà dhiubh ann airson gach seanail: na pìosan 8 aig ìre ìosal ann an TIM2_CCRxL agus an fheadhainn àrd-òrdugh ann an TIM2_CCRxH. Leis gu bheil sinn air PWM 8-bit a chruthachadh, tha e gu leòr dìreach na pìosan as cudromaiche a sgrìobhadh:

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

Mothaichidh an leughadair furachail gu bheil PWM beagan easbhaidheach againn, gun chomas lìonadh 100% a thoirt a-mach (aig luach as àirde de 255, tha an comharra air a thionndadh airson aon chearcall timer). Airson LEDs chan eil seo gu diofar, agus faodaidh an leughadair furachail tomhas mar a chuireas e ceart e.

Bidh PWM air an dàrna timer ag obair, gluaisidh sinn air adhart chun chiad fhear.

Tha dìreach na h-aon phìosan aig a’ chiad timer anns na h-aon chlàran (is e dìreach gu bheil na pìosan sin a dh’ fhan “glèidhte” san dàrna timer air an cleachdadh gu gnìomhach anns a’ chiad fhear airson a h-uile seòrsa rud adhartach). Mar sin, tha e gu leòr seòlaidhean nan aon chlàran a lorg anns a’ bhileag-dàta agus lethbhreac a dhèanamh den chòd. Uill, atharraich luach an roinneadh tricead, oir ... tha a’ chiad timer ag iarraidh chan e cumhachd dhà fhaighinn, ach luach 16-bit ceart ann an dà chlàr Prescaler Àrd и Ìosal. Bidh sinn a’ dèanamh a h-uile càil agus... chan obraich a’ chiad timer. Dè tha ceàrr?

Chan urrainnear an duilgheadas fhuasgladh ach le bhith a’ coimhead tron ​​​​earrann gu lèir mu chlàran smachd timer 1, far am bi sinn a’ coimhead airson an tè nach eil aig an dàrna timer. Bidh 17.7.30 Clàr brisidh (TIM1_BKR), far a bheil am pìos seo:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Dèan comas air prìomh toradh

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Tha sin uile gu cinnteach a-nis, an còd ann.

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

STM8 ioma-fhillte

Ioma-fhillte air STM8

Is e an treas mion-phròiseact ochd LEDan RGB a cheangal ris an dàrna timer ann am modh PWM agus toirt orra dathan eadar-dhealaichte a nochdadh. Tha e stèidhichte air bun-bheachd ioma-fhillteachd LED, is e sin ma thionndaidheas tu air agus dheth LEDs gu math, gu math luath, bidh e coltach dhuinn gu bheil iad an-còmhnaidh air adhart (mairsinneachd lèirsinn, inertia de lèirsinn lèirsinneach). Rinn mi uair rudeigin mar seo air Arduino.

Tha an algorithm obrach a’ coimhead mar seo:

  • ceangailte anod a 'chiad RGB LED;
  • lasadh e, a’ cur na comharran riatanach gu na cathodes;
  • feitheamh gus deireadh a 'chearcall PWM;
  • ceangailte anod an dàrna RGB LED;
  • lasadh e...

Uill, etc. Gu dearbh, airson obrachadh breagha tha e riatanach gum bi an anod ceangailte agus gu bheil an LED “air a lasadh” aig an aon àm. Uill, no cha mhòr. Ann an suidheachadh sam bith, feumaidh sinn còd a sgrìobhadh a bheir a-mach luachan ann an trì seanalan den dàrna timer, gan atharrachadh nuair a ruigear UEV, agus aig an aon àm atharraich an RGB LED a tha gnìomhach an-dràsta.

Leis gu bheil tionndadh LED fèin-ghluasadach, feumaidh sinn “cuimhne bhidio” a chruthachadh às am faigh an neach-làimhseachaidh stad dàta. Seo cruinneachadh sìmplidh:

uint8_t colors[8][3];

Gus dath LED sònraichte atharrachadh, bidh e gu leòr na luachan riatanach a sgrìobhadh a-steach don raon seo. Agus bidh an caochladair an urra ri àireamh an LED gnìomhach

uint8_t cnt;

Demux

Airson iomadachadh ceart, feumaidh sinn, gu h-annasach gu leòr, CD74HC238 demultiplexer. Demultiplexer - chip a chuireas an gnìomhaiche ann am bathar-cruaidh <<. Tro thrì prìneachan cuir a-steach (pìosan 0, 1 agus 2) bidh sinn a’ toirt àireamh trì-bit X dha, agus mar fhreagairt bidh e a’ gnìomhachadh àireamh toraidh (1<<X). Tha na tha air fhàgail den chip air a chleachdadh gus an dealbhadh gu lèir a sgèile. Feumaidh sinn a ’chip seo chan ann a-mhàin gus an àireamh de phrìneachan a tha a’ fuireach aig a ’mhicro-smachdadair a lughdachadh, ach cuideachd airson sàbhailteachd - gus nach cuir thu air barrachd LEDan na tha comasach agus gun a bhith a’ losgadh an MK. Cosgaidh a' chip sgillinn agus bu chòir a chumail an-còmhnaidh sa chaibineat leigheis dachaigh agad.

Bidh an CD74HC238 againn an urra ri bhith a’ toirt bholtaids don anod den LED a tha thu ag iarraidh. Ann an ioma-fhillte làn-chuimseach, bheireadh e bholtaids don cholbh tro P-MOSFET, ach anns an demo seo tha e comasach gu dìreach, air sgàth bidh e a’ tarraing 20 mA, a rèir rangachadh iomlan as àirde anns an dàta. Bho Duilleag fiosrachaidh CD74HC238 feumaidh sinn pinouts agus an duilleag meallta seo:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
H = ìre bholtachd àrd, L = ìre bholtachd ìosal, X - na gabh dragh

Bidh sinn a’ ceangal E2 agus E1 ris an talamh, E3, A0, A1 agus A3 ri prìneachan PD5, PC3, PC4 agus PC5 de STM8. Leis gu bheil an dà chuid ìrean ìosal agus àrd anns a’ chlàr gu h-àrd, bidh sinn a’ rèiteachadh na prìneachan sin mar phrìneachan-tarraing.

PWM

Tha PWM air an dàrna timer air a rèiteachadh san aon dòigh ris an sgeulachd roimhe, le dà eadar-dhealachadh:

An toiseach, feumaidh sinn an casg a chuir an gnìomh Tachartas ùrachadh (UEV) a chanas gnìomh a thogas an LED gnìomhach. Tha seo air a dhèanamh le bhith ag atharrachadh an ìre Ùraich an comas briseadh ann an clàr le ainm ag innse

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
Cuir stad air clàradh comas

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Tha an dàrna eadar-dhealachadh co-cheangailte ri iongantas ioma-fhillte, leithid taibhse - glow parasitic de diodes. Anns a ’chùis againn, dh’ fhaodadh e nochdadh air sgàth gu bheil an timer, às deidh dha briseadh adhbhrachadh air an UEV, a ’leantainn air adhart a’ strì, agus chan eil ùine aig an inneal-làimhseachaidh stad an LED atharrachadh mus tòisich an timer a ’sgrìobhadh rudeigin dha na prìneachan. Gus cuir an-aghaidh seo, feumaidh tu an loidsig a thionndadh (0 = soilleireachd as àirde, 255 = chan eil dad air a lasadh) agus luachan cearcall fìor dhleastanas a sheachnadh. An fheadhainn sin. dèan cinnteach às deidh UEV gun tèid na LEDan a-mach gu tur airson aon chearcall PWM.

Ag atharrachadh polarity:

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

Seachain a bhith a’ suidheachadh r, g agus b gu 255 agus cuimhnich gun tionndaidh thu iad nuair a bhios tu gan cleachdadh.

A’ briseadh

Is e brìgh briseadh-dùil gu bheil a’ chip ann an cuid de shuidheachaidhean a’ stad bho bhith a’ coileanadh a’ phrìomh phrògram agus a’ gairm gnìomh taobh a-muigh. Bidh briseadh a’ tachairt mar thoradh air buaidhean bhon taobh a-muigh no a-staigh, a’ toirt a-steach an timer.

Nuair a chruthaich sinn pròiseact an toiseach ann an ST Visual Develop, a bharrachd air main.c fhuair sinn uinneag le faidhle dìomhair stm8_interrupt_vector.c, air a ghabhail a-steach gu fèin-ghluasadach sa phròiseact. Anns an fhaidhle seo, tha gnìomh air a shònrachadh airson gach briseadh NonHandledInterrupt. Feumaidh sinn ar gnìomh a cheangal ris a’ bhriseadh a tha thu ag iarraidh.

Tha clàr de vectaran brisidh anns a’ bhileag, far an lorg sinn an fheadhainn a dh’ fheumas sinn:

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8
13 ùrachadh/thar-shruth TIM2
14 TIM2 glacadh/coimeas

Feumaidh sinn an LED atharrachadh aig UEV, agus mar sin feumaidh sinn stad a chuir air #13.

A rèir sin, an toiseach, anns an fhaidhle stm8_interrupt_vector.c atharraich ainm bunaiteach na gnìomh le uallach airson briseadh Àireamh 13 (IRQ13) dhut fhèin:

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

San dàrna h-àite, feumaidh sinn faidhle a chruthachadh main.h leis an t-susbaint a leanas:

#ifndef __MAIN_H
#define __MAIN_H

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

Agus mu dheireadh, sgrìobh an gnìomh seo nad 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;
}

Chan eil air fhàgail ach casg a chuir air casg. Tha seo air a dhèanamh a’ cleachdadh an àithne assembler rim - feumaidh tu coimhead air a shon a-staigh Leabhar-làimhe prògramaidh:

//enable interrupts
_asm("rim");

Is e òrdugh assembler eile sim - cuir dheth briseadh-dùil. Feumaidh iad a bhith air an tionndadh dheth fhad ‘s a tha luachan ùra gan sgrìobhadh chun“ cuimhne bhidio ”, gus nach bi briseadh a chaidh adhbhrachadh aig an àm cheàrr a’ milleadh an t-sreath.

Còd a h-uile - air GitHub.

Leugh bileagan 2: SPI air STM32; PWM, timers agus brisidhean air STM8

Ma tha an artaigil seo feumail co-dhiù, cha do sgrìobh mi e gu dìomhain. Bidh mi toilichte beachdan agus beachdan fhaighinn, feuchaidh mi ris a h-uile dad a fhreagairt.

Source: www.habr.com

Cuir beachd ann