Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

В premye pati a Mwen te eseye di enjenyè elektwonik pastan ki te grandi nan pantalon Arduino ki jan ak poukisa yo ta dwe li datasheets ak lòt dokiman pou mikrokontwolè. Tèks la te tounen gwo, kidonk mwen te pwomèt pou m montre egzanp pratik nan yon atik separe. Oke, li rele tèt li yon djondjon lèt...

Jodi a mwen pral montre w kouman yo sèvi ak fich done yo rezoud byen senp, men ki nesesè pou anpil pwojè, travay sou STM32 (Blue Pill) ak STM8 kontwolè. Tout pwojè Demo yo dedye a LED pi renmen m 'yo, nou pral limen yo nan gwo kantite, pou ki nou pral gen yo sèvi ak tout kalite periferik enteresan.

Tèks la te tounen gwo ankò, kidonk pou konvenyans mwen fè kontni an:

STM32 Blue Grenn: 16 LED ak chofè DM634
STM8: Mete kanpe sis broch PWM
STM8: 8 LED RGB sou twa broch, entèwonp

Limit responsabilite nou: Mwen pa yon enjenyè, mwen pa pretann gen konesans pwofon nan elektwonik, atik la fèt pou amatè tankou mwen. An reyalite, mwen konsidere tèt mwen de zan de sa kòm odyans lan sib. Si yon moun te di m lè sa a ke fichye sou yon chip ki pa abitye pa t pè pou li, mwen pa t ap pase anpil tan ap chèche kèk moso kòd sou entènèt la ak envante beki ak sizo ak tep adezif.

Konsantre nan atik sa a se sou fich done, pa sou pwojè, kidonk kòd la ka pa trè pwòp e souvan restrenn. Pwojè yo tèt yo trè senp, byenke apwopriye pou yon premye konesans ak nouvo chip la.

Mwen espere ke atik mwen an pral ede yon moun nan yon etap ki sanble nan imèsyon nan plezi a.

STM32

16 LED ak DM634 ak SPI

Yon ti pwojè lè l sèvi avèk Blue Pill (STM32F103C8T6) ak chofè DM634 dirije. Sèvi ak datasheets, nou pral konnen chofè a, pò STM IO ak konfigirasyon SPI.

DM634

Chip Taiwan ak 16 16-bit PWM pwodiksyon, yo ka konekte nan chenn. Se modèl 12-bit ki ba-fen li te ye nan yon pwojè domestik Lightpack. Nan yon sèl fwa, chwazi ant DM63x a ak byen li te ye TLC5940 a, mwen te chwazi DM pou plizyè rezon: 1) TLC sou Aliexpress se definitivman fo, men yon sèl sa a se pa; 2) DM gen yon PWM otonòm ak pwòp dèlko frekans li yo; 3) li ta ka achte pa chè nan Moskou, olye ke ap tann pou yon pasèl soti nan Ali. Epi, nan kou, li te enteresan pou aprann kijan pou kontwole chip la tèt ou, olye ke itilize yon bibliyotèk pare-fè. Chips yo kounye a sitou prezante nan pake SSOP24 la; yo fasil pou soude nan yon adaptè.

Depi manifakti a se Taiwanè, datasheet chip la ekri nan lang Chinwa angle, ki vle di li pral plezi. Premye nou gade pinout la (Koneksyon PIN) pou konprann ki pye pou konekte ak kisa, ak yon deskripsyon broch yo (PIN Deskripsyon). 16 broch:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
DC Sink Sources (Open Drenaj)

Lavabo / Pwodiksyon louvri-drenaj - drenaj; sous kouran abòde; se pwodiksyon an ki konekte ak tè nan eta a aktif - LED yo konekte ak chofè a pa katod. Elektrikman, sa a se, nan kou, pa yon "drenaj louvri" (drenaj louvri), men nan fich done yo souvan jwenn deziyasyon sa a pou broch nan mòd drenaj.

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Rezistans ekstèn ant REXT ak GND pou mete valè aktyèl pwodiksyon an

Yon rezistans referans enstale ant PIN REXT a ak tè a, ki kontwole rezistans entèn rezilta yo, gade graf la nan paj 9 nan fich done a. Nan DM634 a, rezistans sa a kapab tou kontwole pa lojisyèl, mete klète an jeneral (klète mondyal la); Mwen pa pral antre nan detay nan atik sa a, mwen pral jis mete yon rezistans 2.2 - 3 kOhm isit la.

Pou konprann kijan pou kontwole chip la, ann gade deskripsyon koòdone aparèy la:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Yeah, isit la li ye, Chinwa angle nan tout bèl pouvwa li yo. Tradiksyon sa a se yon pwoblèm, ou ka konprann li si ou vle, men gen yon lòt fason - gade ki jan koneksyon an ak TLC5940 ki sanble fonksyonèl yo dekri nan fichye a:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
... Se sèlman twa broch yo oblije antre done nan aparèy la. Kwen k ap monte nan siyal SCLK la deplase done ki soti nan PIN SIN la nan rejis entèn la. Apre tout done yo te chaje, yon kout siyal XLAT segondè fèmen done yo transfere sekans nan rejis entèn yo. Rejis entèn yo se pòtay ki deklanche pa nivo siyal XLAT la. Tout done yo transmèt pi enpòtan ti jan an premye.

Retire - latch / fèmen / fèmen.
Kwen k ap monte - kwen dirijan nan batman kè a
MSB an premye – pi enpòtan (pi agoch) ti jan pi devan.
revèy done yo – transmèt done sekans (ti pa ti jan).

Pawòl obtenir se souvan yo jwenn nan dokiman an pou chips epi li tradui nan divès fason, kidonk pou dedomajman pou la konpreyansyon mwen pral pèmèt tèt mwen

yon ti pwogram edikasyonChofè ki ap dirije a se esansyèlman yon rejis chanjman. "Chajman" (chanjman) nan non an - mouvman bit nan done andedan aparèy la: chak nouvo ti jan pouse andedan pouse tout chèn lan pi devan devan li. Piske pesonn pa vle obsève dezòd k ap bat yo nan LED yo pandan chanjman an, pwosesis la pran plas nan rejis tanpon separe de rejis k ap travay yo pa yon klape (obtenir) se yon kalite sal datant kote moso yo ranje nan sekans vle a. Lè tout bagay pare, vole a louvri epi ti moso yo ale nan travay, ranplase pakèt anvan an. Pawòl obtenir nan dokiman an pou microcircuits prèske toujou implique tankou yon klavye, pa gen pwoblèm nan ki konbinezon li se itilize.

