Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Π’ tapany voalohany Niezaka nilaza tamin'ny injeniera elektronika fialamboly aho izay nihalehibe tamin'ny pataloha Arduino ny fomba sy ny antony tokony hamakian'izy ireo ny datasheets sy ny antontan-taratasy hafa ho an'ny microcontrollers. Lasa lehibe ilay lahatsoratra, ka nampanantena aho fa hampiseho ohatra azo ampiharina ao amin’ny lahatsoratra mitokana. Eny, niantso ny tenany ho holatra ronono izy...

Androany dia hasehoko anao ny fomba fampiasana ny datasheets hamahana tena tsotra, fa ilaina amin'ny tetikasa maro, asa amin'ny STM32 (Blue Pill) sy STM8 controllers. Ny tetikasa demo rehetra dia natokana ho an'ny LED ankafiziko indrindra, hanazava azy ireo be dia be izahay, izay tsy maintsy hampiasantsika ireo karazana periferika mahaliana rehetra.

Ny lahatsoratra indray dia nivadika ho lehibe, noho izany dia nataoko ny votoatiny:

STM32 Blue Pill: LED 16 miaraka amin'ny mpamily DM634
STM8: Mametraka tsipika PWM enina
STM8: 8 RGB LED amin'ny pin telo, manapaka

Disclaimer: Tsy injeniera aho, tsy mody manana fahalalana lalina momba ny elektronika, natao ho an'ny mpankafy toa ahy ny lahatsoratra. Raha ny marina, dia nihevitra ny tenako ho mpanatrika lasibatra aho roa taona lasa izay. Raha nisy nilaza tamiko avy eo fa tsy mampatahotra ny mamaky ny angon-drakitra amin'ny puce tsy mahazatra, dia tsy ho nandany fotoana be aho nitadiavana kaody sasany tao amin'ny Internet ary nanamboatra tehina miaraka amin'ny hety sy kasety adhesive.

Ny ifantohan'ity lahatsoratra ity dia amin'ny angon-drakitra fa tsy tetikasa, noho izany dia mety tsy dia milamina loatra ny kaody ary matetika tery. Ny tetikasa dia tena tsotra, na dia mety ho an'ny olom-pantatra voalohany amin'ny chip vaovao.

Manantena aho fa ny lahatsoratro dia hanampy olona iray amin'ny dingana mitovy amin'ny asitrika amin'ny fialamboly.

STM32

LED 16 miaraka amin'ny DM634 sy SPI

Tetikasa kely mampiasa Blue Pill (STM32F103C8T6) sy mpamily LED DM634. Amin'ny fampiasana ny angona, dia hamantatra ny mpamily, seranan-tsambo STM IO ary manamboatra SPI.

DM634

Chip Taiwanese misy 16 16-bit PWM outputs, azo ampifandraisina amin'ny rojo. Ny modely 12-bit ambany dia fantatra amin'ny tetikasa an-trano Lightpack. Tamin'ny fotoana iray, nisafidy ny DM63x sy ny TLC5940 fanta-daza, dia nisafidy DM aho noho ny antony maro: 1) TLC amin'ny Aliexpress dia tena sandoka, fa tsy ity; 2) DM manana PWM autonomous miaraka amin'ny mpamokatra fatrany manokana; 3) azo vidiana amin'ny vidiny mora any Moskoa izy io, fa tsy miandry parcel avy amin'i Ali. Ary, mazava ho azy, dia nahaliana ny mianatra ny fomba hifehy ny chip ny tenanao, fa tsy mampiasa tranomboky efa vonona. Ny chips dia aseho amin'izao fotoana izao ao amin'ny fonosana SSOP24; mora apetraka amin'ny adaptatera izy ireo.

Satria Taiwanese ny mpanamboatra, Takela-daza ny chip dia voasoratra amin'ny teny anglisy sinoa, izay midika fa hahafinaritra. Voalohany dia mijery ny pinout isika (Pin Connection(Famaritana Pin). 16 pts:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Loharanom-pandrefesana DC (Taratasy misokatra)

hilentika / Open-drain Output - tatatra; loharanon'ny komandy miditra; Ny vokatra dia mifandray amin'ny tany ao amin'ny fanjakana mavitrika - ny LED dia mifandray amin'ny mpamily amin'ny cathodes. Amin'ny lafiny elektrΓ΄nika, mazava ho azy fa tsy "faritra misokatra" izany (tatatra misokatra), fa ao amin'ny datasheets dia hita matetika ity fanendrena ho an'ny tsimatra ity.

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Ny fanoherana ivelany eo anelanelan'ny REXT sy GND mba hametrahana ny sanda ankehitriny

Misy resistor reference apetraka eo anelanelan'ny PIN sy ny tany REXT, izay mifehy ny fanoherana anatiny amin'ny vokatra, jereo ny tabilao ao amin'ny pejy faha-9 amin'ny datasheet. Ao amin'ny DM634, io fanoherana io dia azo fehezin'ny rindrambaiko ihany koa, mametraka ny famirapiratana ankapobeny (famirapiratana maneran-tany); Tsy hiditra amin'ny antsipiriany amin'ity lahatsoratra ity aho, hametraka resistor 2.2 - 3 kOhm eto fotsiny aho.

Mba hahatakarana ny fomba hifehy ny chip, andeha hojerentsika ny famaritana ny fitaovana interface tsara:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Eny, indro, Anglisy Sinoa amin'ny voninahiny rehetra. Ny fandikana izany dia olana, azonao atao ny mahatakatra izany raha tianao, fa misy fomba iray hafa - jereo ny fomba voalaza ao amin'ny datasheet ny fifandraisana amin'ny TLC5940 mitovy amin'ny fiasa:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
... Pins telo ihany no ilaina hampidirana angona ao amin'ilay fitaovana. Ny sisiny miakatra amin'ny famantarana SCLK dia mamindra ny angon-drakitra avy amin'ny pin SIN mankany amin'ny rejisitra anatiny. Rehefa feno ny angon-drakitra rehetra dia misy famantarana XLAT avo lenta fohy mametaka ny angon-drakitra nafindra amin'ny rejisitra anatiny. Ny rejisitra anatiny dia vavahady ateraky ny haavon'ny famantarana XLAT. Ny angon-drakitra rehetra dia ampitaina kely indrindra aloha.

Latch - hidy / hidy / hidy.
Rising sisiny - ny sisiny voalohany amin'ny pulse
MSB voalohany - bitika mandroso indrindra (ankavia indrindra).
ny famantaranandro data - mampita angon-drakitra misesy (bits-bit).

Ny teny famehezana dia hita matetika ao amin'ny antontan-taratasy momba ny chips ary adika amin'ny fomba isan-karazany, noho izany dia hamela ny tenako aho mba hahazoako fahalalana.

