Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

В an chéad chuid Rinne mé iarracht insint d'innealtóirí leictreonaic caitheamh aimsire a d'fhás aníos ó Arduino pants conas agus cén fáth ar cheart dóibh bileoga sonraí agus doiciméid eile le haghaidh micrea-rialaitheoirí a léamh. Bhí an téacs mór, agus mar sin gheall mé samplaí praiticiúla a thaispeáint in alt ar leith. Bhuel, thug sé beacán bainne air féin ...

Sa lá atá inniu taispeánfaidh mé duit conas bileoga a úsáid chun go leor simplí a réiteach, ach is gá le haghaidh go leor tionscadal, tascanna ar rialtóirí STM32 (Blue Pill) agus STM8. Tá gach tionscadal taispeána tiomnaithe do na soilse is fearr liom, cuirfimid iad i gcainníochtaí móra, agus beidh orainn gach cineál forimeallach suimiúil a úsáid le haghaidh.

Bhí an téacs ollmhór arís, mar sin ar mhaithe le caoithiúlacht tá an t-ábhar á dhéanamh agam:

Pill Gorm STM32: 16 stiúir le tiománaí DM634
STM8: Sé bhioráin PWM a shocrú
STM8: 8 stiúir RGB ar thrí bhioráin, idirbhriseadh

Séanadh: Ní innealtóir mé, ní ligim orm go bhfuil eolas domhain agam ar leictreonaic, tá an t-alt dírithe ar amaitéaraigh cosúil liomsa. Go deimhin, mheas mé mé féin dhá bhliain ó shin mar an spriocghrúpa. Dá mbeadh duine éigin tar éis a rá liom ag an am sin nach raibh na sonraí ar shlis neamhaithnidiúla scanrúil le léamh, ní bheadh ​​mórán ama caite agam ag lorg roinnt píosaí cód ar an Idirlíon agus ag cumadh crutches le siosúr agus téip ghreamaitheach.

Tá fócas an ailt seo ar bhileoga sonraí, ní ar thionscadail, agus mar sin seans nach mbíonn an cód an-néata agus go minic teoranta. Tá na tionscadail féin an-simplí, cé go bhfuil siad oiriúnach do chéad aithne leis an sliseanna nua.

Tá súil agam go gcabhróidh mo alt le duine ag céim den chineál céanna den tumoideachas sa chaitheamh aimsire.

STM 32

16 stiúir le DM634 agus SPI

Tionscadal beag ag baint úsáide as Blue Pill (STM32F103C8T6) agus DM634 tiománaí LED. Ag baint úsáide as datasheets, déanfaimid amach an tiománaí, calafoirt STM IO agus cumróimid SPI.

DM634

Is féidir sliseanna Taiwanese le 16 aschur PWM 16-giotán, a nascadh i slabhraí. Tá an tsamhail íseal-deireadh 12-giotán ar eolas ó thionscadal intíre Pacáiste solais. Ag am amháin, ag roghnú idir an DM63x agus an TLC5940-aitheanta go maith, roghnaigh mé DM ar chúiseanna éagsúla: 1) Tá TLC ar Aliexpress cinnte falsa, ach níl an ceann seo; 2) Tá PWM uathrialach ag DM lena gineadóir minicíochta féin; 3) d'fhéadfaí é a cheannach go saor i Moscó, seachas fanacht le dáileacht ó Ali. Agus, ar ndóigh, bhí sé suimiúil foghlaim conas an sliseanna a rialú duit féin, seachas leabharlann réidh a úsáid. Cuirtear sliseanna i láthair go príomha anois sa phacáiste SSOP24; is furasta iad a shádráil le cuibheoir.