Se konsa, transfè done nan DM634 la te pote soti tankou sa a: mete opinyon DAI a nan valè a nan ti kras ki pi enpòtan nan ki ap dirije a byen lwen, rale DCK leve, li desann; mete DAI a valè nan pwochen ti jan an, rale DCK; ak sou sa jiskaske tout bit yo te transmèt (revèy nan), apre sa nou rale LAT. Sa a ka fè manyèlman (ti-bang), men li pi bon pou itilize yon koòdone SPI espesyalman pwepare pou sa a, depi li prezante sou STM32 nou an nan de kopi.

Grenn ble STM32F103

Entwodiksyon: STM32 contrôleur yo pi konplèks pase Atmega328 pase yo ta ka sanble pè. Anplis, pou rezon ekonomize enèji, prèske tout periferik yo etenn nan kòmansman an, ak frekans revèy la se 8 MHz soti nan sous entèn la. Erezman, pwogramasyon STM yo te ekri kòd ki pote chip la jiska "kalkile" 72 MHz, ak otè yo nan tout IDE mwen konnen yo enkli li nan pwosedi inisyalizasyon an, kidonk nou pa bezwen revèy (men ou kapab si ou vle li toutbon). Men, ou pral oblije vire sou periferik yo.

Dokimantasyon: Blue Pill ekipe ak chip popilè STM32F103C8T6, gen de dokiman itil pou li:

Nan fichye done a nou ka enterese nan:

  • Pinouts - chip pinouts - nan ka nou deside fè tablo yo tèt nou;
  • Map memwa - kat memwa pou yon chip espesifik. Manyèl Referans la gen yon kat jeyografik pou tout liy lan, epi li mansyone rejis pa nou yo pa genyen.
  • Tablo Definisyon Pin – lis fonksyon prensipal ak altènatif nan broch; pou "grenn ble a" ou ka jwenn foto pi pratik sou entènèt la ak yon lis broch ak fonksyon yo. Se poutèt sa, nou imedyatman google Blue Pill pinout epi kenbe foto sa a nan men:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
NB: te gen yon erè nan foto a ki soti nan entènèt la, ki te note nan kòmantè yo, mèsi pou sa. Foto a te ranplase, men sa a se yon leson - li se pi bon yo tcheke enfòmasyon ki pa soti nan fich done.

Nou retire fichye done a, louvri Manyèl Referans la, epi depi kounye a nou itilize li sèlman.
Pwosedi: nou fè fas ak opinyon / pwodiksyon estanda, konfigirasyon SPI, vire sou periferik ki nesesè yo.

Antre Sòti

Sou Atmega328 la, I/O aplike trè senp, se poutèt sa abondans opsyon STM32 ka konfizyon. Koulye a, nou sèlman bezwen konklizyon, men menm sa yo gen kat opsyon:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
drenaj louvri, pouse-rale, altènatif pouse-rale, altènatif drenaj louvri

"Rale-pouse" (rale pouse) se pwodiksyon abityèl soti nan Arduino a, PIN la ka pran valè a swa HIGH oswa LOW. Men, ak "drenaj louvri" gen difikilte, byenke an reyalite tout bagay se senp isit la:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Konfigirasyon pwodiksyon / lè pò a asiyen nan pwodiksyon: / tanpon pwodiksyon pèmèt: / – mòd drenaj louvri: "0" nan rejis pwodiksyon an pèmèt N-MOS, "1" nan rejis pwodiksyon an kite pò a nan mòd Hi-Z ( P-MOS pa aktive) / – mòd pouse-rale: "0" nan rejis pwodiksyon an aktive N-MOS, "1" nan rejis pwodiksyon an aktive P-MOS.

Tout diferans ki genyen ant drenaj louvri (drenaj louvri) soti nan "pouse-rale" (rale pouse) se ke nan premye peny la pa ka aksepte eta a HIGH: lè w ap ekri youn nan rejis pwodiksyon an, li ale nan mòd rezistans segondè (segondè enpedans, Hi-Z). Lè w ekri zewo, peny la konpòte menm bagay la tou nan tou de mòd, tou de lojikman ak elektrik.

Nan mòd pwodiksyon nòmal, PIN la tou senpleman difize sa ki nan rejis pwodiksyon an. Nan "altènatif la" li kontwole pa periferik korespondan yo (gade 9.1.4):

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Si yon ti pò konfigirasyon kòm yon peny fonksyon altène, enskripsyon an enfim epi peny la konekte ak peny periferik la.

Yo dekri fonksyon altènatif chak peny nan PIN Definisyon Fich done a se sou imaj telechaje a. Pou kesyon sa pou w fè si yon peny gen plizyè fonksyon altènatif, repons lan bay yon nòt anba a nan fichye done a:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Si plizyè periferik itilize menm peny la, pou evite konfli ant fonksyon altènatif yo, yo ta dwe itilize sèlman yon periferik alafwa, aktive lè l sèvi avèk revèy periferik pèmèt ti jan (nan rejis RCC ki apwopriye a).

Finalman, broch nan mòd pwodiksyon tou gen yon vitès revèy. Sa a se yon lòt karakteristik ekonomize enèji; nan ka nou an, nou jis mete li nan maksimòm epi bliye li.

Se konsa: nou ap itilize SPI, ki vle di ke de broch (ak done ak yon siyal revèy) yo ta dwe "fonksyon pouse-rale altènatif", ak yon lòt youn (LAT) ta dwe "regilye pouse-rale". Men, anvan yo bay yo, ann fè fas ak SPI.

SPI

Yon lòt ti pwogram edikasyon