programa fanabeazana kelyNy mpamily LED dia rejistra shift amin'ny ankapobeny. "Shift" (fiovΓ na) amin'ny anarana - fihetsehan'ny angon-drakitra ao anatin'ny fitaovana: ny bitika vaovao rehetra atsofoka ao anatiny dia manosika ny rojo manontolo handroso eo anoloany. Koa satria tsy misy olona te-hijery ny fikorontanan'ny jiro LED mandritra ny fiovan'ny toetr'andro, ny dingana dia atao amin'ny rejisitra buffer misaraka amin'ny rejisitra miasa amin'ny alΓ lan'ny damper (famehezana) dia karazana efitra fiandrasana izay andaminana ny bitika araka ny filaharany. Rehefa vonona ny zava-drehetra, dia misokatra ny shutter ary mandeha miasa ny bits, manolo ny andiany teo aloha. teny famehezana Ao amin'ny antontan-taratasy ho an'ny microcircuits dia saika midika hoe damper toy izany, na inona na inona fitambarana ampiasaina.

Noho izany, ny famindrana angon-drakitra mankany amin'ny DM634 dia atao toy izao: mametraka ny fampidirana DAI amin'ny sandan'ny kely indrindra amin'ny LED lavitra, misintona DCK miakatra sy midina; apetraho amin'ny sandan'ny bit manaraka ny fampidirana DAI, sintony ny DCK; ary toy izany hatrany mandra-pamindra ny bits rehetra (miditra ao), ary avy eo dia misintona ny LAT. Azo atao amin'ny tanana izany (bit-bang), fa tsara kokoa ny mampiasa interface tsara SPI namboarina manokana ho an'ity, satria aseho amin'ny STM32 amin'ny dika roa.

Blue Pill STM32F103

Fampidirana: Ny mpanara-maso STM32 dia sarotra kokoa noho ny Atmega328 noho ny toa mampatahotra azy ireo. Ankoatra izany, noho ny antony fitsitsiana angovo, saika ny periferika rehetra dia tapaka eo am-piandohana, ary ny famantaran'ny famantaranandro dia 8 MHz avy amin'ny loharano anatiny. Soa ihany fa ny STM programmer dia nanoratra kaody izay mitondra ny chip mankany amin'ny "kajy" 72 MHz, ary ny mpanoratra ny IDE rehetra fantatro dia nampiditra izany tao amin'ny dingana fanombohana, ka tsy mila famantaranandro isika (fa azonao atao raha tena tianao). Saingy tsy maintsy averinao ny periferika.

Documentation: Blue Pill dia miaraka amin'ny chip STM32F103C8T6 malaza, misy antontan-taratasy roa ilaina amin'izany:

Ao amin'ny datasheet isika dia mety ho liana amin'ny:

  • Pinouts - chip pinouts - raha toa ka manapa-kevitra ny hanao ny boards ny tenantsika;
  • Sarintany fitadidiana - sarintany fitadidiana ho an'ny puce manokana. Ny Boky TorolΓ lana dia manana sarintany ho an'ny tsipika manontolo, ary misy rejisitra izay tsy ananantsika.
  • Tabilao Famaritana Pin - mitanisa ny asa lehibe sy hafa amin'ny tsimatra; ho an'ny "pillule manga" dia azonao atao ny mahita sary mety kokoa amin'ny Internet miaraka amin'ny lisitry ny pin sy ny asany. Noho izany, avy hatrany dia google Blue Pill pinout izahay ary mitazona ity sary ity eo am-pelatanana:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
NB: nisy lesoka teo amin'ny sary avy amin'ny Internet, izay voamarika tao amin'ny fanehoan-kevitra, misaotra anao amin'izany. Ny sary dia nosoloina, fa ity no lesona - tsara kokoa ny manamarina ny vaovao fa tsy amin'ny datasheets.

Esory ny datasheet izahay, sokafy ny Boky TorolΓ lana ary manomboka izao dia io ihany no ampiasainay.
Fomba fiasa: miatrika fampidirana / famoahana mahazatra izahay, amboary ny SPI, avereno ny periferika ilaina.

Input Output

Ao amin'ny Atmega328, ny I/O dia ampiharina amin'ny fomba tsotra, ka izany no mahatonga ny habetsahan'ny safidy STM32 mety hampisafotofoto. Famintinana ihany no ilaintsika ankehitriny, fa na dia ireto aza dia manana safidy efatra:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
tatatra mivoha, mitsoka, misintona, manosoka, tatatra mivoha

"Pull-push" (hanoto-fihoaram-) dia ny vokatra mahazatra avy amin'ny Arduino, ny pin dia afaka maka ny sanda na HIGH na LOW. Fa amin'ny "open drain" misy fahasarotana, na dia tsotra aza ny zava-drehetra eto:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Fametrahana fivoahana / rehefa voatendry ho amin'ny famoahana ny seranana: / alefa ny buffer output: / - fomba fanondrahana misokatra: "0" ao amin'ny rejisitra famoahana dia ahafahan'ny N-MOS, "1" ao amin'ny rejisitra famoahana dia miala amin'ny seranana amin'ny fomba Hi-Z ( Tsy mihetsika ny P-MOS ) / - maody push-pull: "0" ao amin'ny rejisitra famoahana dia manetsika ny N-MOS, "1" ao amin'ny rejisitra famoahana dia manetsika P-MOS.

Ny fahasamihafana rehetra eo amin'ny tatatra misokatra (tatatra misokatra) avy amin'ny "push-pull" (hanoto-fihoaram-) dia ny hoe ao amin'ny pin voalohany dia tsy afaka manaiky ny fanjakana HIGH: rehefa manoratra iray amin'ny rejisitra famoahana dia miditra amin'ny fomba fanoherana avo (impedance avo, Hi-Z). Rehefa manoratra aotra, ny pin dia mitovy amin'ny fomba roa, na lojika na elektrika.

Amin'ny fomba fiasa mahazatra, ny pin dia mandefa fotsiny ny votoatin'ny rejisitra famoahana. Ao amin'ny "alternative" dia fehezin'ny periferika mifanaraka amin'izany (jereo 9.1.4):

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Raha amboarina ho pin fampiasa hafa ny bit port, dia kilemaina ny rejisitra pin ary mifandray amin'ny pin periferika ny pin.

Fampiasa hafa ho an'ny pin tsirairay dia voalaza ao Famaritana Pin Ny datasheet dia eo amin'ny sary alaina. Ho an'ny fanontaniana ny amin'ny tokony hatao raha misy pin manana asa hafa maro, ny valiny dia omen'ny fanamarihana ambany pejy ao amin'ny datasheet:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Raha periferika maromaro no mampiasa pin mitovy, mba hisorohana ny fifandirana eo amin'ny fiasa hafa, periferika iray ihany no tokony hampiasaina amin'ny fotoana iray, avadika amin'ny fampiasana ny famantaranandro periferika azo atao (ao amin'ny rejisitra RCC mety).

Farany, manana hafainganam-pandehan'ny famantaranandro ihany koa ny tsimatra amin'ny fomba famoahana. Ity dia endri-javatra iray hafa mitsitsy angovo; amin'ny tranga misy antsika dia apetrakay ho ambony indrindra izany ary adinoy.