Ós rud é gur Taiwanese an monaróir, Bileog sonraí tá an sliseanna scríofa i mBéarla na Síne, rud a chiallaíonn go mbeidh sé spraoi. Ar dtús breathnaíonn muid ar an pinout (Ceangal Bioráin( ) a thuiscint cén cos lena gceanglófar cad chuige, agus cur síos ar na bioráin (Cur síos ar an mBioráin). 16 bioráin:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Foinsí Doirteal DC (Drain Oscailte)

Sink / Aschur draein oscailte – taosc; foinse an tsrutha insreafa; tá an t-aschur ceangailte le talamh sa stát gníomhach - tá na soilse ceangailte leis an tiománaí ag catodes. Go leictreach, ní “draein oscailte” é seo ar ndóigh (draein oscailte), ach i mbileogáin is minic a aimsítear an t-ainmniú seo do phionnaí i mód draein.

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Friotóirí seachtracha idir REXT agus GND chun an luach reatha aschuir a shocrú

Tá friotóir tagartha suiteáilte idir an bioráin REXT agus an talamh, a rialaíonn friotaíocht inmheánach na n-aschur, féach an graf ar leathanach 9 den bhileog sonraí. Sa DM634, is féidir an fhriotaíocht seo a rialú freisin le bogearraí, ag socrú an gile iomlán (gile domhanda); Ní dhéanfaidh mé sonraí san alt seo, ní dhéanfaidh mé ach friotóir 2.2 - 3 kOhm a chur anseo.

Chun tuiscint a fháil ar conas an sliseanna a rialú, déanaimis féachaint ar an gcur síos ar chomhéadan an fheiste:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Sea, seo é, Béarla na Síne ina ghlóir ar fad. Is fadhb é seo a aistriú, is féidir leat é a thuiscint más mian leat, ach tá bealach eile ann - féach ar an gcaoi a gcuirtear síos ar an gceangal leis an TLC5940 atá cosúil le feidhmiúil sa bhileog sonraí:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
... Níl ach trí bhioráin ag teastáil chun sonraí a chur isteach sa ghléas. Aistríonn imeall ardú an chomhartha SCLK na sonraí ón bioráin SIN chuig an gclár inmheánach. Tar éis na sonraí go léir a luchtú, cuireann comhartha gearr ard XLAT na sonraí a aistrítear go seicheamhach isteach sna cláir inmheánacha. Is éard atá i gcláir inmheánacha ná geataí a spreagann leibhéal comhartha XLAT. Tarchuirtear na sonraí go léir ar dtús an giotán is suntasaí.

Latch – latch/latch/glas.
Imeall ag ardú – ceannródaíocht na bíge
MSB ar dtús – an giota is suntasaí (ar chlé) ar aghaidh.
chun sonraí a chlog – sonraí a tharchur go seicheamhach (beagán ar giotán).

Слово latch Is minic a fhaightear sna doiciméid le haghaidh sceallóga agus aistrítear é ar bhealaí éagsúla, mar sin ar mhaithe le tuiscint ceadóidh mé mé féin

clár oideachais beagIs clár shift é an tiománaí LED go bunúsach. "Shift" (aistriú) in ainm - gluaiseacht sonraí beagán ciallmhar taobh istigh den fheiste: brúnn gach giotán nua taobh istigh an slabhra iomlán chun tosaigh os a chomhair. Ós rud é nach bhfuil aon duine ag iarraidh féachaint ar chaochadh na soilse le linn an aistrithe, tarlaíonn an próiseas i gcláir mhaoláin atá scartha ó na cláir oibre ag damper (latch) is cineál seomra feithimh é ina socraítear na píosaí sa seicheamh atá ag teastáil. Nuair a bhíonn gach rud réidh, osclaíonn an cróluas agus téann na giotán ag obair, ag cur in ionad an bhaisc roimhe seo. Focal latch i gcáipéisíocht na micrichiorcaid beagnach i gcónaí tugann sé le tuiscint go bhfuil taise den sórt sin ann, is cuma cén teaglaim a úsáidtear é.

Mar sin, déantar aistriú sonraí chuig an DM634 mar seo: socraigh ionchur DAI de réir luach an ghiotán is suntasaí den bhfad LED, tarraing DCK suas agus síos; socraigh ionchur DAI go luach an chéad ghiotán eile, tarraing DCK; agus mar sin de go dtí go mbeidh gach giotán tarchurtha (clogáilte isteach), tar éis dúinn a tharraingt LAT. Is féidir é seo a dhéanamh de láimh (giotán-bang), ach tá sé níos fearr comhéadan SPI a úsáid atá oiriúnaithe go speisialta dó seo, ós rud é go gcuirtear i láthair é ar ár STM32 i dhá chóip.

Pill Gorm STM32F103

Tosaigh: Tá rialaitheoirí STM32 i bhfad níos casta ná Atmega328 ná mar a d'fhéadfadh a bheith scanrúil. Thairis sin, ar chúiseanna coigilte fuinnimh, déantar beagnach gach forimeallach a mhúchadh ag an tús, agus is é an minicíocht clog 8 MHz ón bhfoinse inmheánach. Go fortunately, scríobh ríomhchláraitheoirí STM cód a thugann an sliseanna suas go dtí an 72 MHz “ríofa”, agus chuir údair na IDEanna go léir a bhfuil aithne agam orthu é sa nós imeachta tosaigh, mar sin ní gá dúinn clogáil (ach is féidir leat más mian leat i ndáiríre). Ach beidh ort na forimeallaigh a chasadh air.

Doiciméadú: Tá Blue Pill feistithe leis an sliseanna tóir STM32F103C8T6, tá dhá dhoiciméad úsáideacha ann:

Sa bhileog b'fhéidir go mbeadh suim againn i:

  • Pinouts – pinouts sliseanna – ar eagla go gcinnfimid na cláir a dhéanamh sinn féin;
  • Léarscáil Chuimhne – léarscáil chuimhne le haghaidh sliseanna ar leith. Tá léarscáil don líne iomlán sa Lámhleabhar Tagartha, agus luann sé cláir nach bhfuil againne.
  • Tábla sainmhínithe bioráin – liosta de phríomhfheidhmeanna agus feidhmeanna malartacha na bioráin; don “pill gorm” is féidir leat pictiúir níos áisiúla a fháil ar an Idirlíon le liosta bioráin agus a bhfeidhmeanna. Mar sin, déanaimid Google Pinout Blue Pill láithreach agus coinnímid an pictiúr seo ar láimh:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
NB: bhí earráid sa phictiúr ón Idirlíon, a tugadh faoi deara sna tuairimí, go raibh maith agat as sin. Tá an pictiúr curtha in ionad, ach tá sé seo le ceacht - tá sé níos fearr chun faisnéis a sheiceáil ní ó bhileoga sonraí.

Bainimid an bhileog sonraí, osclaíonn muid an Lámhleabhar Tagartha, agus as seo amach ní úsáidimid ach é.
Nós Imeachta: déileálaimid le hionchur/aschur caighdeánach, déanaimid SPI a chumrú, cuirimid na forimeallaigh riachtanacha ar siúl.

Ionchur Aschur

Ar an Atmega328, cuirtear I/O i bhfeidhm thar a bheith simplí, agus is é sin an fáth gur féidir mearbhall a chur ar an iliomad roghanna STM32. Anois níl ach conclúidí de dhíth orainn, ach tá ceithre rogha acu seo fiú:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
draein oscailte, brú-tarraingt, brú-tharraingt eile, draein oscailte eile

"tarraingt-bhrú" (brú-tarraingt) an gnáth-aschur ón Arduino, is féidir leis an bioráin an luach ARD nó ÍSEAL a ghlacadh. Ach le “draein oscailte” tá deacrachtaí, cé go bhfuil gach rud simplí anseo:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Cumraíocht aschuir / nuair a shanntar an port don aschur: / cumasaithe maolán aschuir: / – mód draein oscailte: cumasaíonn “0” sa chlár aschuir N-MOS, fágann “1” sa chlár aschuir an port i mód Hi-Z ( Níl P-MOS gníomhachtaithe ) / – modh brú-tharraingt: gníomhaíonn “0” sa chlár aschuir N-MOS, gníomhaíonn “1” sa chlár aschuir P-MOS.

Gach difríocht idir draein oscailte (draein oscailte) ó “push-pull” (brú-tarraingt) is é sin nach féidir leis an gcéad bioráin glacadh leis an staid ARD: agus ceann á scríobh chuig an gclár aschuir, téann sé isteach i mód ardfhriotaíochta (impedance ard, Hi-Z). Agus nialas á scríobh, iompraíonn an bioráin mar an gcéanna sa dá mhodh, go loighciúil agus go leictreach.

Sa ghnáth-mhodh aschuir, ní chraolann an bioráin ach ábhar an chláir aschuir. Sa "rogha" tá sé á rialú ag na forimeallaigh comhfhreagracha (féach 9.1.4):

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Má tá giotán calafoirt cumraithe mar bhioráin fheidhm mhalartach, tá an clár bioráin díchumasaithe agus tá an bioráin ceangailte leis an bioráin forimeallach.

Déantar cur síos ar fheidhmiúlacht mhalartach gach bioráin i Sainmhínithe Bioráin Tá an bhileog sonraí ar an íomhá íoslódáilte. Ar an gceist cad atá le déanamh má tá roinnt feidhmeanna malartacha ag bioráin, tugtar an freagra le fonóta sa bhileog sonraí:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Má úsáideann forimeallaigh iolracha an bioráin chéanna, chun coinbhleacht idir feidhmeanna eile a sheachaint, níor cheart ach forimeallach amháin a úsáid ag an am, scoránaigh ag baint úsáide as an giotán cumasaithe clog forimeallach (sa chlár RCC cuí).

Ar deireadh, tá luas clog ag bioráin i mód aschuir freisin. Is gné eile coigilte fuinnimh é seo; inár gcás féin, déanaimid é a shocrú chomh hard agus is féidir agus déanaimid dearmad air.

Mar sin: táimid ag baint úsáide as SPI, rud a chiallaíonn gur cheart go mbeadh dhá bhioráin (le sonraí agus le comhartha clog) ina “fheidhm bhrú-tarraingt eile”, agus gur cheart go mbeadh ceann eile (LAT) ina “bhrú-tharraingt rialta”. Ach sula sannfar iad, a ligean ar déileáil le SPI.

SPI

Clár beag oideachais eile

Is comhéadan simplí agus an-éifeachtach é SPI nó Comhéadan Forimeallach Srathach (comhéadan sraitheach forimeallach) chun MK a nascadh le MKanna eile agus an domhan lasmuigh i gcoitinne. Tá cur síos déanta cheana féin ar phrionsabal a oibríochta thuas, áit a bhfuil sé mar gheall ar an tiománaí LED Síneach (sa lámhleabhar tagartha, féach alt 25). Is féidir le SPI oibriú i mód máistir (“máistir”) agus sclábhaí (“sclábhaí”). Tá ceithre bhealach bhunúsacha ag SPI, agus ní féidir gach ceann díobh a úsáid:

  • MOSI, Máistir-Aschur / Ionchur Sclábhaí: tarchuireann an bioráin seo sonraí i mód máistir, agus faigheann sé sonraí i mód sclábhaithe;
  • MISO, Máistir-Ionchur / Aschur daor: a mhalairt ar fad, faigheann sé sa mháistir, agus tarchuireann sé sa sclábhaí;
  • SCK, Clog Srathach: socraíonn sé minicíocht tarchurtha sonraí sa mháistir nó faigheann sé comhartha clog sa sclábhaí. Buillí a bhualadh go bunúsach;
  • SS, Slave Select: le cabhair ón gcainéal seo, tá a fhios ag an sclábhaí go bhfuil rud éigin ag teastáil uaidh. Ar STM32 tugtar NSS air, áit a bhfuil N = diúltach, i.e. bíonn an rialtóir ina sclábhaí má tá talamh sa chainéal seo. Comhcheanglaíonn sé go maith leis an modh Aschuir Drain Oscailte, ach sin scéal eile.

Cosúil le gach rud eile, tá SPI ar STM32 saibhir i bhfeidhmiúlacht, rud a fhágann go bhfuil sé deacair a thuiscint. Mar shampla, féadann sé oibriú ní hamháin le SPI, ach freisin le comhéadan I2S, agus sa doiciméadú tá a gcuid tuairiscí measctha, is gá an barrachas a ghearradh amach go tráthúil. Tá an tasc atá againn thar a bheith simplí: ní mór dúinn ach sonraí a sheoladh ag baint úsáide as MOSI agus SCK amháin. Téim go dtí alt 25.3.4 (cumarsáid leathdhéphléacsacha, cumarsáid leathdhéphléacsacha), áit a bhfaighimid 1 clog agus 1 sreang sonraí aontreoch (comhartha 1 chlog agus 1 sruth sonraí aontreoch):

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Sa mhodh seo, úsáideann an feidhmchlár SPI i mód tarchurtha amháin nó modh glactha amháin. / Tá an modh tarchurtha amháin cosúil leis an modh déphléacsacha: tarchuirtear sonraí ar an bioráin tarchuir (MOSI i mód máistir nó MISO i mód sclábhaithe), agus is féidir an bioráin ghlactha (MISO nó MOSI faoi seach) a úsáid mar bhioráin I/O rialta . Sa chás seo, ní gá don iarratas ach neamhaird a dhéanamh ar an maolán Rx (má léitear é, ní bheidh aon sonraí aistrithe ann).

Go hiontach, tá an bioráin MISO saor in aisce, déanaimis an comhartha LAT a nascadh leis. Breathnaímid ar Slave Select, ar féidir é a rialú go cláir ar an STM32, rud atá thar a bheith áisiúil. Léimid an t-alt den ainm céanna i gcuid 25.3.1 Cur Síos Ginearálta SPI:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Rialú bogearraí NSS (SSM = 1) / Tá faisnéis maidir le roghnú daor sa ghiotán SSI den chlár SPI_CR1. Tá bioráin seachtrach an NSS fós saor in aisce do riachtanais feidhmchláir eile.

Tá sé in am scríobh chuig na cláir. Chinn mé SPI2 a úsáid, lorg a sheoladh bonn sa bhileog sonraí - i gcuid 3.3 Léarscáil Chuimhne:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Bhuel, cuirimis tús le:

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

Oscail alt 25.3.3 leis an teideal féinmhínithe “SPI a Chumrú i Máistir-Mhód”:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

1. Socraigh minicíocht an chlog srathach le giotán BR[2:0] sa chlár SPI_CR1.

Bailítear na cláir sa chuid den lámhleabhar tagartha den ainm céanna. Aistriú seolta (Fritháireamh seoltaí) le haghaidh CR1 – 0x00, de réir réamhshocraithe glantar gach giotán (Athshocraigh luach 0x0000):

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Socraíonn na giotán BR an roinnteoir clog rialaitheora, rud a chinnfidh an minicíocht ag a n-oibreoidh an SPI. Is é 32 MHz ár minicíocht STM72, feidhmíonn an tiománaí LED, de réir a bhileog sonraí, le minicíocht suas le 25 MHz, mar sin ní mór dúinn a roinnt ar cheithre (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. Socraigh na giotán CPOL agus CPHA chun an gaol idir aistriú sonraí agus uainiú cloig srathach a shainiú (féach an léaráid ar leathanach 240)

Ós rud é go bhfuil bileog sonraí á léamh againn anseo agus nach bhfuilimid ag féachaint ar schematics, déanaimis breathnú níos géire ar an gcur síos téacs ar na giotán CPOL agus CPHA ar leathanach 704 (Cur Síos Ginearálta SPI):

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Céim clog agus polaraíocht
Trí úsáid a bhaint as na píosaí CPOL agus CPHA den chlár SPI_CR1, is féidir leat ceithre ghaol uainiúcháin a roghnú go ríomhchláraithe. Rialaíonn an giotán CPOL (polaracht clog) staid an chomhartha clog nuair nach bhfuil aon sonraí á dtarchur. Rialaíonn an giotán seo na modhanna máistir agus sclábhaithe. Má athshocraítear CPOL, tá an bioráin SCK íseal i mód scíthe. Má tá an giotán CPOL socraithe, tá an bioráin SCK ard le linn mód sosa.
Nuair a leagtar an giotán CPHA (céim clog), is é an strobe gaiste giotán ard an dara imeall den chomhartha SCK (ag titim má tá CPOL soiléir, ag ardú má tá CPOL socraithe). Tá na sonraí a gabhadh ag an dara athrú ar an comhartha clog. Má tá an giotán CPHA soiléir, is é an strobe gaiste giotán ard ná imeall ardú an chomhartha SCK (imeall titim má leagtar CPOL, imeall ardú má dhéantar CPOL a ghlanadh). Gabhtar sonraí ag an gcéad athrú ar an comhartha clog.

Tar éis dúinn an t-eolas seo a ionsú, tháinig muid ar an tátal go gcaithfidh an dá ghiotán fanacht mar nialais, mar gheall ar Ba mhaith linn go bhfanfaidh an comhartha SCK íseal nuair nach bhfuil sé in úsáid, agus go dtarchuirfear sonraí ar imeall ardú na bíge (féach Fíor. Imeall Éirí Amach sa bhileog DM634).

Dála an scéil, anseo ar dtús tháinig muid ar ghné den stór focal i mbileoga ST: iontu scríobhtar an frása “athshocraigh an giotán go nialas” a athshocrú beagánAgus ní a ghlanadh beagán, cosúil le, mar shampla, Atmega.

3. Socraigh an giotán DFF chun a chinneadh an bhfuil an bloc sonraí formáid 8-giotán nó 16-giotán

Ghlac mé DM16 634-giotán go sonrach ionas nach gcuirfí isteach ar shonraí PWM 12-giotán a tharchur, cosúil leis an DM633. Déanann sé ciall DFF a shocrú go ceann amháin:

#define DFF         0x0800

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

4. Cumraigh an giotán LSBFIRST sa chlár SPI_CR1 chun an fhormáid bloc a chinneadh

Déanann LSBFIRST, mar a thugann an t-ainm le fios, tarchur a chumrú leis an ngiotán is lú suntas ar dtús. Ach tá DM634 ag iarraidh sonraí a fháil ag tosú ón giotán is suntasaí. Dá bhrí sin, fágfaimid é a athshocrú.

5. I mód crua-earraí, má tá ionchur ón bioráin NSS ag teastáil, cuir comhartha ard i bhfeidhm ar an bioráin NSS le linn an t-ord iomlán aistrithe beart. I mód bogearraí NSS, socraigh na giotán SSM agus SSI sa chlár SPI_CR1. Má tá an bioráin NSS le húsáid mar aschur, ní gá ach an giotán SSOE a shocrú.

Suiteáil SSM agus SSI chun dearmad a dhéanamh ar mhodh crua-earraí an NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Ní mór na giotán MSTR agus SPE a shocrú (ní fanann siad socraithe ach amháin má tá an comhartha NSS ard)

I ndáiríre, leis na píosaí seo ainmnímid ár SPI mar mháistir agus cuirimid ar siúl é:

#define MSTR        0x0004
#define SPE         0x0040

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

Tá SPI cumraithe, scríobhaimis láithreach feidhmeanna a sheolann bearta chuig an tiománaí. Lean ar aghaidh ag léamh 25.3.3 “SPI a chumrú i mód máistir”:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Ordú aistrithe sonraí
Tosaíonn tarchur nuair a scríobhtar beart chuig an maolán Tx.
Lódáiltear an beart sonraí isteach sa chlár sealaithe ag comhthreomhar modh (ón mbus inmheánach) le linn an chéad ghiotán a tharchur, tar éis é a tharchur chuig seicheamhach Mód bioráin MOSI, an chéad ghiotán nó an giotán deireanach ar aghaidh ag brath ar shocrú an ghiotán LSBFIRST sa chlár CPI_CR1. Socraítear an bhratach TXE tar éis tarchur sonraí ó mhaolán Tx go clár aistrithe, agus gineann sé idirbhriseadh freisin má tá an giotán TXEIE sa chlár CPI_CR1 socraithe.

D’aibhsigh mé cúpla focal san aistriúchán chun aird a tharraingt ar ghné amháin de chur i bhfeidhm an SPI i rialtóirí STM. Ar Atmega an bhratach TXE (Tx Folamh, Tx folamh agus réidh le sonraí a fháil) socraithe ach amháin tar éis an beart iomlán a sheoladh amach. Agus anseo socraítear an bhratach seo tar éis an beart a chur isteach sa chlár aistrithe inmheánach. Ós rud é go bhfuil sé á bhrú ann leis na giotán go léir ag an am céanna (go comhthreomhar), agus ansin aistrítear na sonraí go seicheamhach, socraítear TXE sula seoltar an beart go hiomlán. Tá sé seo tábhachtach mar gheall ar i gcás ár dtiománaí LED, ní mór dúinn an bioráin LAT a tharraingt tar éis a sheoladh Gach sonraí, i.e. Ní leor an bhratach TXE amháin dúinn.

Ciallaíonn sé seo go bhfuil bratach eile ag teastáil uainn. Breathnaímid ar 25.3.7 - “Bratacha Stádais”:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
<…>
Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Brat GNÓTHA
Socraítear agus glantar an bhratach BSY le crua-earraí (níl aon éifeacht ag scríobh chuige). Léiríonn bratach BSY staid na ciseal cumarsáide SPI.
Athshocraíonn sé:
nuair a bheidh an t-aistriú críochnaithe (ach amháin i mód máistir má tá an t-aistriú leanúnach)
nuair atá SPI díchumasaithe
nuair a tharlaíonn earráid mháistir-mhóid (MODF=1)
Mura bhfuil an t-aistriú leanúnach, glantar an bhratach BSY idir gach aistriú sonraí

Ceart go leor, beidh sé seo áisiúil. Faighimis amach cá bhfuil an maolán Tx suite. Chun é seo a dhéanamh, léigh “Clár Sonraí SPI”:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Giotán 15:0 DR[15:0] Clár Sonraí
Sonraí a fuarthas nó sonraí atá le tarchur.
Tá an clár sonraí roinnte ina dhá mhaolán - ceann amháin le haghaidh scríbhneoireachta (maolán tarchurtha) agus ceann le haghaidh léitheoireachta (faigh maolán). Scríobhann scríobh chuig an gclár sonraí chuig an maolán Tx, agus cuirfidh léamh ón gclár sonraí an luach atá sa mhaolán Rx ar ais.

Bhuel, agus an clár stádais, áit a bhfuil na bratacha TXE agus BSY le fáil:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Scríobhaimid:

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

Bhuel, ós rud é go gcaithfimid 16 huaire dhá byte a tharchur, de réir líon na n-aschur tiománaithe LED, rud 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 níl a fhios againn conas an bioráin LAT a tharraingt go fóill, mar sin rachaimid ar ais chuig I/O.

Bioráin a shannadh

Sa STM32F1, tá na cláir atá freagrach as staid na bioráin go leor neamhghnách. Is léir go bhfuil níos mó acu ná Atmega, ach tá siad difriúil ó sceallóga STM eile freisin. Cuid 9.1 Cur Síos Ginearálta ar GPIO:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Gach ceann de na calafoirt I/O ginearálta (GPIO) tá dhá chlár cumraíochta 32-giotán (GPIOx_CRL agus GPIOx_CRH), dhá chlár sonraí 32-giotán (GPIOx_IDR agus GPIOx_ODR), clár tacair/athshocraigh 32-giotán (GPIOx_BSRR), clár athshocraithe 16-giotán (GPIOx_BRR) agus clár 32-giotán clár blocála giotán (GPIOx_LCKR).

Tá an chéad dá chlár neamhghnách, agus deacair go leor freisin, toisc go bhfuil na 16 bioráin chalafoirt scaipthe trasna orthu i bhformáid “ceithre ghiotán in aghaidh an deartháir”. Iad siúd. tá bioráin náid go seacht gcinn i CRL, agus tá an chuid eile i CRH. Ag an am céanna, d'éirigh go maith leis na giotaí de bhioráin uile an chalafoirt sna cláir atá fágtha - is minic go mbíonn an leath fágtha “ar coimeád”.

Ar mhaithe le simplíocht, déanaimis tosú ó dheireadh an liosta.

Níl clár blocála de dhíth orainn.

Tá na cláir socraithe agus athshocraithe go leor greannmhar sa mhéid is go ndéanann siad dúbailt ar a chéile go páirteach: ní féidir leat gach rud a scríobh ach amháin i BSRR, áit a ndéanfaidh na 16 giotán níos airde an bioráin a athshocrú go nialas, agus socrófar na cinn níos ísle go 1, nó is féidir leat freisin bain úsáid as BRR, agus ní athshocróidh na 16 ghiotán níos ísle ach an bioráin . Is maith liom an dara rogha. Tá na cláir seo tábhachtach mar go dtugann siad rochtain adamhach ar phionnaí:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Socraigh nó Athshocraigh Adamhach
Ní gá idirbhriseadh a dhíchumasú agus GPIOx_ODR á ríomh ag an leibhéal giotán: is féidir giotán amháin nó níos mó a athrú le hoibríocht scríofa adamhach amháin APB2. Baintear é seo amach trí "1" a scríobh chuig an gclár tacair/athshocraigh (GPIOx_BSRR nó, le haghaidh athshocrú amháin, GPIOx_BRR) den ghiotán is gá a athrú. Fanfaidh giotán eile gan athrú.

Tá ainmneacha féinmhínitheacha go leor ar na cláir sonraí - IDR = Ionchur Clár Treo, clár ionchuir; ODR = Aschur Clár Treo, clár aschuir. Ní bheidh siad de dhíth orainn sa tionscadal reatha.

Agus ar deireadh, cláir rialaithe. Ós rud é go bhfuil suim againn sa dara bioráin SPI, eadhon PB13, PB14 agus PB15, féachaimid láithreach ar CRH:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Agus feicimid go mbeidh orainn rud éigin a scríobh i giotáin ó 20 go 31.

Táimid tar éis figured amach cheana féin thuas cad ba mhaith linn ó bioráin, mar sin anseo beidh mé a dhéanamh gan screenshot, beidh mé a rá go sonraíonn MODE an treo (ionchur má tá an dá giotán socraithe go 0) agus luas bioráin (ní mór dúinn 50MHz, i.e. an dá phionna go “1”), agus socraíonn CNF an modh: “brú-tarraingt” rialta – 00, “eile” – 10. De réir réamhshocraithe, mar a fheicimid thuas, tá an tríú giotán ag gach bioráin ón mbun (CNF0), leagann sé go mód iad ionchur ar snámh.

Ós rud é go bhfuil sé beartaithe agam rud éigin eile a dhéanamh leis an sliseanna seo, ar mhaithe le simplíocht shainmhínigh mé gach luach MODE agus CNF a d'fhéadfadh a bheith ann do na cláir rialaithe íochtair agus uachtaracha araon.

Ar bhealach 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

Tá ár bioráin suite ar phort B (seoladh bonn - 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, dá réir sin, is féidir leat sainmhínithe a scríobh le haghaidh LAT, a dhéanfaidh na cláir BRR agus BSRR athróg:

/*** 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 de bharr táimhe, bhí sé mar sin i gcónaí, lig dó fanacht)

Anois tá gach rud iontach, ach ní oibríonn sé. Toisc gurb é seo STM32, sábhálann siad leictreachas, rud a chiallaíonn go gcaithfidh tú na forimeallaigh riachtanacha a chlogáil.

Cuir clogáil ar siúl

Tá an faire, ar a dtugtar Clog freisin, freagrach as clogáil. Agus d'fhéadfaimis an giorrúchán RCC a thabhairt faoi deara cheana féin. Lorgaimid é sa doiciméadú: is é seo Athshocraigh agus Rialú Clog.

Mar a dúradh thuas, ar an dea-uair, rinne daoine ó STM an chuid ba dheacra den ábhar clogála dúinn, agus gabhaimid buíochas mór leo as ucht (arís eile tabharfaidh mé nasc chuig An láithreán gréasáin Di Halt, chun é a dhéanamh soiléir cé chomh mearbhall is atá sé). Ní theastaíonn uainn ach cláir atá freagrach as clogáil forimeallach a chumasú (Cláir Cumasaithe Clog Forimeallach). Ar an gcéad dul síos, faighimid seoladh bonn an RCC, tá sé ag tús an “Léarscáil Chuimhne”:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

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

Agus ansin cliceáil ar an nasc ina ndéanann tú iarracht rud éigin a aimsiú sa phláta, nó, i bhfad níos fearr, téigh tríd na tuairiscí ar na cláir chumasaithe ó na hailt faoi cláir a chumasú. Cá bhfaighidh muid RCC_APB1ENR agus RCC_APB2ENR:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Agus, dá réir sin, tá giotán iontu a chuimsíonn clogáil SPI2, IOPB (I/O Port B) agus feidhmeanna malartacha (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;

Is féidir an cód deiridh a fháil anseo.

Má tá an deis agus an fonn ort tástáil a dhéanamh, ceangail an DM634 mar seo: DAI go PB15, DCK go PB13, LAT go PB14. Cumhachtaímid an tiománaí ó 5 volta, ná déan dearmad na forais a nascadh.

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

STM8 PWM

PWM ar STM8

Nuair a bhí an t-alt seo díreach á phleanáil agam, chinn mé, mar shampla, iarracht a dhéanamh máistreacht a fháil ar fheidhmiúlacht éigin de shlis neamhaithnidiúla ag baint úsáide as bileog sonraí amháin, ionas nach mbeadh gréasaí gan buataisí agam. Bhí STM8 oiriúnach don ról seo: ar an gcéad dul síos, bhí cúpla bord Síneach agam le STM8S103, agus ar an dara dul síos, níl an-tóir air, agus mar sin luíonn an temptation chun réiteach a léamh agus a fháil ar an Idirlíon ar an easpa réitigh seo.

Tá an sliseanna freisin Bileog sonraí и Lámhleabhar tagartha RM0016 saor in aisce,, sa chéad tá pinout agus seoltaí a chlárú, sa dara - gach rud eile. Tá STM8 cláraithe in C i IDE uafásach ST Amhairc a fhorbairt.

Clogáil agus I/O

De réir réamhshocraithe, feidhmíonn STM8 ag minicíocht 2 MHz, ní mór é seo a cheartú láithreach.

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Clog HSI (Ardluais Inmheánach).
Díorthaítear comhartha clog HSI ó oscillator inmheánach 16 MHz RC le roinnteoir in-ríomhchláraithe (1 go 8). Tá sé socraithe sa chlár deighilteoirí cloig (CLK_CKDIVR).
Nóta: ag an tús, roghnaítear oscillator HSI RC le roinnteoir de 8 mar phríomhfhoinse an chomhartha clog.

Faighimid seoladh an chláir sa bhileog sonraí, an cur síos i refman agus feicimid gur gá an clár a ghlanadh:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Ós rud é go bhfuil muid chun PWM a rith agus na soilse stiúir a nascadh, déanaimis féachaint ar an bpionós:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Tá an sliseanna beag, tá go leor feidhmeanna ar fionraí ar na bioráin chéanna. Is é an rud atá idir lúibíní cearnacha ná “feidhmiúlacht mhalartach”, aistrítear é le “beart rogha” (bearta rogha) – rud éigin cosúil le fiúsanna Atmega. Is féidir leat a luachanna a athrú go cláir, ach ní gá, mar gheall ar Ní chuirtear an fheidhmiúlacht nua i ngníomh ach amháin tar éis atosaigh. Tá sé níos éasca ST Visual Ríomhchláraitheoir a úsáid (íoslódáil le Visual Develop), ar féidir leis na bearta seo a athrú. Léiríonn an pinout go bhfuil na bioráin CH1 agus CH2 den chéad lasc ama i bhfolach idir lúibíní cearnacha; is gá na giotán AFR1 agus AFR0 a shocrú i STVP, agus aistreoidh an dara ceann aschur CH1 an dara lasc ama ó PD4 go PC5 freisin.

Mar sin, rialóidh 6 bhioráin na soilse: PC6, PC7 agus PC3 don chéad lasc ama, PC5, PD3 agus PA3 don dara ceann.

Tá sé níos simplí agus níos loighciúla na bioráin I/O a shocrú iad féin ar STM8 ná ar STM32:

  • eolas ó chlár treo sonraí Atmega DDR (Clár Treo Sonraí): 1 = aschur;
  • an chéad chlár rialaithe CR1, nuair a bhíonn an t-aschur, socraítear an modh brú-tharraingt (1) nó draein oscailte (0); ós rud é go nascann mé na soilse chuig an sliseanna le catóidí, fág mé nialais anseo;
  • an dara clár rialaithe CR2, nuair a aschur, socraíonn an luas clog: 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

socrú PWM

Ar dtús, déanaimis na téarmaí a shainiú:

  • Minicíocht PWM – a mhinice is a sníonn an t-amadóir;
  • Athlódáil uathoibríoch, AR – luach in-uathluchtaithe a n-áireofar an t-amadóir go dtí sin (tréimhse chuisle);
  • Imeacht Nuashonraithe, UEV – teagmhas a tharlaíonn nuair a dhéantar an t-amadóir a chomhaireamh go AR;
  • Timthriall Dleachta PWM – Timthriall dleachta PWM, ar a dtugtar “fachtóir dleachta” go minic;
  • Gabháil/Comparáid Luach – luach gabhála/comparáide, lena bhfuil an t-amadóir san áireamh déanfaidh sé rud éigin (i gcás PWM, athraíonn sé an comhartha aschuir);
  • Luach Réamhluchtaithe – luach réamhluchtaithe. Déan comparáid idir luach Ní féidir athrú agus an t-amadóir ag tic, nó brisfidh an timthriall PWM. Dá bhrí sin, cuirtear luachanna tarchurtha nua i maolán agus tarraingítear amach iad nuair a shroicheann an t-amadóir deireadh a chomhaireamh síos agus go ndéantar é a athshocrú;
  • Imeall-ailínithe и Modhanna lár-ailínithe – ailíniú feadh na teorann agus ag an lár, mar an gcéanna le Atmel's PWM Tapa и PWM céim-cheart.
  • OCiREF, Comhartha Tagartha Comparáid Aschur – comhartha aschuir tagartha, i ndáiríre, cad atá le feiceáil ar an bioráin comhfhreagrach i mód PWM.

Mar is léir cheana ón pinout, tá cumais PWM ag dhá lasc ama - an chéad cheann agus an dara ceann. Tá an dá 16-giotán, tá an chéad a lán de na gnéithe breise (go háirithe, is féidir é a chomhaireamh araon suas agus síos). Ní mór dúinn an dá oibriú go cothrom, mar sin shocraigh mé tús a chur leis an dara ceann is boichte ar ndóigh, ionas nach n-úsáidfí rud éigin nach bhfuil ann de thaisme. Fadhb éigin ná go bhfuil an cur síos ar fheidhmiúlacht PWM na n-amadóirí go léir sa lámhleabhar tagartha sa chaibidil faoin gcéad lasc ama (17.5.7 Mód PWM), mar sin caithfidh tú léim siar agus amach ar fud an doiciméid an t-am ar fad.

Tá buntáiste tábhachtach ag PWM ar STM8 thar PWM ar Atmega:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Teorainn PWM Ailínithe
Cumraíocht an chuntais ó bhun go barr
Tá comhaireamh ón mbun aníos gníomhach má tá an giotán DIR sa chlár TIM_CR1 glanta
Sampla
Úsáideann an sampla an chéad mhodh PWM. Coinnítear an comhartha tagartha PWM OCiREF ard chomh fada le TIM1_CNT < TIM1_CCRi. Seachas sin a thógann sé leibhéal íseal. Má tá an luach comparáide sa chlár TIM1_CCRi níos mó ná an luach uathlódála (clár TIM1_ARR), coinnítear an comhartha OCiREF ag 1. Más é 0 an luach comparáide, coinnítear OCiREF ag nialas....

uaineadóir STM8 le linn imeacht nuashonraithe seiceálacha ar dtús luach a chur i gcomparáid, agus gan ach ansin táirgeann sé comhartha tagartha. An chéad scriúnna lasc ama Atmega suas agus ansin i gcomparáid, a eascraíonn i compare value == 0 Is snáthaid é an t-aschur, nach mór déileáil leis ar bhealach éigin (mar shampla, tríd an loighic a inbhéartú go ríomhchláraithe).

Mar sin cad ba mhaith linn a dhéanamh: PWM 8-giotán (AR == 255), comhaireamh ó bhun go barr, ailíniú feadh na teorann. Ós rud é go bhfuil na bolgáin solais ceangailte leis an sliseanna le catóidí, ba cheart don PWM aschur 0 (LED ar aghaidh) go dtí go luach a chur i gcomparáid agus 1 tar éis.

Táimid tar éis a léamh cheana féin faoi roinnt Modh PWM, mar sin aimsímid clár riachtanach an dara lasc ama trí chuardach a dhéanamh sa lámhleabhar tagartha don abairt seo (18.6.8 - TIMx_CCMR1):

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
110: An chéad mhód PWM – agus an chéad chainéal á chomhaireamh ó bhun go barr, agus TIMx_CNT < TIMx_CCR1. Seachas sin, tá an chéad cainéal neamhghníomhach. [A thuilleadh sa doiciméad tá cóip-ghreamú earráideach ón amadóir 1] 111: An dara modh PWM – agus an chéad chainéal á chomhaireamh ó bhun go barr, tá an chéad chainéal neamhghníomhach agus TIMx_CNT < TIMx_CCR1. Seachas sin, tá an chéad cainéal gníomhach.

Ós rud é go bhfuil na LEDanna ceangailte leis an MK trí chatóidí, tá an dara modh oiriúnach dúinn (an chéad cheann freisin, ach níl a fhios againn go fóill).

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Giotán 3 OC1PE: Cumasaigh réamhualach bioráin 1
0: Tá an clár réamhlódála ar TIMx_CCR1 díchumasaithe. Is féidir leat scríobh chuig TIMx_CCR1 am ar bith. Oibríonn an luach nua láithreach.
1: Tá an clár réamhluchtaithe ar TIMx_CCR1 cumasaithe. Oibríochtaí a léamh/scríobh rochtain a fháil ar an gclár réamhualach. Lódáiltear an luach réamhluchtaithe TIMx_CCR1 isteach sa scáthchlár le linn gach imeachta nuashonraithe.
*Nóta: Le go n-oibreoidh mód PWM i gceart, ní mór na cláir réamhlódála a chumasú. Níl sé seo riachtanach i mód comhartha aonair (tá an giotán OPM socraithe sa chlár TImx_CR1).

Ceart go leor, cuirimis gach rud a theastaíonn uainn ar siúl do na trí chainéal den dara lasc ama:

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

Tá AR comhdhéanta de dhá chlár ocht ngiotán, tá gach rud simplí:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Ní féidir leis an dara lasc ama a chomhaireamh ach ó bhun go barr, ailíniú feadh na teorann, ní gá aon rud a athrú. Socróimid an roinnteoir minicíochta, mar shampla, go 256. Don dara lasc ama, socraítear an roinnteoir sa chlár TIM2_PSCR agus tá dhá chumhacht aige:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Níl fágtha ach na conclúidí a chasadh air agus an dara lasc ama féin. Réitítear an chéad fhadhb le cláir Gabháil/Comparáid Cumasaigh: tá dhá, trí chainéal scaipthe trasna orthu go neamhshiméadrach. Anseo is féidir linn a fhoghlaim freisin go bhfuil sé indéanta polaraíocht an chomhartha a athrú, i.e. i bprionsabal, bhíothas in ann Mód PWM 1 a úsáid. Scríobhaimid:

#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 ar deireadh, cuirimid tús leis an lasc ama sa chlár TImx_CR1:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Scríobhfaimid analóg simplí de AnalogWrite(), a aistreoidh na luachanna iarbhír chuig an lasc ama le haghaidh comparáide. Ainmnítear na cláir go hintuartha Cláir a ghabháil/a chur i gcomparáid, tá dhá cheann acu le haghaidh gach cainéal: na giotáin íseal-ordú 8 i TIM2_CCRxL agus na cinn ard-ordú i TIM2_CCRxH. Ós rud é go bhfuil PWM 8-giotán cruthaithe againn, is leor gan ach na giotáin is lú tábhacht a scríobh:

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

Tabharfaidh an léitheoir aireach faoi deara go bhfuil PWM beagán lochtach againn, nach féidir linn líonadh 100% a tháirgeadh (ar uasluach 255, cuirtear an comhartha inbhéartaithe ar feadh timthriall lasc ama amháin). Maidir le soilse faoi stiúir ní bhaineann sé seo le hábhar, agus is féidir leis an léitheoir aireach a thomhas cheana féin conas é a dheisiú.

Oibríonn PWM ar an dara lasc ama, a ligean ar bogadh ar aghaidh go dtí an chéad.

Tá na giotáin chéanna go díreach ag an gcéad uaineadóir sna cláir chéanna (is é sin go bhfuil na giotáin a d'fhan "forchoimeádta" sa dara lasc ama á n-úsáid go gníomhach sa chéad uair le haghaidh gach cineál rudaí casta). Mar sin, is leor seoltaí na gclár céanna a aimsiú sa bhileog sonraí agus an cód a chóipeáil. Bhuel, athraigh luach an roinnteora minicíochta, mar gheall ar ... Teastaíonn ón gcéad lasc ama nach bhfaighidh sé cumhacht de dhá cheann, ach luach beacht 16-giotán in dhá chlár Prescaler Ard и Íseal. Déanaimid gach rud agus... ní oibríonn an chéad lasc ama. Céard atá ort?

Ní féidir an fhadhb a réiteach ach trí bhreathnú a dhéanamh ar an gcuid iomlán faoi chláir rialaithe an lasc ama 1, áit a lorgaímid an ceann nach bhfuil ag an dara lasc ama. Beidh 17.7.30 Clár briseadh (TIM1_BKR), cá bhfuil an giota seo:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Cumasaigh príomh-aschur

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Sin go léir do cinnte anois, an cód ann.

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Ilphléacs STM8

Ilphléacsú ar STM8

Is é an tríú mionthionscadal ná ocht stiúir RGB a nascadh leis an dara lasc ama i mód PWM agus iad a dhéanamh dathanna éagsúla a thaispeáint. Tá sé bunaithe ar choincheap an ilphléacsála LED, is é sin má chasann tú ar agus as soilse go han-tapa, beidh sé cosúil dúinn go bhfuil siad ar siúl i gcónaí (marthanacht na físe, táimhe dearcadh amhairc). Rinne mé uair amháin rud éigin mar seo ar Arduino.

Breathnaíonn an algartam oibre mar seo:

  • ceangailte anóid an chéad RGB LED;
  • é a lasadh, na comharthaí riachtanacha a sheoladh chuig na catóidí;
  • d'fhan sé go dtí deireadh an timthriall PWM;
  • ceangailte anóid an dara RGB LED;
  • lasadh é...

Bhuel, etc. Ar ndóigh, le haghaidh oibriú álainn ní mór an anóid a nascadh agus an stiúir a “adhaint” ag an am céanna. Bhuel, nó beagnach. In aon chás, ní mór dúinn cód a scríobh a chuirfidh luachanna aschuir i dtrí chainéal den dara lasc ama, iad a athrú nuair a shroichtear UEV, agus ag an am céanna an RGB LED atá gníomhach faoi láthair a athrú.

Ós rud é go bhfuil an t-athrú LED uathoibríoch, ní mór dúinn "cuimhne físeáin" a chruthú óna bhfaighidh an láimhseálaí idirbhriste sonraí. Seo sraith simplí:

uint8_t colors[8][3];

D'fhonn dath LED ar leith a athrú, beidh sé go leor na luachanna riachtanacha a scríobh san eagar seo. Agus beidh an t-athróg freagrach as líon na stiúir gníomhach

uint8_t cnt;

Demux

Chun ilphléacsáil chuí a dhéanamh, ní mór dúinn, rud éigin aisteach go leor, dí-ilphléacsóir CD74HC238. Demultiplexer - sliseanna a chuireann an t-oibreoir i bhfeidhm i crua-earraí <<. Trí bhioráin ionchuir (giotáin 0, 1 agus 2) beathaímid uimhir trí-ghiotán X dó, agus mar fhreagra gníomhaíonn sé uimhir aschuir (1<<X). Úsáidtear na hionchuir atá fágtha den sliseanna chun an dearadh iomlán a scála. Ní mór dúinn an sliseanna seo ní hamháin chun líon na bioráin áitithe den microcontroller a laghdú, ach freisin le haghaidh sábháilteachta - ionas nach gcuirfear níos mó soilse ar siúl trí thimpiste ná mar is féidir agus gan an MK a dhó. Cosnaíonn an tslis pingin agus ba chóir é a choinneáil i do chomh-aireachta leigheas baile i gcónaí.

Beidh ár CD74HC238 freagrach as voltas a sholáthar chuig anóid an stiúir atá ag teastáil. I ilphléacs lánchuimsitheach, sholáthródh sé voltas don cholún trí P-MOSFET, ach sa taispeántas seo is féidir go díreach, mar gheall ar tarraingíonn sé 20 mA, de réir rátálacha uasta iomlána sa bhileog sonraí. Ó Íoslódáil bileog eolais CD74HCT238D tá pinouts agus an bhileog cheat seo ag teastáil uainn:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
H = leibhéal ardvoltais, L = leibhéal ísealvoltais, X – is cuma

Ceanglaíonn muid E2 agus E1 leis an talamh, E3, A0, A1 agus A3 le bioráin PD5, PC3, PC4 agus PC5 de STM8. Ós rud é go bhfuil idir leibhéil ísle agus ardleibhéil sa tábla thuas, déanaimid na bioráin seo a chumrú mar bhioráin bhrú-tarraingthe.

PWM

Tá PWM ar an dara lasc ama cumraithe ar an mbealach céanna agus a bhí sa scéal roimhe seo, le dhá dhifríocht:

Gcéad dul síos, ní mór dúinn a chumasú an idirbhriseadh ar Imeacht Nuashonraithe (UEV) a ghlaofar ar fheidhm a scoránaigh an LED gníomhach. Déantar é seo tríd an giotán a athrú Cumasaigh Idirbhriseadh Nuashonraithe i gclár le hainm insinte

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
Cuir isteach an clár a chumasú

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Baineann an dara difríocht le feiniméan an ilphléacsála, mar shampla taibhsí – glow seadánacha dé-óidí. Inár gcás, d'fhéadfadh sé a bheith le feiceáil mar gheall ar an bhfíric go leanann an t-amadóir, tar éis briseadh isteach ar an UEV, ag tic, agus nach bhfuil am ag an láimhseálaí idirbhriseadh an stiúir a athrú sula dtosaíonn an t-amadóir ag scríobh rud éigin chuig na bioráin. Chun é seo a chomhrac, beidh ort an loighic a aisiompú (0 = gile uasta, 255 = níl aon rud soilsithe) agus luachanna timthrialla dualgas foircneacha a sheachaint. Iad siúd. a chinntiú tar éis UEV go dtéann na soilse LED amach go hiomlán ar feadh timthriall amháin PWM.

Polaracht a athrú:

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

Seachain r, g agus b a shocrú go 255 agus cuimhnigh iad a inbhéartú agus iad á n-úsáid.

Idirbhriseadh

Is é bunbhrí idirbhriseadh ná go stopann an tslis i gcúinsí áirithe an príomhchlár a fheidhmiú agus go nglaonn sé feidhm sheachtrach éigin. Tarlaíonn cur isteach de bharr tionchair sheachtracha nó inmheánacha, lena n-áirítear an t-amadóir.

Nuair a chruthaigh muid an chéad tionscadal i ST Visual Develop, chomh maith le main.c fuaireamar fuinneog le comhad mistéireach stm8_interrupt_vector.c, san áireamh go huathoibríoch sa tionscadal. Sa chomhad seo, sanntar feidhm do gach idirbhriseadh NonHandledInterrupt. Ní mór dúinn ár bhfeidhm a cheangal leis an idirbhriseadh atá ag teastáil.

Tá tábla veicteoirí idirbhriste sa bhileog, ina bhfaighimid na cinn a theastaíonn uainn:

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8
13 nuashonrú/thar maoil TIM2
14 TIM2 a ghabháil/comparáid

Ní mór dúinn an LED a athrú ag UEV, mar sin ní mór dúinn idirbhriseadh #13.

Dá réir sin, ar dtús, sa chomhad stm8_interrupt_vector.c athraigh ainm réamhshocraithe na feidhme atá freagrach as idirbhriseadh Uimh. 13 (IRQ13) chuig do cheann féin:

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

Ar an dara dul síos, beidh orainn comhad a chruthú main.h leis an ábhar seo a leanas:

#ifndef __MAIN_H
#define __MAIN_H

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

Agus ar deireadh, scríobh an fheidhm seo i do 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;
}

Níl fágtha ach cur isteach a chumasú. Déantar é seo ag baint úsáide as an ordú cóimeálaí rim - beidh ort é a chuardach i Lámhleabhar Clárúcháin:

//enable interrupts
_asm("rim");

Tá ordú cóimeálaí eile sim – idirbhriste a mhúchadh. Ní mór iad a mhúchadh agus luachanna nua á scríobh chuig an “fhíschuimhne”, ionas nach ndéanfaidh cur isteach a dhéantar ag an nóiméad mícheart an t-eagar a mhilleadh.

Gach cód - ar GitHub.

Léigh bileoga 2: SPI ar STM32; PWM, lasc ama agus idirbhristeacha ar STM8

Má fhaigheann duine éigin ar a laghad an t-alt seo úsáideach, níor scríobh mé go neamhbhalbh é. Beidh áthas orm tuairimí agus ráitis a fháil, déanfaidh mé iarracht gach rud a fhreagairt.

Foinse: will.com

Add a comment