SPI oswa Serial Peripheral Interface (seri periferik koòdone) se yon koòdone senp ak trè efikas pou konekte yon MK ak lòt MKs ak mond lan deyò an jeneral. Prensip la nan operasyon li yo te deja dekri pi wo a, kote sou chofè a Chinwa dirije (nan manyèl referans la, gade seksyon 25). SPI ka opere nan mòd mèt ("mèt") ak esklav ("esklav"). SPI gen kat chanèl debaz, ki pa tout ka itilize:

  • MOSI, Mèt Sòti / Antre esklav: PIN sa a transmèt done nan mòd mèt, epi li resevwa done nan mòd esklav;
  • MISO, Mèt Antre / Sòti esklav: Okontrè, li resevwa nan mèt la, epi transmèt nan esklav la;
  • SCK, Serial Clock: mete frekans transmisyon done nan mèt la oswa resevwa yon siyal revèy nan esklav la. Esansyèlman frape bat;
  • SS, Slave Select: avèk èd nan kanal sa a, esklav la konnen ke yon bagay yo vle nan men li. Sou STM32 li rele NSS, kote N = negatif, i.e. Kontwolè a vin yon esklav si gen tè ​​nan kanal sa a. Li konbine byen ak mòd nan Open Drain Output, men sa a se yon lòt istwa.

Tankou tout lòt bagay, SPI sou STM32 rich nan fonksyonalite, ki fè li yon ti jan difisil pou konprann. Pou egzanp, li ka travay pa sèlman ak SPI, men tou, ak yon koòdone I2S, ak nan dokiman an deskripsyon yo melanje, li nesesè koupe depase an nan yon fason apwopriye. Travay nou an trè senp: nou jis bezwen voye done lè l sèvi avèk sèlman MOSI ak SCK. Nou ale nan seksyon 25.3.4 (half-duplex communication, half-duplex communication), kote nou jwenn 1 revèy ak 1 fil done inidireksyon (1 siyal revèy ak 1 kouran done inidireksyon):

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Nan mòd sa a, aplikasyon an sèvi ak SPI nan swa transmèt-sèlman oswa resevwa-sèlman mòd. / Transmèt-sèlman mòd se menm jan ak mòd duplex: done yo transmèt sou peny transmèt la (MOSI nan mòd mèt oswa MISO nan mòd esklav), ak peny resevwa a (MISO oswa MOSI respektivman) ka itilize kòm yon peny I / O regilye. . Nan ka sa a, aplikasyon an sèlman bezwen inyore tanpon Rx la (si li li, pa pral gen okenn done transfere la).

Gwo, PIN MISO a gratis, ann konekte siyal LAT la ak li. Ann gade nan Slave Select, ki sou STM32 a ka kontwole pwogramasyon, ki se trè pratik. Nou li paragraf ki gen menm non an nan seksyon 25.3.1 SPI Deskripsyon jeneral:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Kontwòl lojisyèl NSS (SSM = 1) / Enfòmasyon seleksyon esklav yo genyen nan ti SSI rejis SPI_CR1 la. PIN ekstèn NSS la rete gratis pou lòt bezwen aplikasyon an.

Li lè pou ekri nan rejis yo. Mwen deside sèvi ak SPI2, gade pou adrès baz li yo nan fichye done a - nan seksyon 3.3 Kat memwa:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Oke, ann kòmanse:

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

Louvri seksyon 25.3.3 ak tit la oto-eksplikasyon "Konfigirasyon SPI nan Mèt Mode":

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

1. Mete frekans revèy seri a ak bits BR[2:0] nan rejis SPI_CR1 la.