Noho izany: mampiasa SPI izahay, izay midika fa ny tsimatra roa (miaraka amin'ny angon-drakitra sy famantarana famantaranandro) dia tokony ho "asa fanosehana hafa", ary ny iray hafa (LAT) dia tokony ho "fanosika tsy tapaka". Saingy alohan'ny hanendrena azy ireo dia andao isika hiatrika ny SPI.

SPI

Fandaharana fanabeazana kely iray hafa

SPI na Serial Peripheral Interface (serial peripheral interface) dia interface tsotra sy tena mahomby amin'ny fampifandraisana MK amin'ny MK hafa sy ny tontolo ivelany amin'ny ankapobeny. Ny fitsipiky ny asany dia efa voalaza etsy ambony, izay momba ny mpamily LED Shinoa (ao amin'ny boky torolalana, jereo ny fizarana 25). Ny SPI dia afaka miasa amin'ny fomba master ("tompo") sy andevo ("andevo"). Ny SPI dia manana fantsona fototra efatra, izay tsy azo ampiasaina avokoa:

  • MOSI, Master Output / Slave Input: ity pin ity dia mandefa angona amin'ny maodely master, ary mandray data amin'ny fomba andevo;
  • MISO, Input Master / Output andevo: ny mifanohitra amin'izany, dia mandray ao amin'ny tompony, ary mampita ao amin'ny andevo;
  • SCK, Famantaranandro Serial: mametraka ny fatran'ny fampitana angon-drakitra ao amin'ny tompony na mandray famantarana famantaranandro ao amin'ny andevo. Amin'ny ankapobeny dia mamely beats;
  • SS, Slave Select: miaraka amin'ny fanampian'ity fantsona ity, fantatry ny andevo fa misy zavatra tadiavina aminy. Ao amin'ny STM32 dia antsoina hoe NSS, izay N = ratsy, i.e. lasa andevo ny controller raha misy tany amin'ity fantsona ity. Izy io dia mitambatra tsara amin'ny maody Open Drain Output, saingy tantara hafa izany.

Tahaka ny zavatra hafa rehetra, ny SPI amin'ny STM32 dia manankarena amin'ny fiasa, izay mahatonga azy io ho sarotra takarina. Ohatra, dia afaka miasa tsy amin'ny SPI, fa koa amin'ny I2S interface tsara, ary ao amin'ny antontan-taratasy dia mifangaro ny famaritana, dia ilaina ny manapaka ny tafahoatra amin'ny fotoana. Tsotra dia tsotra ny andraikitray: mila mandefa angon-drakitra amin'ny alΓ lan'ny MOSI sy SCK fotsiny izahay. Mandehana any amin'ny fizarana 25.3.4 (fifandraisana duplex, serasera half-duplex), izay hitantsika Famantaranandro 1 sy tariby data tokana tokana (famantarana famantaranandro 1 sy stream data tokana tokana):

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Amin'ity fomba ity, ny fampiharana dia mampiasa SPI amin'ny fomba fampitana fotsiny na mandray fotsiny. / Ny mode Transmit-only dia mitovy amin'ny mode duplex: ny angon-drakitra dia alefa amin'ny pin transmit (MOSI amin'ny mode master na MISO amin'ny mode slave), ary ny pin receive (MISO na MOSI tsirairay avy) dia azo ampiasaina ho pin I/O mahazatra. . Amin'ity tranga ity, ny fampiharana dia mila tsy miraharaha ny Rx buffer (raha vakina dia tsy hisy angon-drakitra nafindra any).

Tsara, maimaim-poana ny pin MISO, andao ampifandraiso amin'io ny famantarana LAT. Andeha hojerentsika ny Slave Select, izay ao amin'ny STM32 dia azo fehezina amin'ny programa, izay tena mety. Mamaky ny fehintsoratra mitovy anarana isika ao amin'ny fizarana 25.3.1 SPI Famaritana ankapobeny:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Ny fanaraha-maso ny rindrambaiko NSS (SSM = 1) / Ny fampahalalana momba ny fisafidianana andevo dia voarakitra ao amin'ny SSI bit amin'ny rejisitra SPI_CR1. Ny pin NSS ivelany dia mijanona maimaim-poana ho an'ny filana fampiharana hafa.

Fotoana hanoratana amin'ny rejisitra izao. Nanapa-kevitra ny hampiasa SPI2 aho, tadiavo ny adiresy fototra ao amin'ny datasheet - ao amin'ny fizarana 3.3 Memory Map:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Eny ary, andeha isika hanomboka:

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

Sokafy ny fizarana 25.3.3 miaraka amin'ny lohateny manazava tena hoe "Configuring SPI in Master Mode":

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

1. Apetraho amin'ny bits BR[2:0] ny famantaran'ny famantaranandro amin'ny SPI_CR1.

Ny rejisitra dia angonina ao amin'ny fizarana boky torolalana amin'ny anarana mitovy. Famindrana adiresy (Adiresy offset) ho an'ny CR1 - 0x00, amin'ny alΓ lan'ny default dia voadio avokoa ny bits rehetra (Avereno ny sanda 0x0000):

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Ny bits BR dia mametraka ny mpizara famantaranandro fanaraha-maso, ka mamaritra ny faharetan'ny fiasan'ny SPI. Ny fatran'ny STM32 anay dia 72 MHz, ny mpamily LED, araka ny angon-drakitra, dia miasa amin'ny matetika hatramin'ny 25 MHz, ka mila mizara efatra (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. Apetraho ny bits CPOL sy CPHA mba hamaritana ny fifandraisana misy eo amin'ny famindrana angon-drakitra sy ny famantaran'ny famantaranandro (jereo ny kisary eo amin'ny pejy 240)

Koa satria mamaky angona eto isika fa tsy mijery schematics, andeha hojerentsika akaiky ny famaritana lahatsoratra momba ny bits CPOL sy CPHA ao amin'ny pejy 704 (SPI General Description):

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Famantarana dingana sy ny polarity
Amin'ny fampiasana ny bitika CPOL sy CPHA ao amin'ny rejisitra SPI_CR1, azonao atao ny mifidy fifandraisana ara-potoana efatra. Ny bit CPOL (polarity famantaranandro) dia mifehy ny toetry ny famantaranandro rehefa tsy misy data alefa. Ity bit ity dia mifehy ny maody master sy slave. Raha averina indray ny CPOL dia ambany ny tsipìka SCK amin'ny fomba fiatoana. Raha apetraka ny bitika CPOL dia avo ny pin SCK mandritra ny fomba fiatoana.
Rehefa napetraka ny bit CPHA (faritra famantaranandro), dia ny sisiny faharoa amin'ny famantarana SCK ny strobe bitika avo lenta (milatsaka raha mazava ny CPOL, miakatra raha napetraka ny CPOL). Ny angona dia voasambotry ny fiovana faharoa amin'ny famantarana famantaranandro. Raha mazava ny bitika CPHA, ny strobe fandrika bitika avo dia ny sisiny miakatra amin'ny famantarana SCK (ny sisiny mianjera raha toa ka napetraka ny CPOL, ny sisiny miakatra raha voafafa ny CPOL). Ny angona dia voasambotra amin'ny fiovana voalohany amin'ny famantarana famantaranandro.

Rehefa avy naka an'io fahalalana io isika dia tonga amin'ny fanatsoahan-kevitra fa ny bits roa dia tsy maintsy mijanona ho zero, satria Tianay ny hijanona ho ambany ny mari-pamantarana SCK rehefa tsy ampiasaina, ary ny angon-drakitra dia ampitaina amin'ny sisiny miakatra amin'ny pulse (jereo ny sary. Rising Edge Takelaka data DM634

Teny an-dalana, eto isika dia nahita voalohany ny endri-javatra ny voambolana ao amin'ny ST datasheets: ao amin'izy ireo ny andian-teny hoe "reset ny bit ho aotra" voasoratra ao amin'izy ireo. hamerenana kely, fa tsy hanadio kely, toy ny, ohatra, Atmega.

3. Apetraho ny bit DFF mba hamaritana raha endrika 8-bit na 16-bit ny sakana angona

Naka DM16 634-bit manokana aho mba tsy hanelingelina ny fandefasana angon-drakitra PWM 12-bit, toy ny DM633. Misy dikany ny mametraka DFF ho ​​iray:

#define DFF         0x0800

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

4. Amboary ny bit LSBFIRST ao amin'ny rejisitra SPI_CR1 mba hamaritana ny endrika sakana

LSBFIRST, araka ny soso-kevitry ny anarany, dia manitsy ny fampitana amin'ny bitika kely indrindra aloha. Saingy ny DM634 dia te-hahazo angon-drakitra manomboka amin'ny kely indrindra. Noho izany, avelantsika hamerenana azy io.

5. Amin'ny fomba fiasan'ny fitaovana, raha ilaina ny fampidirana avy amin'ny pin NSS, ampiharo famantarana avo amin'ny pin NSS mandritra ny filaharan'ny famindrana byte manontolo. Ao amin'ny fomba rindrambaiko NSS, apetraho ny bits SSM sy SSI ao amin'ny rejisitra SPI_CR1. Raha ampiasaina ho vokatra ny pin NSS dia ny bit SSOE ihany no tokony apetraka.

Ampidiro SSM sy SSI hanadino ny fomba NSS hardware:

#define SSI         0x0100
#define SSM         0x0200

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

6. Ny bits MSTR sy SPE dia tsy maintsy apetraka (mijanona izy ireo raha toa ka avo ny mari-pamantarana NSS)

Raha ny marina, miaraka amin'ireto bits ireto dia manendry ny SPI ho tompon'andraikitra izahay ary mamelona azy:

#define MSTR        0x0004
#define SPE         0x0040

_SPI2_ (_SPI_CR1) |= MSTR; //SPI master
//ΠΊΠΎΠ³Π΄Π° всС Π³ΠΎΡ‚ΠΎΠ²ΠΎ, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ SPI
_SPI2_ (_SPI_CR1) |= SPE;

Namboarina ny SPI, andao hanoratra avy hatrany ireo fiasa izay mandefa bytes amin'ny mpamily. Tohizo ny famakiana 25.3.3 "Fanamboarana SPI amin'ny maodely master":

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Filaharana famindrana angona
Manomboka ny fandefasana rehefa soratana amin'ny buffer Tx ny byte iray.
Ny data byte dia ampidirina ao amin'ny rejisitra shift at mifanindran-dΓ lana fomba (avy amin'ny fiara fitateram-bahoaka anatiny) mandritra ny fandefasana ny bit voalohany, ary avy eo dia alefa any sequential MOSI pin mode, voalohany na farany bit mandroso miankina amin'ny fametrahana ny LSBFIRST bit ao amin'ny CPI_CR1 rejistra. Ny saina TXE dia napetraka aorian'ny fandefasana angon-drakitra avy amin'ny Tx buffer mankany amin'ny rejisitra shift, ary miteraka fanelingelenana ihany koa raha napetraka ny bit TXEIE ao amin'ny rejisitra CPI_CR1.

Nanasongadina teny vitsivitsy tao amin'ny fandikan-teny aho mba hisarihana ny saina amin'ny endri-javatra iray amin'ny fampiharana SPI amin'ny mpanara-maso STM. Ao amin'ny Atmega ny saina TXE (Tx Empty, Tx foana ary vonona handray angona) dia napetraka raha tsy aorian'ny nandefasana ny byte manontolo avy. Ary eto dia napetraka io saina io rehefa ampidirina ao amin'ny rejisitra fifindran'ny anatiny ny byte. Koa satria atosiky ny bits rehetra miaraka amin'ny fotoana iray (mifanitsy), ary avy eo ny angon-drakitra dia afindra tsikelikely, ny TXE dia napetraka alohan'ny handefasana tanteraka ny byte. Zava-dehibe izany satria Raha ny mpamily LED, dia mila misintona ny LAT pin rehefa avy nandefa всСх data, i.e. Ny saina TXE irery dia tsy ho ampy ho antsika.