Rejis yo kolekte nan seksyon manyèl referans ki gen menm non an. Chanjman adrès (Adrès konpanse) pou CR1 - 0x00, pa default tout bits yo efase (Reyajiste valè 0x0000):

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Bits BR yo mete divizyon revèy kontwolè a, konsa detèmine frekans nan ki SPI a pral opere. Frekans STM32 nou an pral 72 MHz, chofè ki ap dirije a, dapre fèy done li yo, opere ak yon frekans ki rive jiska 25 MHz, kidonk nou bezwen divize pa kat (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. Mete bit CPOL ak CPHA pou defini relasyon ki genyen ant transfè done ak distribisyon seri revèy (gade dyagram nan paj 240)

Kòm nou ap li yon fichye done isit la epi nou pa gade nan chema, ann gade pi pre nan deskripsyon tèks la nan CPOL ak CPHA bit yo nan paj 704 (SPI Deskripsyon Jeneral):

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Faz revèy ak polarite
Sèvi ak bit CPOL ak CPHA nan rejis SPI_CR1, ou ka chwazi kat relasyon distribisyon. CPOL (polarite revèy) Bit la kontwole eta a nan siyal la revèy lè pa gen okenn done yo te transmèt. Bit sa a kontwole mòd mèt ak esklav. Si CPOL reset, PIN SCK a ba nan mòd repo. Si ti jan CPOL la mete, PIN SCK a wo pandan mòd repo.
Lè CPHA (faz revèy) ti jan an mete, strobe gwo bit pèlen an se dezyèm kwen nan siyal SCK la (tonbe si CPOL klè, k ap monte si CPOL mete). Done yo kaptire pa dezyèm chanjman nan siyal revèy la. Si ti jan CPHA a klè, strobe gwo pèlen an se kwen k ap monte nan siyal SCK la (kwen ap tonbe si CPOL mete, kwen k ap monte si CPOL otorize). Done yo pran nan premye chanjman nan siyal revèy la.

Èske w gen absòbe konesans sa a, nou rive nan konklizyon ke tou de ti dwe rete zewo, paske Nou vle siyal SCK a rete ba lè yo pa itilize, epi done yo dwe transmèt sou kwen k ap monte nan batman kè a (gade Fig. K ap monte Edge nan fichye done DM634).

By wout la, isit la nou premye rankontre yon karakteristik nan vokabilè a nan fich done ST: nan yo se fraz la "reset ti jan an zewo" ekri. reset yon ti janmen se pa pou klè yon ti jan, tankou, pou egzanp, Atmega.

3. Mete DFF ti jan an pou detèmine si blòk done a se fòma 8-bit oswa 16-bit

Mwen espesyalman te pran yon DM16 634-ti jan pou m pa deranje ak transmèt done PWM 12-ti jan, tankou DM633 la. Li fè sans pou mete DFF nan youn:

#define DFF         0x0800

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

4. Konfigure bit LSBFIRST nan rejis SPI_CR1 pou detèmine fòma blòk la

LSBFIRST, jan non li sijere, konfigirasyon transmisyon ak ti pi piti enpòtan an premye. Men, DM634 vle resevwa done kòmanse nan ti jan ki pi enpòtan an. Se poutèt sa, nou kite li reset.

5. Nan mòd pyès ki nan konpitè, si D 'nan PIN NSS la nesesè, aplike yon siyal segondè nan PIN NSS la pandan tout sekans transfè byte a. Nan mòd lojisyèl NSS, mete bit SSM ak SSI nan rejis SPI_CR1. Si peny NSS la dwe itilize kòm yon pwodiksyon, sèlman ti jan SSOE a bezwen mete.

Enstale SSM ak SSI pou bliye mòd pyès ki nan konpitè NSS:

#define SSI         0x0100
#define SSM         0x0200

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

6. Bits MSTR ak SPE yo dwe mete (yo rete mete sèlman si siyal NSS la wo)

Aktyèlman, ak ti moso sa yo nou deziyen SPI nou an kòm yon mèt epi limen li:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI se configuré, se pou yo imedyatman ekri fonksyon ki voye bytes nan chofè a. Kontinye lekti 25.3.3 "Konfigirasyon SPI nan mòd mèt":

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Lòd transfè done
Transmisyon kòmanse lè yo ekri yon byte nan tanpon Tx la.
Byte done a chaje nan rejis chanjman nan paralèl mòd (soti nan otobis la entèn) pandan transmisyon an nan ti jan an premye, apre sa li se transmèt nan sekansyèl Mòd PIN MOSI, premye oswa dènye ti jan pi devan selon anviwònman LSBFIRST ti jan nan rejis CPI_CR1 la. Se drapo TXE la mete apre transmisyon done soti nan tanpon Tx pou rejis chanjman, epi tou jenere yon entèwonp si yo mete TXEIE bit nan rejis CPI_CR1 la.

Mwen mete aksan sou kèk mo nan tradiksyon an pou atire atansyon sou yon karakteristik aplikasyon SPI nan kontwolè STM. Sou Atmega drapo TXE a (Tx vid, Tx vid epi pare pou resevwa done) yo mete sèlman apre yo fin voye tout byte a soti. Epi isit la se drapo sa a mete apre yo fin mete byte a nan rejis chanjman entèn la. Depi li se pouse la ak tout Bits yo an menm tan an (an paralèl), ak Lè sa a, done yo transfere sekans, TXE yo mete anvan byte a konplètman voye. Sa a enpòtan paske an ka chofè dirije nou an, nou bezwen rale PIN LAT apre voye nan tout done, i.e. Drapo TXE a pou kont li pap ase pou nou.

Sa vle di nou bezwen yon lòt drapo. Ann gade nan 25.3.7 - "Statis Flags":

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
<...>
Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Okipe drapo
BSY drapo a mete ak otorize pa pyès ki nan konpitè (ekri li pa gen okenn efè). Drapo BSY a endike eta kouch kominikasyon SPI a.
Li reset:
lè transfè a fini (eksepte nan mòd mèt si transfè a kontinyèl)
lè SPI enfim
lè yon erè mòd mèt rive (MODF = 1)
Si transfè a pa kontinyèl, drapo BSY la efase ant chak transfè done

Oke, sa a pral vin an sou la men. Ann chèche konnen ki kote tanpon Tx la ye. Pou fè sa, li "SPI Data Register":

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Bits 15:0 DR[15:0] Done Rejis
Done resevwa oswa done yo dwe transmèt.
Rejis done a divize an de tanpon - youn pou ekri (tanpon transmèt) ak youn pou lekti (resevwa tanpon). Ekri nan rejis done a ekri nan tanpon Tx la, epi lekti nan rejis done a ap retounen valè ki genyen nan tanpon Rx la.

Oke, ak enskri estati a, kote drapo TXE ak BSY yo jwenn:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Nou ekri:

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

Oke, depi nou bezwen transmèt 16 fwa de byte, dapre kantite rezilta chofè ki ap dirije, yon bagay tankou sa a:

void sendLEDdata()
{
    LAT_low();
    uint8_t k = 16;
    do
    {   k--;
        dm_shift16(leds[k]);
    } while (k);

    while (_SPI2_(_SPI_SR) & BSY); // finish transmission

    LAT_pulse();
}

Men, nou pa konnen ki jan yo rale PIN LAT la ankò, kidonk nou pral tounen nan I / O.

Bay zepeng

Nan STM32F1 a, rejis ki responsab pou eta a nan broch yo byen etranj. Li klè ke gen plis nan yo pase Atmega, men yo diferan tou de lòt chips STM. Seksyon 9.1 Deskripsyon Jeneral GPIO:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Chak nan objektif jeneral I/O pò yo (GPIO) gen de rejis konfigirasyon 32-bit (GPIOx_CRL ak GPIOx_CRH), de rejis done 32-bit (GPIOx_IDR ak GPIOx_ODR), yon rejis mete/reset 32-bit (GPIOx_BSRR), yon rejis reset 16-bit (GPIOx_BRR) ak yon rejis 32-bit. bit bloke enskri (GPIOx_LCKR).

De premye rejis yo etranj, epi tou byen enkonvenyan, paske 16 broch pò yo gaye sou yo nan yon fòma "kat Bits pa frè". Moun sa yo. broch zewo a sèt yo nan CRL, ak rès yo nan CRH. An menm tan an, rejis ki rete yo gen siksè gen ti moso yo nan tout broch nan pò a - souvan rete mwatye "rezève".

Pou senplisite, ann kòmanse nan fen lis la.

Nou pa bezwen yon rejis bloke.

Anrejistre yo mete ak reset yo byen komik nan ke yo pasyèlman kopi youn ak lòt: ou ka ekri tout bagay sèlman nan BSRR, kote 16 bit ki pi wo yo pral reset peny la a zewo, ak sa ki pi ba yo pral mete nan 1, oswa ou ka tou. sèvi ak BRR, 16 bit ki pi ba yo ki sèlman reset PIN la. Mwen renmen dezyèm opsyon an. Rejis sa yo enpòtan paske yo bay aksè atomik nan broch:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Atomik Mete oswa Reyajiste
Pa gen okenn nesesite pou enfim entèwonp lè w ap pwograme GPIOx_ODR nan nivo bit: youn oswa plis bit ka chanje ak yon sèl operasyon ekri atomik APB2. Sa a se reyalize lè w ekri yon "1" nan rejis la mete / reset (GPIOx_BSRR oswa, pou reset sèlman, GPIOx_BRR) nan ti jan an ki bezwen chanje. Lòt moso yo ap rete san okenn chanjman.

Rejis done yo gen non byen ki eksplikasyon pwòp tèt ou - IDR = Antre Direksyon Rejis, enskri antre; ODR = Sòti Direksyon Enskri, enskri pwodiksyon an. Nou p ap bezwen yo nan pwojè aktyèl la.

Epi finalman, kontwòl anrejistre. Depi nou enterese nan dezyèm broch SPI yo, sètadi PB13, PB14 ak PB15, nou imedyatman gade CRH:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Epi nou wè ke nou pral bezwen ekri yon bagay nan Bits soti nan 20 a 31.

Nou te deja kalkile pi wo a sa nou vle soti nan broch, kidonk isit la mwen pral fè san yo pa yon Ekran, mwen pral jis di ke MODE presize direksyon an (antre si tou de Bits yo mete nan 0) ak vitès PIN (nou bezwen 50MHz, i.e. tou de PIN nan "1"), ak CNF mete mòd nan: regilye "push-pull" - 00, "altènatif" - 10. Pa default, jan nou wè pi wo a, tout broch gen twazyèm ti jan an anba (CNF0), li mete yo nan mòd k ap flote opinyon.

Depi mwen planifye fè yon lòt bagay ak chip sa a, pou senplisite mwen te defini tout MODE ak valè CNF posib pou tou de rejis kontwòl pi ba yo ak anwo yo.

Yon jan kanmenm tankou sa a

#define CNF0_0 0x00000004
#define CNF0_1 0x00000008
#define CNF1_0 0x00000040
#define CNF1_1 0x00000080
#define CNF2_0 0x00000400
#define CNF2_1 0x00000800
#define CNF3_0 0x00004000
#define CNF3_1 0x00008000
#define CNF4_0 0x00040000
#define CNF4_1 0x00080000
#define CNF5_0 0x00400000
#define CNF5_1 0x00800000
#define CNF6_0 0x04000000
#define CNF6_1 0x08000000
#define CNF7_0 0x40000000
#define CNF7_1 0x80000000
#define CNF8_0 0x00000004
#define CNF8_1 0x00000008
#define CNF9_0 0x00000040
#define CNF9_1 0x00000080
#define CNF10_0 0x00000400
#define CNF10_1 0x00000800
#define CNF11_0 0x00004000
#define CNF11_1 0x00008000
#define CNF12_0 0x00040000
#define CNF12_1 0x00080000
#define CNF13_0 0x00400000
#define CNF13_1 0x00800000
#define CNF14_0 0x04000000
#define CNF14_1 0x08000000
#define CNF15_0 0x40000000
#define CNF15_1 0x80000000

#define MODE0_0 0x00000001
#define MODE0_1 0x00000002
#define MODE1_0 0x00000010
#define MODE1_1 0x00000020
#define MODE2_0 0x00000100
#define MODE2_1 0x00000200
#define MODE3_0 0x00001000
#define MODE3_1 0x00002000
#define MODE4_0 0x00010000
#define MODE4_1 0x00020000
#define MODE5_0 0x00100000
#define MODE5_1 0x00200000
#define MODE6_0 0x01000000
#define MODE6_1 0x02000000
#define MODE7_0 0x10000000
#define MODE7_1 0x20000000
#define MODE8_0 0x00000001
#define MODE8_1 0x00000002
#define MODE9_0 0x00000010
#define MODE9_1 0x00000020
#define MODE10_0 0x00000100
#define MODE10_1 0x00000200
#define MODE11_0 0x00001000
#define MODE11_1 0x00002000
#define MODE12_0 0x00010000
#define MODE12_1 0x00020000
#define MODE13_0 0x00100000
#define MODE13_1 0x00200000
#define MODE14_0 0x01000000
#define MODE14_1 0x02000000
#define MODE15_0 0x10000000
#define MODE15_1 0x20000000

Broch nou yo sitiye sou pò B (adrès baz - 0x40010C00), kò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;

Epi, kòmsadwa, ou ka ekri definisyon pou LAT, ki pral twitched pa rejis BRR ak 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 jis pa inèsi, li te toujou konsa, kite l rete)