Midika izany fa mila saina hafa isika. Andeha hojerentsika ny 25.3.7 - "Sainam-pirenena":

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
<…>
Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
saina BUSY
Ny sainan'ny BSY dia napetraka sy voafafa amin'ny fitaovana (tsy misy fiantraikany ny fanoratana azy). Ny saina BSY dia manondro ny toetry ny soson'ny fifandraisana SPI.
Mamerina izany:
rehefa vita ny famindrana (afa-tsy amin'ny maodely master raha mitohy ny famindrana)
rehefa sembana ny SPI
rehefa misy hadisoana master mode (MODF=1)
Raha tsy mitohy ny famindrana dia voafafa eo anelanelan'ny famindrana data tsirairay ny saina BSY

Okay, ity dia ho azo ampiasaina. Andeha hojerentsika ny toerana misy ny Tx buffer. Mba hanaovana izany, vakio ny "SPI Data Register":

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Bits 15:0 DR[15:0] Rejistra data
Data voaray na angon-drakitra ampitaina.
Ny rejisitry ny angona dia mizara ho buffer roa - ny iray ho an'ny fanoratana (mandefa buffer) ary ny iray ho an'ny famakiana (mandray buffer). Ny fanoratana amin'ny rejisitra data dia manoratra amin'ny Tx buffer, ary ny famakiana avy amin'ny rejistra data dia hamerina ny sanda voarakitra ao amin'ny buffer Rx.

Eny ary, ary ny rejisitry ny sata, izay ahitana ny saina TXE sy BSY:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Manoratra izahay:

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

Eny, satria mila mamindra in-16 in-droa bytes isika, araka ny isan'ny famoahana mpamily LED, toy izao:

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

Saingy mbola tsy haintsika ny misintona ny pin LAT, ka hiverina amin'ny I/O isika.

Fanendrena tsimatra

Ao amin'ny STM32F1, ny rejisitra tompon'andraikitra amin'ny toetry ny tsimatra dia tsy mahazatra. Mazava fa betsaka kokoa noho ny Atmega izy ireo, saingy tsy mitovy amin'ny puce STM hafa. Fizarana 9.1 Famaritana ankapobeny momba ny GPIO:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Ny tsirairay amin'ireo port I/O tanjona ankapobeny (GPIO) manana rejisitra fanamafisana 32-bit roa (GPIOx_CRL sy GPIOx_CRH), rejistra data 32-bit roa (GPIOx_IDR sy GPIOx_ODR), rejisitra 32-bit / reset (GPIOx_BSRR), rejisitra reset 16-bit (GPIOx_BRR) ary 32- rejisitra fanakanana bit (GPIOx_LCKR).

Ny rejisitra roa voalohany dia tsy mahazatra, ary tsy dia mahasosotra ihany koa, satria miparitaka manerana azy ireo amin'ny endrika "bits efatra isaky ny rahalahy" ny tsipika port 16. Ireo. Ny pin zero hatramin'ny fito dia ao amin'ny CRL, ary ny ambiny dia ao amin'ny CRH. Mandritra izany fotoana izany, ny rejisitra sisa tavela dia mirakitra soa aman-tsara ny bitika rehetra amin'ny seranan-tsambo - matetika ny antsasany sisa dia "voatokana".

Ho fanatsorana, andeha isika hanomboka amin'ny faran'ny lisitra.

Tsy mila rejisitra fanakanana izahay.

Ny rejisitra napetraka sy ny famerenana dia tena mampihomehy satria mifamatotra amin'ny ampahany izy ireo: afaka manoratra ny zava-drehetra ao amin'ny BSRR ianao, izay ny bits 16 ambony dia hamerina ny pin ho aotra, ary ny ambany dia apetraka amin'ny 1, na azonao atao koa. Ampiasao ny BRR, ny bits 16 ambany izay mamerina ny pin. Tiako ilay safidy faharoa. Zava-dehibe ireo rejistra ireo satria manome fidirana atomika amin'ny pin:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Atomic Set na Reset
Tsy ilaina ny manafoana ny fiatoana rehefa manao fandaharana GPIOx_ODR amin'ny ambaratonga bit: bit iray na maromaro azo ovaina amin'ny asa fanoratana atomika tokana APB2. Izany dia vita amin'ny fanoratana "1" amin'ny rejisitra napetraka / famerenana (GPIOx_BSRR na, ho an'ny famerenana ihany, GPIOx_BRR) amin'ny bit izay mila ovaina. Ny bits hafa dia hijanona tsy hiova.

Ny rejistra data dia manana anarana manazava tena - IDR = fahan'ny Direction Register, fisoratana anarana fidirana; ODR = Fivoahana Direction Register, rejisitra mivoaka. Tsy mila azy ireo izahay amin'ny tetikasa ankehitriny.

Ary farany, ny rejisitra mifehy. Koa satria liana amin'ny tsipika SPI faharoa izahay, dia ny PB13, PB14 ary PB15, dia mijery avy hatrany ny CRH izahay:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Ary hitantsika fa mila manoratra zavatra amin'ny bits 20 ka hatramin'ny 31 isika.

Efa nofaritana etsy ambony izay tadiavintsika amin'ny pins, ka eto aho dia hanao tsy misy pikantsary, holazaiko fotsiny fa ny MODE dia mamaritra ny tari-dalana (fampidirana raha apetraka amin'ny 0 ny bits roa) ary ny hafainganam-pandehan'ny pin (mila 50MHz isika, i.e. samy pin amin'ny "1"), ary ny CNF dia mametraka ny maody: mahazatra "push-pull" - 00, "alternative" - ​​10. Amin'ny alΓ lan'ny default, araka ny hitantsika etsy ambony, ny pins rehetra dia manana bit fahatelo avy any ambany (CNF0), izany no mametraka azy ireo ho maodely fidirana mitsingevana.

Satria mikasa ny hanao zavatra hafa amin'ity chip ity aho, ho an'ny fahatsorana dia nofaritako ny sanda MODE sy CNF mety ho an'ny rejisitra ambany sy ambony.

Toy izany koa

#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

Ny pin dia hita ao amin'ny seranan-tsambo B (adiresy fototra - 0x40010C00), kaody:

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

Ary, araka izany, dia azonao atao ny manoratra famaritana ho an'ny LAT, izay hikorontana amin'ny rejisitra BRR sy 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 fotsiny amin'ny inertia, efa toy izany foana, avelao hijanona)

Ankehitriny dia tsara ny zava-drehetra, saingy tsy mandeha izany. Satria STM32 ity, mitsitsy herinaratra izy ireo, izay midika fa mila mamela ny famantaranandro ny periferika ilaina ianao.

Alefaso ny famantaranandro

Ny famantaranandro, antsoina koa hoe Clock, dia tompon'andraikitra amin'ny famantaranandro. Ary efa hitantsika ny fanafohezana RCC. Mitady izany izahay ao amin'ny antontan-taratasy: Reset sy Clock Control.

Araka ny voalaza tetsy ambony, soa ihany fa ny ampahany sarotra indrindra amin'ny lohahevitra momba ny famantaranandro dia nataon'ny olona avy amin'ny STM ho antsika, izay isaoranay azy ireo (indray mandeha aho hanome rohy mankany Ny tranokalan'i Di Halt, mba hanazavana ny maha-safotofoto azy). Mila rejisitra tompon'andraikitra amin'ny fampandehanana ny famantaranandro periferika (Famantaranandro Periferika Enable Registers). Voalohany, andeha hojerentsika ny adiresy fototry ny RCC, dia eo am-piandohan'ny "Sarintany fahatsiarovana" izany:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

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

Ary avy eo dia tsindrio ny rohy izay iezahanao hahita zavatra ao amin'ny takelaka, na, tsara kokoa, mandehana amin'ny famaritana ireo rejisitra afaka avy amin'ny fizarana momba ny avelao ny rejisitra. Aiza no hahitantsika RCC_APB1ENR sy RCC_APB2ENR:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Ary izy ireo, araka izany, dia misy bits izay ahitana ny famantaranandro ny SPI2, IOPB (I/O Port B) ary ny fiasa hafa (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;

Ny kaody farany dia azo jerena eto.

Raha manana fahafahana sy faniriana hanao fitsapana ianao, dia ampifandraiso amin'ny DM634 toy izao: DAI mankany PB15, DCK mankany PB13, LAT mankany PB14. Manome hery ny mpamily amin'ny 5 volts izahay, aza adino ny mampifandray ny tany.

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

STM8 PWM

PWM amin'ny STM8

Raha vao nanomana ity lahatsoratra ity aho, dia nanapa-kevitra, ohatra, ny hanandrana hifehy ny sasany amin'ny fampiasa amin'ny chip tsy mahazatra amin'ny fampiasana takelaka fotsiny, mba tsy hiafarako amin'ny mpanao kiraro tsy misy kiraro. Ny STM8 dia mety amin'ity andraikitra ity: voalohany, nanana boards sinoa roa aho miaraka amin'ny STM8S103, ary faharoa, tsy dia malaza loatra, ary noho izany ny fakam-panahy hamaky sy hitady vahaolana amin'ny Internet dia miankina amin'ny tsy fisian'ireo vahaolana ireo.

Misy koa ny chip Takela-daza ΠΈ Takelaka data RM0016, ao amin'ny voalohany dia misy adiresy pinout sy misoratra anarana, ao amin'ny faharoa - ny zavatra hafa rehetra. STM8 dia programa amin'ny C amin'ny IDE mahatsiravina ST Visual Develop.

Famantaranandro sy I/O

Amin'ny alΓ lan'ny default, ny STM8 dia miasa amin'ny matetika 2 MHz, tsy maintsy ahitsy avy hatrany izany.

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
HSI (Haingam-pandeha ambony anatiny) famantaranandro
Ny famantarana famantaranandro HSI dia avy amin'ny oscillator RC 16 MHz anatiny miaraka amin'ny fisarahana azo zahana (1 hatramin'ny 8). Izy io dia napetraka ao amin'ny rejisitra mpizara famantaranandro (CLK_CKDIVR).
Fanamarihana: eo am-piandohana, ny HSI RC oscillator miaraka amin'ny divider 8 dia nofantenana ho loharano voalohany amin'ny famantarana famantaranandro.

Hitanay ny adiresy rejisitra ao amin'ny datasheet, ny famaritana ao amin'ny refman ary mahita fa mila esorina ny rejisitra:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Koa satria handeha amin'ny PWM isika ary hampifandray ny LED, andeha hojerentsika ny pinout:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Ny puce dia kely, asa maro no mihantona amin'ny tsimatra mitovy. Ny ao anatin'ny fononteny efajoro dia "fampiasana hafa", novaina tamin'ny "bytes safidy" (safidy bytes) - zavatra toy ny Atmega fuses. Azonao atao ny manova ny soatoaviny amin'ny programa, saingy tsy ilaina izany, satria Ny fampiasa vaovao dia alefa aorian'ny famerenana indray. Mora kokoa ny mampiasa ST Visual Programmer (alaina miaraka amin'ny Visual Develop), izay afaka manova ireo bytes ireo. Ny pinout dia mampiseho fa ny tsipìka CH1 sy CH2 amin'ny fameram-potoana voalohany dia miafina ao anaty fonon-joro efamira; Ilaina ny mametraka ny bits AFR1 sy AFR0 ao amin'ny STVP, ary ny faharoa dia hamindra ny output CH1 amin'ny fameram-potoana faharoa avy amin'ny PD4 mankany PC5.

Noho izany, pin 6 no hifehy ny LED: PC6, PC7 ary PC3 ho an'ny fameram-potoana voalohany, PC5, PD3 ary PA3 ho an'ny faharoa.

Ny fametrahana ny tsipika I/O amin'ny STM8 dia tsotra sy mitombina kokoa noho ny amin'ny STM32:

  • mahazatra avy amin'ny rejisitry ny torolΓ lana momba ny angona DDR Atmega (Data Direction Register): 1 = vokatra;
  • ny rejisitra fanaraha-maso voalohany CR1, rehefa mivoaka, dia mametraka ny fomba fanosehana (1) na tatatra misokatra (0); satria mampifandray ny LED amin'ny puce miaraka amin'ny cathodes aho, dia mamela aotra eto aho;
  • ny rejisitry ny fanaraha-maso faharoa CR2, rehefa mivoaka, dia mametraka ny hafainganam-pandehan'ny famantaranandro: 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

Fametrahana PWM

Voalohany, andeha hofaritana ny teny:

  • Frequency PWM - matetika misy ny fameram-potoana;
  • Auto-reload, AR - sanda azo entina mandeha ho azy izay hanisa ny fameram-potoana (vanim-potoana pulse);
  • Fanavaozana hetsika, UEV - fisehoan-javatra mitranga rehefa nanisa ho AR ny fameram-potoana;
  • PWM Adidy Cycle - tsingerin'ny adidy PWM, matetika antsoina hoe "adidy adidy";
  • MakΓ  / Ampitahao ny sanda - sanda ho an'ny fisamborana / fampitahana, izay nanisa ny fameram-potoana hanao zavatra (raha ny PWM dia mamadika ny famantarana mivoaka);
  • Vidiny mialoha – sanda efa nomanina. Ampitahao ny sanda dia tsy afaka miova raha mikitika ny fameram-potoana, raha tsy izany dia tapaka ny tsingerin'ny PWM. Noho izany, ny soatoavina ampitaina vaovao dia apetraka ao anaty buffer ary esorina rehefa tonga amin'ny faran'ny fanisana ny fameram-potoana ary averina indray;
  • Ahitsio sisiny ΠΈ maody mirindra afovoany - fampifanarahana manamorona ny sisintany sy eo afovoany, mitovy amin'ny an'i Atmel PWM haingana ΠΈ Phase-correct PWM.
  • OCiREF, Output Compare Reference Signal - famantarana famantarana mivoaka, raha ny marina, izay miseho amin'ny pin mifanaraka amin'ny fomba PWM.

Araka ny efa mazava avy amin'ny pinout, roa timers manana PWM fahaiza-manao - ny voalohany sy ny faharoa. Samy 16-bit, ny voalohany dia manana endri-javatra fanampiny be dia be (indrindra fa afaka manisa na miakatra sy midina). Mila miara-miasa isika roa, ka nanapa-kevitra ny hanomboka amin'ny faharoa mazava kokoa aho, mba tsy hampiasana zavatra tsy misy ao. Ny olana sasany dia ny famaritana ny fiasan'ny PWM amin'ny timer rehetra ao amin'ny boky torolalana dia ao amin'ny toko momba ny fameram-potoana voalohany (17.5.7 PWM Mode), noho izany dia tsy maintsy mitsambikina miverimberina manerana ny antontan-taratasy ianao amin'ny fotoana rehetra.

PWM amin'ny STM8 dia manana tombony lehibe amin'ny PWM amin'ny Atmega:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Boundary Aligned PWM
Configuration kaonty avy any ambany ka hatrany ambony
Mavitrika ny fanisana ambany raha voafafa ny bit DIR ao amin'ny rejisitra TIM_CR1
ohatra
Ny ohatra dia mampiasa ny fomba PWM voalohany. Ny mari-pamantarana fanondroan'ny PWM OCiREF dia avo lenta raha TIM1_CNT <TIM1_CCRi. Raha tsy izany dia mila ambaratonga ambany. Raha lehibe noho ny sandan'ny autoload (TIM1_ARR rejisitry ny fampitahana ao amin'ny rejisitra TIM1_CCRi), dia atao amin'ny 1 ny famantarana OCiREF. Raha 0 ny sandan'ny fampitahana, dia aotra ny OCiREF....

STM8 famerana mandritra ny fanavaozana hetsika manamarina aloha mampitaha sanda, ary avy eo dia mamoaka famantarana famantarana. Ny fameram-potoana an'ny Atmega dia mivadika voalohany ary avy eo mampitaha, ka miteraka compare value == 0 ny vokatra dia fanjaitra, izay tsy maintsy atao amin'ny fomba ahoana (ohatra, amin'ny alΓ lan'ny famadihana ny lojika amin'ny programa).

Ka inona no tiantsika hatao: 8-bit PWM (AR == 255), manisa avy any ambany ka hatrany ambony, mifanitsy amin'ny sisin-tany. Satria ny takamoa dia mifandray amin'ny puce amin'ny alalan'ny cathodes, ny PWM dia tokony hamoaka 0 (LED) mandra- mampitaha sanda ary 1 apr.

Efa namaky momba ny sasany isika Maody PWM, noho izany dia mahita ny rejisitra ilaina amin'ny fameram-potoana faharoa isika amin'ny alalan'ny fikarohana ao amin'ny boky torolalana momba ity andian-teny ity (18.6.8 - TIMx_CCMR1):

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
110: Fomba PWM voalohany – rehefa manisa avy any ambany ka hatrany ambony, dia mavitrika ny fantsona voalohany raha TIMx_CNT <TIMx_CCR1. Raha tsy izany dia tsy miasa ny fantsona voalohany. [ao amin'ny antontan-taratasy fanampiny dia misy kopia-mametaka diso avy amin'ny fameram-potoana 1] 111: Fomba PWM faharoa – rehefa manisa avy any ambany ka hatrany ambony dia tsy mihetsika ny fantsona voalohany raha TIMx_CNT < TIMx_CCR1. Raha tsy izany dia mavitrika ny fantsona voalohany.

Satria ny LED dia mifandray amin'ny MK amin'ny cathodes, ny fomba faharoa dia mety amintsika (ny voalohany ihany koa, saingy mbola tsy fantatsika izany).

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Bit 3 OC1PE: Alefaso aloha ny pin 1
0: Tsy mandeha ny rejisitra mialoha ny TIMx_CCR1. Afaka manoratra amin'ny TIMx_CCR1 ianao amin'ny fotoana rehetra. Miasa avy hatrany ny sanda vaovao.
1: Misokatra ny rejisitra mialoha ny TIMx_CCR1. Ny asa mamaky/manoratra dia miditra amin'ny rejisitra mialoha. Ny sanda TIMx_CCR1 efa voaloa mialoha dia ampidirina ao amin'ny rejisitra aloka mandritra ny hetsika fanavaozana tsirairay.
* Fanamarihana: Mba hiasa araka ny tokony ho izy ny maody PWM dia tsy maintsy alefa ny rejisitra mialoha. Tsy ilaina izany amin'ny fomba famantarana tokana (ny OPM dia napetraka ao amin'ny rejisitra TIMx_CR1).

Eny ary, andao velomina daholo izay ilaintsika amin'ireo fantsona telo amin'ny fameram-potoana faharoa:

#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 dia misy rejisitra valo bit roa, tsotra ny zava-drehetra:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Ny fameram-potoana faharoa dia tsy afaka manisa afa-tsy avy any ambany ka hatrany ambony, fampifanarahana amin'ny sisin-tany, tsy misy tokony hovana. Aleo apetraka amin'ny 256 ohatra ny mpanelanelana matetika. Ho an'ny fameram-potoana faharoa dia napetraka ao amin'ny rejisitra TIM2_PSCR ny mpizara ary manana hery roa:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Ny hany sisa tavela dia ny mamadika ny fehin-kevitra sy ny fameram-potoana faharoa. Ny olana voalohany dia voavaha amin'ny alΓ lan'ny rejisitra Alaivo/Ampitahao Tadiavo: misy fantsona roa, telo miparitaka manerana azy ireo tsy misy fotony. Eto isika dia afaka mianatra ihany koa fa azo atao ny manova ny polarity ny famantarana, i.e. Amin'ny ankapobeny, azo atao ny mampiasa PWM Mode 1. Manoratra izahay:

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

Ary farany, manomboka ny fameram-potoana ao amin'ny rejisitra TIMx_CR1:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Andao hanoratra analogue tsotra AnalogWrite(), izay hamindra ny tena sanda amin'ny fameram-potoana ho fampitahana. Ny rejistra dia nomena anarana azo antoka Misambotra / mampitaha rejisitra, misy roa amin'izy ireo ho an'ny fantsona tsirairay: ny bits 8 ambany ambany ao amin'ny TIM2_CCRxL ary ny ambony ao amin'ny TIM2_CCRxH. Satria namorona PWM 8-bit izahay, dia ampy ny manoratra ny bitika kely indrindra:

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

Ny mpamaky mahay dia hahatsikaritra fa manana PWM misy tsininy kely isika, tsy mahavita mameno 100% (amin'ny sanda ambony indrindra amin'ny 255, ny famantarana dia mivadika amin'ny tsingerin'ny fameram-potoana iray). Ho an'ny LED dia tsy maninona izany, ary ny mpamaky mahay dia afaka maminavina ny fomba hanamboarana azy.

Ny PWM amin'ny fameram-potoana faharoa dia miasa, andao hiroso amin'ny voalohany.

Ny fameram-potoana voalohany dia manana bitika mitovy amin'ny rejisitra iray ihany (fa ireo bitika mbola "voatokana" ao amin'ny fameram-potoana faharoa dia ampiasaina amin'ny voalohany ho an'ny karazana zavatra mandroso rehetra). Noho izany dia ampy ny mahita ny adiresin'ny rejisitra mitovy amin'ny datasheet ary mandika ny code. Eny, ovay ny sandan'ny mpizara matetika, satria... Ny fameram-potoana voalohany dia tsy te hahazo hery roa, fa sanda 16-bit marina amin'ny rejisitra roa Prescaler High ΠΈ Low. Manao ny zava-drehetra izahay ary... tsy mandeha ny fotoana voalohany. Inona no olana?

Ny olana dia tsy misy afa-tsy amin'ny fijerena ny fizarana manontolo momba ny rejisitra fanaraha-maso ny fameram-potoana 1, izay itadiavantsika ilay iray izay tsy ananan'ny fameram-potoana faharoa. Hisy 17.7.30 fisoratana anarana fiatoana (TIM1_BKR), aiza no misy an'ity bit ity:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Alefaso ny vokatra fototra

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Izany ihany no azo antoka izao, ny kaody Ery.

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

STM8 Multiplex

Multiplexing amin'ny STM8

Ny tetikasa mini fahatelo dia ny mampifandray ireo LED RGB valo amin'ny fameram-potoana faharoa amin'ny fomba PWM ary mampiseho loko samihafa. Izy io dia mifototra amin'ny foto-kevitra momba ny LED multiplexing, izany hoe raha mamono sy mamono ny LED haingana dia haingana ianao, dia ho hitantsika fa mandeha foana izy ireo (fikirizan'ny fahitana, inertia ny fahitana maso). Nanao izany aho indray mandeha zavatra toy izany amin'ny Arduino.

Ny algorithm amin'ny asa dia toy izao manaraka izao:

  • mampifandray ny anode ny RGB LED voalohany;
  • nandrehitra azy, mandefa ny famantarana ilaina amin'ny cathodes;
  • niandry hatramin'ny faran'ny tsingerin'ny PWM;
  • mampifandray ny anode ny faharoa RGB LED;
  • nandrehitra azy...

Eny, sns. Mazava ho azy, ho an'ny asa tsara dia ilaina ny mampifandray ny anode ary ny LED dia "mirehitra" amin'ny fotoana iray ihany. Eny, na saika. Na ahoana na ahoana, dia mila manoratra fehezan-dalΓ na izay hamoaka soatoavina amin'ny fantsona telo amin'ny fameram-potoana faharoa, hanova azy ireo rehefa tonga ny UEV, ary hanova ny LED RGB mavitrika amin'izao fotoana izao.

Koa satria mandeha ho azy ny fifindran'ny LED, dia mila mamorona "fahatsiarovana video" izay hahazoan'ny mpandrindra ny interrupt angon-drakitra. Ity dia array tsotra:

uint8_t colors[8][3];

Mba hanovana ny lokon'ny LED manokana dia ampy ny manoratra ny soatoavina ilaina amin'ity array ity. Ary ny variable dia ho tompon'andraikitra amin'ny isan'ny LED mavitrika

uint8_t cnt;

Demux

Ho an'ny multiplexing mety dia mila demultiplexer CD74HC238 isika. Demultiplexer - chip izay mampihatra ny mpandraharaha amin'ny fitaovana <<. Amin'ny alalan'ny pins telo (bits 0, 1 ary 2) dia mamahana azy amin'ny isa telo-bit X izahay, ary ho setrin'izany dia manetsika ny isa mivoaka (1<<X). Ny sisa tavela amin'ny puce dia ampiasaina hanesorana ny famolavolana manontolo. Ilaintsika ity puce ity mba hampihenana ny isan'ny tsimatra misy ny microcontroller, fa koa ho an'ny fiarovana - mba tsy hivezivezy tsy nahy ny LED bebe kokoa noho izay azo atao ary tsy handoro ny MK. Ny puce dia mitentina denaria iray ary tokony hotehirizina ao amin'ny kabinetra fanafody ao an-tranonao foana.

Ny CD74HC238 dia ho tompon'andraikitra amin'ny famatsiana herinaratra amin'ny anode ny LED tiana. Ao amin'ny multiplex feno dia manome voltora amin'ny tsanganana amin'ny alΓ lan'ny P-MOSFET, fa amin'ity demo ity dia azo atao mivantana, satria dia misintona 20 mA, araka ny naoty ambony indrindra amin'ny datasheet. From Takelaka data CD74HC238M mila pinouts sy ity taratasy fitaka ity izahay:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
H = ambaratonga avo lenta, L = ambaratonga ambany, X - aza miraharaha

Mampifandray ny E2 sy E1 amin'ny tany izahay, E3, A0, A1 ary A3 amin'ny pin PD5, PC3, PC4 ary PC5 amin'ny STM8. Koa satria ny latabatra etsy ambony dia misy ambaratonga ambany sy avo, dia amboarinay ho toy ny tsimatra fanosehana ireo tsimatra ireo.

PWM

Ny PWM amin'ny fameram-potoana faharoa dia amboarina amin'ny fomba mitovy amin'ny tantara teo aloha, misy fahasamihafana roa:

Voalohany, mila mamela ny fahatapahana isika Fanavaozana hetsika (UEV) izay hiantso fiasa izay manova ny LED mavitrika. Izany dia atao amin'ny fanovana ny bit Update Interrupt Enable amin'ny rejisitra misy anarana milaza

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
Ampidiro ny fisoratana anarana

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Ny fahasamihafana faharoa dia mifandraika amin'ny trangan'ny multiplexing, toy ny ghosting - famirapiratan'ny diode parasy. Amin'ny toe-javatra misy antsika, dia mety hitranga izany noho ny zava-misy fa ny fameram-potoana, izay nahatonga ny fahatapahana amin'ny UEV, dia mitohy manitikitika, ary tsy manam-potoana hanovana ny LED alohan'ny hanombohan'ny fameram-potoana hanoratra zavatra amin'ny tsimatra ny mpandrindra ny interrupt. Mba hiadiana amin'izany dia tsy maintsy mamadika ny lojika ianao (0 = famirapiratana ambony indrindra, 255 = tsy misy jiro) ary misoroka ny sandan'ny tsingerin'ny adidy tafahoatra. Ireo. ho azo antoka fa aorian'ny UEV dia mivoaka tanteraka ny LED mandritra ny tsingerin'ny PWM iray.

Manova ny polarity:

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

Aza mametraka r, g ary b amin'ny 255 ary tadidio ny mamadika azy ireo rehefa mampiasa azy ireo.

ka miato

Ny fototry ny interrupt dia ny hoe ao anatin'ny toe-javatra sasany dia mijanona amin'ny fanatanterahana ny programa fototra ny chip ary miantso asa ivelany. Mitranga ny fahatapahana noho ny fitaomana ivelany na anatiny, anisan'izany ny fameram-potoana.

Tamin'ny voalohany namorona tetikasa tao amin'ny ST Visual Develop, ankoatra ny main.c nahazo varavarankely misy rakitra mistery izahay stm8_interrupt_vector.c, tafiditra hoazy ao anatin'ilay tetikasa. Amin'ity rakitra ity dia misy asa omena ho an'ny interrupt tsirairay NonHandledInterrupt. Mila mamatotra ny asantsika amin'ny fiatoana tiana isika.

Ny datasheet dia misy tabilao misy vΓ©ctor interrupt, izay ahitantsika izay ilaintsika:

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8
13 TIM2 fanavaozana/mihoatra
14 TIM2 fisamborana/hampitaha

Mila manova ny LED amin'ny UEV isika, noho izany dia mila manapaka ny #13.

Noho izany, voalohany indrindra, ao amin'ny rakitra stm8_interrupt_vector.c ovay ho anao manokana ny anaran'ny asa miandraikitra ny fanelingelenana No. 13 (IRQ13):

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

Faharoa, tsy maintsy mamorona rakitra isika main.h miaraka amin'ireto votoaty manaraka ireto:

#ifndef __MAIN_H
#define __MAIN_H

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

Ary farany, soraty amin'ny findainao ity fiasa ity 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;
}

Ny hany sisa tavela dia ny mamela ny fahatapahana. Izany dia atao amin'ny fampiasana ny baiko assembler rim - tsy maintsy mitady izany ianao Boky TorolΓ lana momba ny programa:

//enable interrupts
_asm("rim");

Ny baiko assembler iray hafa dia sim – mamono ny fiatoana. Tsy maintsy vonoina izy ireo raha soratana ao amin'ny "fahatsiarovana horonan-tsary" ny soatoavina vaovao, mba tsy hanimba ny array ny fahatapahana nateraky ny fotoana tsy mety.

Kaody rehetra - amin'ny GitHub.

Famakiana Takelaka data 2: SPI amin'ny STM32; PWM, fameram-potoana ary fiatoana amin'ny STM8

Raha farafaharatsiny misy olona mahita ity lahatsoratra ity ho mahasoa, dia tsy nanoratra izany aho. Ho faly aho handray fanehoan-kevitra sy fanamarihana, hiezaka hamaly ny zava-drehetra aho.

Source: www.habr.com

Add a comment