Koulye a, tout bagay se gwo, men li pa travay. Paske sa a se STM32, yo sove elektrisite, ki vle di ou bezwen pèmèt revèy nan periferik yo mande yo.

Aktive revèy

Revèy la, ke yo rele tou revèy, responsab pou revèy. Epi nou te kapab deja remake abrevyasyon RCC la. Nou gade pou li nan dokiman an: sa a se Reyajiste ak kontwòl revèy.

Jan sa te di pi wo a, erezman, pati ki pi difisil nan sijè revèy la te fè pou nou pa moun ki soti nan STM, pou sa nou remèsye yo anpil (yon lòt fwa ankò mwen pral bay yon lyen nan Sit entènèt Di Halt, pou fè li klè ki jan konfizyon li ye). Nou sèlman bezwen rejis ki responsab pou pèmèt revèy periferik (Peripheral Clock Enable Registers). Premyèman, ann jwenn adrès debaz RCC a, li se nan kòmansman an nan "Memory Map":

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

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

Lè sa a, swa klike sou lyen kote ou eseye jwenn yon bagay nan plak la, oswa, pi byen, ale nan deskripsyon yo nan rejis pèmèt yo nan seksyon yo sou. pèmèt rejis yo. Ki kote nou pral jwenn RCC_APB1ENR ak RCC_APB2ENR:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Epi yo, kòmsadwa, gen ladan Bits ki gen ladan revèy SPI2, IOPB (I/O Port B) ak fonksyon altènatif (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;

Ou ka jwenn kòd final la isit la.

Si ou gen opòtinite ak dezi pou teste, Lè sa a, konekte DM634 a tankou sa a: DAI ak PB15, DCK ak PB13, LAT ak PB14. Nou pouvwa chofè a soti nan 5 vòlt, pa bliye konekte teren yo.

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

STM8 PWM

PWM sou STM8

Lè mwen te jis planifye atik sa a, mwen te deside, kòm yon egzanp, eseye metrize kèk fonksyonalite nan yon chip abitye lè l sèvi avèk sèlman yon fich done, pou ke mwen pa ta fini ak yon kodonye san bòt. STM8 te ideyal pou wòl sa a: premyèman, mwen te gen yon koup nan tablo Chinwa ak STM8S103, ak dezyèmman, li pa trè popilè, ak Se poutèt sa tantasyon an li epi jwenn yon solisyon sou entènèt la repoze sou mank nan solisyon sa yo anpil.

Chip la genyen tou datasheet и manyèl referans RM0016, nan premye a gen pinout ak enskri adrès, nan dezyèm lan - tout lòt bagay. STM8 pwograme nan C nan yon IDE terib ST vizyèl Devlopman.

Revèy ak I/O

Pa default, STM8 opere nan yon frekans nan 2 MHz, sa a dwe korije imedyatman.

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Revèy HSI (Gwo Vitès Entèn).
Siyal revèy HSI a sòti nan yon osilator entèn 16 MHz RC ak yon divizyon pwogramasyon (1 a 8). Li mete nan rejis divizyon revèy la (CLK_CKDIVR).
Remak: nan kòmansman an, yo chwazi yon osilator HSI RC ak yon divizyon 8 kòm sous prensipal siyal revèy la.

Nou jwenn adrès enskri a nan fichye done a, deskripsyon an nan refman epi wè ke rejis la bezwen efase:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Depi nou pral kouri PWM epi konekte LED yo, ann gade pinout la:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Chip la piti, anpil fonksyon yo sispann sou menm broch yo. Ki sa ki nan parantèz kare se "fonksyonalite altènatif", li chanje pa "octet opsyon" (byte opsyon) - yon bagay tankou Atmega fusibles. Ou ka chanje valè yo pwogramasyon, men li pa nesesè, paske Nouvo fonksyonalite a aktive sèlman apre yon rdemare. Li pi fasil pou itilize ST Visual Programmer (telechaje ak Visual Develop), ki ka chanje bytes sa yo. Pinout la montre ke broch CH1 ak CH2 nan premye revèy la kache nan parantèz kare; li nesesè yo mete AFR1 ak AFR0 Bits nan STVP, ak dezyèm lan pral transfere tou pwodiksyon CH1 nan dezyèm revèy la soti nan PD4 a PC5.

Kidonk, 6 broch pral kontwole LED yo: PC6, PC7 ak PC3 pou premye revèy la, PC5, PD3 ak PA3 pou dezyèm lan.

Mete sou pye I/O tèt yo sou STM8 se pi senp ak pi lojik pase sou STM32:

  • abitye nan rejis direksyon done Atmega DDR (Done Direksyon Enskri): 1 = pwodiksyon;
  • premye enskri CR1 kontwòl la, lè pwodiksyon, mete mòd pouse-rale (1) oswa louvri drenaj (0); depi mwen konekte LED yo nan chip la ak katod, mwen kite zewo isit la;
  • dezyèm kontwòl enskri CR2 a, lè pwodiksyon, mete vitès revèy la: 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

Anviwònman PWM

Premyèman, ann defini tèm yo:

  • PWM Frekans - frekans ak ki revèy la tik;
  • Oto-rechaje, AR - valè otoloadable jiska ki revèy la pral konte (peryòd batman kè);
  • Mizajou Evènman, UEV – yon evènman ki rive lè revèy la konte pou AR;
  • Sik devwa PWM - Sik devwa PWM, yo rele souvan "faktè devwa";
  • Kaptire / Konpare Valè - valè pou kaptire / konparezon, ki te konte revèy la pral fè yon bagay (nan ka PWM, li envèse siyal pwodiksyon an);
  • Valè Preload - valè prechaje. Konpare valè pa ka chanje pandan revèy la ap mache, otreman sik PWM la ap kraze. Se poutèt sa, nouvo valè transmèt yo mete yo nan yon tanpon epi yo rale soti lè revèy la rive nan fen dekont li yo epi yo reset;
  • Edge-aliyen и Sant ki aliye mòd – aliyman sou fwontyè a ak nan sant la, menm jan ak Atmel la PWM vit и Faz-kòrèk PWM.
  • OCiREF, Sòti Konpare Siyal Referans - referans siyal pwodiksyon, an reyalite, sa ki parèt sou peny ki koresponn lan nan mòd PWM.

Kòm deja klè nan pinout la, de revèy gen kapasite PWM - premye a ak dezyèm lan. Tou de se 16-bit, premye a gen yon anpil nan karakteristik adisyonèl (an patikilye, li ka konte tou de monte ak desann). Nou bezwen tou de travay egalman, se konsa mwen deside kòmanse ak yon dezyèm evidamman pi pòv la, se konsa yo pa aksidantèlman itilize yon bagay ki pa la. Gen kèk pwoblèm se ke deskripsyon an nan fonksyonalite PWM nan tout revèy nan manyèl referans la se nan chapit la sou premye revèy la (17.5.7 PWM Mode), kidonk, ou dwe sote retounen ak lide nan tout dokiman an tout tan tout tan an.

PWM sou STM8 gen yon avantaj enpòtan sou PWM sou Atmega:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Fwontyè ki aliye PWM
Konfigirasyon kont anba nan tèt
Konte anba a aktif si bit DIR ki nan rejis TIM_CR1 la efase
Egzanp
Egzanp lan sèvi ak premye mòd PWM. Siyal referans PWM OCiREF kenbe wo osi lontan ke TIM1_CNT < TIM1_CCRi. Sinon li pran yon nivo ki ba. Si valè konparezon nan rejis TIM1_CCRi a pi gran pase valè autoload (enskri TIM1_ARR), siyal OCiREF la kenbe nan 1. Si valè konparezon a se 0, OCiREF kenbe nan zewo....

STM8 revèy pandan aktyalizasyon evènman an chèk premye konpare valè, epi sèlman lè sa a pwodui yon siyal referans. Revèy Atmega a premye vis ak Lè sa a, konpare, sa ki lakòz compare value == 0 pwodiksyon an se yon zegwi, ki dwe fè fas ak yon jan kanmenm (pa egzanp, pa pwogramasyon envèse lojik la).

Se konsa, sa nou vle fè: 8-bit PWM (AR == 255), konte depi anba rive anwo, aliyman sou fwontyè a. Depi anpoul yo konekte ak chip la pa katod, PWM a ta dwe pwodiksyon 0 (dirije sou) jiskaske konpare valè ak 1 apre.

Nou te deja li sou kèk Mòd PWM, kidonk nou jwenn rejis ki nesesè pou dezyèm revèy la lè nou chèche fraz sa a nan manyèl referans (18.6.8 - TIMx_CCMR1):

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
110: Premye mòd PWM - lè w ap konte depi anba rive anwo, premye kanal la aktif pandan TIMx_CNT < TIMx_CCR1. Sinon, premye kanal la inaktif. [pi lwen nan dokiman an gen yon erè kopi-kole soti nan revèy 1] 111: Dezyèm mòd PWM - lè w ap konte depi anba rive anwo, premye kanal la inaktif pandan TIMx_CNT < TIMx_CCR1. Sinon, premye kanal la aktif.

Depi LED yo konekte ak MK a pa katod, dezyèm mòd nan kostim nou (premye a tou, men nou pa konnen sa ankò).

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Bit 3 OC1PE: Pèmèt PIN 1 prechaje
0: Enskri Preload sou TIMx_CCR1 enfim. Ou ka ekri nan TIMx_CCR1 nenpòt ki lè. Nouvo valè a ap travay imedyatman.
1: Preload enskri sou TIMx_CCR1 aktive. Operasyon lekti/ekri jwenn aksè nan rejis prechaj la. Valè prechaje TIMx_CCR1 chaje nan rejis lonbraj la pandan chak evènman aktyalizasyon.
*Remak: Pou mòd PWM travay byen, rejis prechaj yo dwe aktive. Sa a pa nesesè nan mòd siyal sèl (bit OPM la mete nan rejis TIMx_CR1).

Oke, ann limen tout sa nou bezwen pou twa chanèl dezyèm revèy la:

#define TIM2_CCMR1 *(volatile uint8_t *)0x005307
#define TIM2_CCMR2 *(volatile uint8_t *)0x005308
#define TIM2_CCMR3 *(volatile uint8_t *)0x005309

#define PWM_MODE2   0x70 //PWM mode 2, 0b01110000
#define OCxPE       0x08 //preload enable

TIM2_CCMR1 = (PWM_MODE2 | OCxPE);
TIM2_CCMR2 = (PWM_MODE2 | OCxPE);
TIM2_CCMR3 = (PWM_MODE2 | OCxPE);

AR konsiste de de rejis uit-bit, tout bagay se senp:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Dezyèm revèy la ka sèlman konte anba nan tèt, aliyman sou fwontyè a, pa gen anyen ki bezwen chanje. Ann mete divizyon frekans lan, pa egzanp, sou 256. Pou dezyèm revèy la, divize an mete nan rejis TIM2_PSCR la epi li se yon pouvwa de:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Tout sa ki rete se vire sou konklizyon yo ak dezyèm revèy la tèt li. Premye pwoblèm nan rezoud pa anrejistre Kaptire / Konpare Pèmèt: gen de, twa chanèl gaye sou yo asimetrik. Isit la nou ka aprann tou ke li posib pou chanje polarite siyal la, i.e. an prensip, li te posib yo sèvi ak PWM Mode 1. Nou ekri:

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

Epi finalman, nou kòmanse revèy la nan rejis TIMx_CR1 la:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Ann ekri yon analogue senp AnalogWrite(), ki pral transfere valè aktyèl yo nan revèy la pou konparezon. Rejis yo nonmen previzib Kaptire/Konpare rejis yo, gen de nan yo pou chak chanèl: 8 bit yo ki ba-lòd nan TIM2_CCRxL ak sa yo ki wo-lòd nan TIM2_CCRxH. Depi nou te kreye yon PWM 8-bit, li se ase yo ekri sèlman ti bit yo pi piti enpòtan:

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

Lektè atantif la pral remake ke nou gen yon PWM yon ti kras ki defektye, ki pa kapab pwodwi 100% ranpli (nan yon valè maksimòm 255, se siyal la Envèse pou yon sik revèy). Pou dirije sa a pa gen pwoblèm, ak lektè a atantif ka deja devine ki jan yo ranje li.

PWM sou dezyèm revèy la ap travay, ann ale nan premye a.

Premye revèy la gen egzakteman menm bit yo nan menm rejis yo (se jis ke ti bit sa yo ki rete "rezève" nan dezyèm revèy la yo aktivman itilize nan premye a pou tout kalite bagay avanse). Se poutèt sa, li ase yo jwenn adrès yo nan menm rejis yo nan fichye a epi kopye kòd la. Oke, chanje valè divizyon frekans lan, paske... premye revèy la vle resevwa pa yon pouvwa de de, men yon valè egzak 16-ti jan nan de rejis Prescaler segondè и ba. Nou fè tout bagay epi... premye revèy la pa mache. Ki pwoblèm nan?

Pwoblèm nan ka rezoud sèlman lè w gade nan tout seksyon an sou rejis kontwòl yo nan revèy 1, kote nou chèche youn ki dezyèm revèy la pa genyen. Ap genyen 17.7.30 Anrejistre kraze (TIM1_BKR), kote gen ti sa a:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Pèmèt pwodiksyon prensipal la

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Sa a tout pou asire w kounye a, kòd la la.

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

STM8 Multiplex

Multiplexing sou STM8

Twazyèm mini-pwojè a se konekte uit LED RGB nan dezyèm revèy la nan mòd PWM epi fè yo montre diferan koulè. Li baze sou konsèp nan multiplexage LED, ki se ke si ou limen ak etenn LED trè, trè vit, li pral sanble yo ke yo toujou ap limen (pèsistans vizyon, inèsi nan pèsepsyon vizyèl). Mwen te fè yon fwa yon bagay tankou sa a sou Arduino.

Algorithm travay la sanble sa a:

  • konekte anod premye ki ap dirije RGB;
  • limen li, voye siyal ki nesesè yo nan katod yo;
  • tann jouk nan fen sik la PWM;
  • konekte anod dezyèm RGB ki ap dirije a;
  • limen li...

Oke, elatriye. Natirèlman, pou operasyon bèl li nesesè ke anod la konekte ak dirije a "limen" an menm tan an. Oke, oswa prèske. Nan nenpòt ka, nou bezwen ekri yon kòd ki pral pwodwi valè nan twa chanèl nan dezyèm revèy la, chanje yo lè yo rive nan UEV, epi an menm tan an chanje ki ap dirije RGB aktyèl la.

Depi chanjman ki ap dirije se otomatik, nou bezwen kreye yon "memwa videyo" ki soti nan ki responsab entèwonp la ap resevwa done. Sa a se yon seri senp:

uint8_t colors[8][3];

Yo nan lòd yo chanje koulè a ​​nan yon dirije espesifik, li pral ase yo ekri valè ki nesesè yo nan etalaj sa a. Ak varyab la pral responsab pou kantite ki ap dirije aktif la

uint8_t cnt;

Demux

Pou bon multiplexage, nou bezwen, etranj ase, yon CD74HC238 demultiplexer. Demultiplexer - yon chip ki aplike operatè a nan pyès ki nan konpitè <<. Atravè twa broch antre (bit 0, 1 ak 2) nou bay li yon nimewo twa-bit X, epi an repons li aktive nimewo pwodiksyon (1<<X). Antre ki rete yo nan chip la yo itilize pou echèl konsepsyon an antye. Nou bezwen chip sa a pa sèlman diminye kantite broch okipe nan mikrokontwolè a, men tou pou sekirite - se konsa yo pa aksidantèlman vire sou plis dirije pase posib epi yo pa boule MK la. Chip la koute yon pyès lajan epi yo ta dwe toujou kenbe nan kabinè medikaman lakay ou.

CD74HC238 nou an pral responsab pou bay vòltaj anod ki ap dirije a vle. Nan yon multiplex plen véritable, li ta bay vòltaj kolòn nan atravè yon P-MOSFET, men nan Demo sa a li posib dirèkteman, paske li trase 20 mA, dapre evalyasyon maksimòm absoli nan fichye done a. Soti nan Fèy done CD74HC238 nou bezwen pinouts ak fèy cheat sa a:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
H = nivo vòltaj segondè, L = nivo vòltaj ki ba, X - pa pran swen

Nou konekte E2 ak E1 nan tè, E3, A0, A1 ak A3 nan broch PD5, PC3, PC4 ak PC5 nan STM8. Piske tablo ki anwo a gen tou de nivo ki ba ak nivo segondè, nou konfigirasyon broch sa yo kòm broch pouse-rale.

PWM

PWM sou dezyèm revèy la se configuré menm jan ak nan istwa anvan an, ak de diferans:

Premyèman, nou bezwen pèmèt entèwonp la Mizajou Evènman (UEV) ki pral rele yon fonksyon ki active LED aktif la. Sa a se fè pa chanje ti jan an Mizajou entèwonp pèmèt nan yon rejis ak yon non di

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
Entèwonp pèmèt enskri

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Dezyèm diferans ki gen rapò ak fenomèn multiplexage, tankou fantom - ekla parazit nan dyod. Nan ka nou an, li ka parèt akòz lefèt ke revèy la, li te lakòz yon entèwonp sou UEV a, kontinye tik, ak moun k ap okipe entèwonp la pa gen tan chanje dirije a anvan revèy la kòmanse ekri yon bagay nan broch yo. Pou konbat sa a, ou pral oblije envèse lojik la (0 = klète maksimòm, 255 = pa gen anyen ki limen) epi evite valè sik devwa ekstrèm. Moun sa yo. asire w ke apre UEV LED yo ale nèt pou yon sik PWM.

Chanje polarite:

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

Evite mete r, g ak b a 255 epi sonje envèse yo lè w ap itilize yo.

Entèwonp

Sans nan yon entèwonp se ke nan sèten sikonstans chip la sispann egzekite pwogram prensipal la epi li rele kèk fonksyon ekstèn. Entèwonp rive akòz enfliyans ekstèn oswa entèn, ki gen ladan revèy la.

Lè nou te fèk kreye yon pwojè nan ST Visual Develop, anplis main.c nou te resevwa yon fenèt ak yon dosye misterye stm8_interrupt_vector.c, otomatikman enkli nan pwojè a. Nan dosye sa a, yo bay yon fonksyon nan chak entèwonp NonHandledInterrupt. Nou bezwen mare fonksyon nou an ak entèwonp vle a.

Fich done a gen yon tablo vektè entèwonp, kote nou jwenn sa nou bezwen yo:

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8
13 TIM2 aktyalizasyon/debòde
14 TIM2 pran/konpare

Nou bezwen chanje LED nan UEV, kidonk nou bezwen entèwonp #13.

An konsekans, premyèman, nan dosye a stm8_interrupt_vector.c chanje non fonksyon ki responsab pou entèwonp nimewo 13 (IRQ13) pou pwòp non ou:

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

Dezyèmman, nou pral gen yo kreye yon dosye main.h ak kontni sa a:

#ifndef __MAIN_H
#define __MAIN_H

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

Epi finalman, ekri fonksyon sa a nan ou 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;
}

Tout sa ki rete se pèmèt entèwonp. Sa a se fè lè l sèvi avèk lòd asanble a rim - ou pral oblije chèche li nan Manyèl pwogramasyon:

//enable interrupts
_asm("rim");

Yon lòt kòmand asanble se sim – fèmen entèwonp yo. Yo dwe etenn pandan y ap ekri nouvo valè nan "memwa videyo a", pou yon entèripsyon ki te koze nan move moman an pa gate etalaj la.

Tout kòd - sou GitHub.

Li fichye done 2: SPI sou STM32; PWM, timers ak entèwonp sou STM8

Si omwen yon moun jwenn atik sa a itil, Lè sa a, mwen pa t 'ekri li pou gremesi. Mwen pral kontan resevwa kòmantè ak remak, mwen pral eseye reponn tout bagay.

Sous: www.habr.com

Add nouvo kòmantè