Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

В ang una nga bahin Gisulayan nako nga isulti ang hobby electronics engineers nga nagdako gikan sa Arduino pants kung giunsa ug ngano nga kinahanglan nila basahon ang mga datasheet ug uban pang dokumentasyon alang sa mga microcontroller. Ang teksto nahimong dako, busa misaad ako nga magpakitag praktikal nga mga pananglitan sa usa ka separadong artikulo. Aw, gitawag niya ang iyang kaugalingon nga milk mushroom...

Karon ipakita ko kanimo kung giunsa ang paggamit sa mga datasheet aron masulbad ang yano, apan kinahanglan alang sa daghang mga proyekto, mga buluhaton sa STM32 (Blue Pill) ug mga controller sa STM8. Ang tanan nga mga proyekto sa demo gipahinungod sa akong paborito nga mga LED, kami magadagkot kanila sa daghang gidaghanon, diin kinahanglan namon nga gamiton ang tanan nga mga lahi sa makapaikag nga mga peripheral.

Ang teksto pag-usab nahimo nga dako, mao nga alang sa kasayon ​​ako sa paghimo sa sulod:

STM32 Blue Pill: 16 LEDs nga adunay driver sa DM634
STM8: Pag-set up og unom ka PWM pin
STM8: 8 RGB LEDs sa tulo ka mga lagdok, interrupts

Disclaimer: Dili ako usa ka engineer, wala ko magpakaaron-ingnon nga adunay lawom nga kahibalo sa electronics, ang artikulo gituyo alang sa mga amateurs sama kanako. Sa pagkatinuod, giisip nako ang akong kaugalingon duha ka tuig na ang milabay isip target audience. Kung adunay usa nga nagsulti kanako kaniadto nga ang mga datasheet sa usa ka dili pamilyar nga chip dili makahadlok nga basahon, dili unta ako mogugol ug daghang oras sa pagpangita sa pipila ka mga piraso sa code sa Internet ug pag-imbento sa mga saklay nga adunay gunting ug adhesive tape.

Ang pokus sa kini nga artikulo mao ang mga datasheet, dili mga proyekto, aron ang code mahimong dili kaayo hapsay ug kanunay nga hagip-ot. Ang mga proyekto mismo yano ra kaayo, bisan kung angay alang sa usa ka una nga kaila sa bag-ong chip.

Nanghinaut ko nga ang akong artikulo makatabang sa usa ka tawo sa susamang yugto sa pagpaunlod sa kalingawan.

STM32

16 LEDs nga adunay DM634 ug SPI

Usa ka gamay nga proyekto gamit ang Blue Pill (STM32F103C8T6) ug DM634 LED driver. Gamit ang mga datasheet, mahibal-an namon ang drayber, mga pantalan sa STM IO ug i-configure ang SPI.

DM634

Ang Taiwanese chip nga adunay 16 16-bit PWM outputs, mahimong konektado sa mga kadena. Ang low-end nga 12-bit nga modelo nahibal-an gikan sa usa ka domestic nga proyekto Lightpack. Sa usa ka higayon, nagpili tali sa DM63x ug sa bantog nga TLC5940, gipili nako ang DM sa daghang mga hinungdan: 1) TLC sa Aliexpress siguradong peke, apan kini dili; 2) DM adunay usa ka autonomous PWM uban sa iyang kaugalingon nga frequency generator; 3) kini mahimong mapalit nga dili mahal sa Moscow, imbes nga maghulat alang sa usa ka parsela gikan sa Ali. Ug, siyempre, makapaikag nga mahibal-an kung giunsa ang pagkontrol sa chip sa imong kaugalingon, imbes nga mogamit usa ka andam nga librarya. Ang mga chips karon nag-una nga gipresentar sa SSOP24 nga pakete; kini dali nga magbaligya sa usa ka adapter.

Tungod kay Taiwanese ang tiggama, datasheet ang chip gisulat sa Chinese English, nga nagpasabot nga kini makalingaw. Una atong tan-awon ang pinout (Koneksyon sa Pin) aron masabtan kung unsang paa ang ikonektar kung unsa, ug usa ka paghulagway sa mga lagdok (Paglaraw sa Pin). 16 ka mga pin:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Mga Tinubdan sa DC Sink (Open Drain)

Paghilum / Open-drain nga output - habwaon; tinubdan sa inflowing kasamtangan; ang output konektado sa yuta sa aktibo nga estado - ang mga LED konektado sa drayber pinaagi sa mga cathodes. Sa elektrisidad, kini, siyempre, dili usa ka "bukas nga kanal" (bukas nga kanal), apan sa mga datasheet kini nga pagtawag alang sa mga lagdok sa drain mode sagad makita.

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Ang mga eksternal nga resistor tali sa REXT ug GND aron itakda ang karon nga kantidad sa output

Usa ka reperensiya nga resistor ang gibutang taliwala sa REXT pin ug yuta, nga nagkontrol sa internal nga pagsukol sa mga output, tan-awa ang graph sa panid 9 sa datasheet. Sa DM634, kini nga pagsukol mahimo usab nga kontrolado sa software, nga nagtakda sa kinatibuk-ang kahayag (global nga kahayag); Dili ko moadto sa mga detalye sa kini nga artikulo, magbutang lang ako usa ka 2.2 - 3 kOhm resistor dinhi.

Aron masabtan kung unsaon pagkontrol sa chip, atong tan-awon ang paghulagway sa interface sa device:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Oo, ania kini, Intsik nga English sa tanan nga himaya niini. Ang paghubad niini usa ka problema, mahimo nimong masabtan kung gusto nimo, apan adunay lain nga paagi - tan-awa kung giunsa ang koneksyon sa parehas nga function nga TLC5940 gihulagway sa datasheet:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
... Tulo lang ka mga pin ang gikinahanglan aron makasulod sa data ngadto sa device. Ang pagtaas sa ngilit sa SCLK signal nagbalhin sa datos gikan sa SIN pin ngadto sa internal nga rehistro. Human makarga ang tanang datos, ang usa ka mubo nga taas nga XLAT signal nagtak-op sa sunodsunod nga gibalhin nga datos ngadto sa internal nga mga rehistro. Ang mga internal nga rehistro mao ang mga ganghaan nga na-trigger sa lebel sa signal sa XLAT. Ang tanan nga datos gipasa una sa labing hinungdanon nga gamay.

Latch - trangka / trangka / trangka.
Nagtaas nga ngilit - nag-unang ngilit sa pulso
MSB una – labing mahinungdanon (labing wala) bit forward.
sa data sa orasan - Pagpadala sa datos nga sunud-sunod (gamay).

Ang pulong trangka kanunay nga makit-an sa dokumentasyon alang sa mga chips ug gihubad sa lainlaing mga paagi, busa alang sa pagsabut tugutan nako ang akong kaugalingon

gamay nga programa sa edukasyonAng drayber sa LED usa ka rehistro sa pagbalhin. "Pagbalhin" (pagbalhin) sa ngalan - bitwise nga paglihok sa datos sulod sa device: ang matag bag-ong bit nga giduso sa sulod moduso sa tibuok kadena sa unahan niini. Tungod kay walay usa nga gusto nga mag-obserbar sa gubot nga pagkidlap sa mga LED sa panahon sa pagbalhin, ang proseso mahitabo sa mga buffer register nga gibulag gikan sa nagtrabaho nga mga rehistro pinaagi sa usa ka damper (trangka) mao ang usa ka matang sa lawak hulatanan diin ang mga piraso gihan-ay sa gitinguha nga han-ay. Sa diha nga ang tanan andam na, ang shutter moabli ug ang mga piraso moadto sa pagtrabaho, pag-ilis sa miaging batch. Pulong trangka sa dokumentasyon alang sa microcircuits hapit kanunay nagpasabot sa maong usa ka damper, bisan unsa nga kombinasyon kini gigamit.

Busa, ang pagbalhin sa data ngadto sa DM634 gihimo sama niini: ibutang ang DAI input sa bili sa labing mahinungdanon nga bit sa layo nga LED, ibira ang DCK pataas ug paubos; ibutang ang DAI input sa bili sa sunod nga bit, kuhaa ang DCK; ug uban pa hangtod ang tanan nga mga bit napasa (nag-oras), pagkahuman gibira namon ang LAT. Mahimo kini nga mano-mano (gamay-bang), apan mas maayo nga gamiton ang interface sa SPI nga espesyal nga gipahaum alang niini, tungod kay gipresentar kini sa among STM32 sa duha ka kopya.

Asul nga Pill STM32F103

Pasiuna: Ang mga tigkontrol sa STM32 labi ka komplikado kaysa sa Atmega328 kaysa kini daw makahadlok. Dugang pa, alang sa mga hinungdan sa pagdaginot sa enerhiya, hapit tanan nga mga peripheral gipalong sa pagsugod, ug ang frequency sa orasan mao ang 8 MHz gikan sa internal nga gigikanan. Maayo na lang, ang mga programmer sa STM nagsulat og code nga nagdala sa chip ngadto sa "kalkulado" nga 72 MHz, ug ang mga tagsulat sa tanan nga mga IDE nga akong nahibal-an naglakip niini sa pamaagi sa pagsugod, mao nga dili na nato kinahanglan ang orasan (apan mahimo nimo kung gusto nimo). Apan kinahanglan nimo nga i-on ang mga peripheral.

Dokumentasyon: Ang Blue Pill nasangkapan sa sikat nga STM32F103C8T6 chip, adunay duha ka mapuslanon nga mga dokumento alang niini:

Sa datasheet mahimo kaming interesado sa:

  • Pinouts - chip pinouts - kung magdesisyon kami nga himuon ang mga tabla sa among kaugalingon;
  • Memory Map – memory map para sa usa ka piho nga chip. Ang Reference Manual adunay mapa para sa tibuok linya, ug kini naghisgot sa mga rehistro nga wala sa atoa.
  • Talaan sa Pin Definition – naglista sa nag-una ug alternatibong mga gimbuhaton sa mga lagdok; alang sa "asul nga pildoras" makit-an nimo ang labi ka dali nga mga litrato sa Internet nga adunay usa ka lista sa mga pin ug ang ilang mga gimbuhaton. Busa, gi-google dayon namo ang Blue Pill pinout ug gitago kini nga hulagway:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
NB: adunay sayup sa litrato gikan sa Internet, nga nahibal-an sa mga komentaryo, salamat niana. Ang hulagway gipulihan, apan kini usa ka leksyon - mas maayo nga susihon ang impormasyon dili gikan sa mga datasheet.

Among tangtangon ang datasheet, ablihan ang Reference Manual, ug sugod karon gamiton na lang namo kini.
Pamaagi: atong atubangon ang standard input/output, i-configure ang SPI, i-on ang gikinahanglang peripheral.

Input Output

Sa Atmega328, ang I/O gipatuman nga yano ra kaayo, mao nga ang kadaghan sa mga kapilian sa STM32 mahimong makalibog. Karon kinahanglan ra naton ang mga konklusyon, apan bisan kini adunay upat nga kapilian:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
open drain, push-pull, alternative push-pull, alternatibo open drain

"Pull-push" (itulod-bira) mao ang naandan nga output gikan sa Arduino, ang pin mahimong makakuha sa bili nga HIGH o LOW. Apan sa "open drain" adunay mga kalisdanan, bisan tuod sa pagkatinuod ang tanan yano dinhi:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Konfigurasyon sa output / sa dihang ang port gi-assign sa output: / output buffer enabled: / – open drain mode: “0” sa output register makapahimo sa N-MOS, “1” sa output register mobiya sa port sa Hi-Z mode ( Ang P-MOS wala ma-activate ) / – push-pull mode: “0” sa output register nag-activate sa N-MOS, “1” sa output register nag-activate sa P-MOS.

Ang tanan nga kalainan tali sa bukas nga kanal (bukas nga kanal) gikan sa “push-pull” (itulod-bira) mao nga sa unang pin dili makadawat sa HIGH state: sa pagsulat sa usa sa output register, kini moadto sa high resistance mode (taas nga impedance, Hi-Z). Sa pagsulat sa zero, ang pin naglihok nga parehas sa duha nga mga mode, parehas nga lohikal ug elektrikal.

Sa normal nga output mode, ang pin nagsibya lang sa mga sulod sa output register. Sa "alternatibo" kini kontrolado sa katugbang nga mga peripheral (tan-awa ang 9.1.4):

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Kung ang usa ka bit sa port gi-configure ingon usa ka alternate function pin, ang rehistro sa pin ma-disable ug ang pin konektado sa peripheral pin.

Ang alternatibong pag-andar sa matag pin gihulagway sa Mga Kahulugan sa Pin Ang datasheet anaa sa na-download nga hulagway. Sa pangutana kung unsa ang buhaton kung ang usa ka pin adunay daghang mga alternatibong gimbuhaton, ang tubag gihatag sa usa ka footnote sa datasheet:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Kung daghang mga peripheral ang mogamit sa parehas nga pin, aron malikayan ang panagbangi tali sa mga alternatibong gimbuhaton, usa ra ka peripheral ang kinahanglan gamiton sa usa ka higayon, i-toggle gamit ang peripheral clock enable bit (sa angay nga rehistro sa RCC).

Sa katapusan, ang mga pin sa output mode usab adunay usa ka katulin sa orasan. Kini usa pa nga bahin sa pag-save sa enerhiya; sa among kaso, gitakda namon kini sa labing taas ug kalimtan kini.

Mao nga: gigamit namon ang SPI, nga nagpasabut nga ang duha nga mga pin (nga adunay datos ug adunay signal sa orasan) kinahanglan nga "alternatibong pagduso-pagbira function", ug ang usa (LAT) kinahanglan nga "regular nga pagduso-pagbira". Apan sa dili pa sila ma-assign, atong atubangon ang SPI.

SPI

Laing gamay nga programa sa edukasyon

Ang SPI o Serial Peripheral Interface (serial peripheral interface) usa ka yano ug epektibo kaayo nga interface alang sa pagkonektar sa usa ka MK sa ubang mga MK ug sa gawas nga kalibutan sa kinatibuk-an. Ang prinsipyo sa operasyon niini gihulagway na sa ibabaw, diin mahitungod sa Chinese LED driver (sa reference manual, tan-awa ang seksyon 25). Ang SPI mahimong molihok sa master ("master") ug slave ("slave") mode. Ang SPI adunay upat ka sukaranan nga mga kanal, diin dili tanan magamit:

  • MOSI, Master Output / Slave Input: kini nga pin nagpadala sa datos sa master mode, ug nakadawat og data sa slave mode;
  • MISO, Master Input / Slave Output: sa sukwahi, kini nakadawat sa agalon, ug nagpadala sa ulipon;
  • SCK, Serial Clock: nagtakda sa frequency sa data transmission sa master o nakadawat og signal sa orasan sa ulipon. Sa tinuud nga pag-igo sa mga beats;
  • SS, Slave Select: sa tabang niini nga channel, nahibal-an sa ulipon nga adunay gusto gikan kaniya. Sa STM32 gitawag kini nga NSS, diin N = negatibo, i.e. ang controller mahimong usa ka ulipon kon adunay yuta niini nga channel. Maayo kini nga gikombinar sa Open Drain Output mode, apan lain kana nga istorya.

Sama sa tanan, ang SPI sa STM32 dato sa pagpaandar, nga naghimo niini nga lisud sabton. Pananglitan, mahimo kini nga magtrabaho dili lamang sa SPI, kondili usab sa usa ka interface sa I2S, ug sa dokumentasyon ang ilang mga paghulagway gisagol, gikinahanglan nga putlon ang sobra sa tukma sa panahon nga paagi. Ang among tahas yano ra kaayo: kinahanglan ra namon magpadala mga datos gamit lamang ang MOSI ug SCK. Moadto kami sa seksyon 25.3.4 (katunga-duplex nga komunikasyon, katunga-duplex nga komunikasyon), diin among makita 1 orasan ug 1 unidirectional data wire (1 signal sa orasan ug 1 unidirectional data stream):

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Niini nga mode, ang aplikasyon naggamit sa SPI sa transmit-only o receive-only mode. / Transmit-only mode susama sa duplex mode: ang data gipasa sa transmit pin (MOSI sa master mode o MISO sa slave mode), ug ang receive pin (MISO o MOSI matag usa) mahimong gamiton isip regular nga I/O pin. . Sa kini nga kaso, ang aplikasyon kinahanglan lamang nga ibaliwala ang Rx buffer (kung kini gibasa, wala’y mabalhin nga datos didto).

Maayo, ang MISO pin libre, atong ikonektar ang LAT signal niini. Atong tan-awon ang Slave Select, nga sa STM32 mahimong makontrol sa programmatically, nga labi ka kombenyente. Atong mabasa ang paragraph sa samang ngalan sa seksyon 25.3.1 SPI Kinatibuk-ang Deskripsyon:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Software control NSS (SSM = 1) / Ang impormasyon sa pagpili sa ulipon anaa sa SSI bit sa SPI_CR1 register. Ang eksternal nga NSS pin nagpabilin nga libre alang sa ubang mga panginahanglanon sa aplikasyon.

Panahon na sa pagsulat sa mga rehistro. Nakahukom ko nga gamiton ang SPI2, pangitaa ang base nga adres niini sa datasheet - sa seksyon 3.3 Memory Map:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Aw, magsugod kita:

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

Ablihi ang seksyon 25.3.3 nga adunay titulo nga nagpatin-aw sa kaugalingon nga "Pag-configure sa SPI sa Master Mode":

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

1. I-set ang serial clock frequency nga adunay bits BR[2:0] sa SPI_CR1 register.

Ang mga rehistro gikolekta sa seksyon sa reference manual nga parehas nga ngalan. Pagbalhin sa adres (Address offset) para sa CR1 – 0x00, pinaagi sa default ang tanan nga mga bit gitangtang (I-reset ang bili 0x0000):

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Ang BR bits nagbutang sa controller clock divider, sa ingon nagtino sa frequency diin ang SPI molihok. Ang among STM32 frequency mahimong 72 MHz, ang LED driver, sumala sa iyang datasheet, naglihok sa frequency nga hangtod sa 25 MHz, mao nga kinahanglan namo nga bahinon sa upat (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. I-set ang CPOL ug CPHA bits aron ipatin-aw ang relasyon tali sa pagbalhin sa datos ug serial clock timing (tan-awa ang diagram sa pahina 240)

Tungod kay nagbasa kami og usa ka datasheet dinhi ug wala magtan-aw sa mga eskematiko, atong tan-awon pag-ayo ang paghulagway sa teksto sa CPOL ug CPHA bits sa panid 704 (SPI General Deskripsyon):

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Ang yugto sa orasan ug polarity
Gamit ang CPOL ug CPHA bits sa SPI_CR1 nga rehistro, mahimo nimong pilion sa programa ang upat ka mga relasyon sa timing. Ang CPOL (clock polarity) bit nagkontrol sa kahimtang sa signal sa orasan kung walay data nga gipasa. Kini nga gamay nagkontrol sa master ug slave mode. Kung ang CPOL gi-reset, ang SCK pin ubos sa rest mode. Kung ang CPOL bit gitakda, ang SCK pin taas sa panahon sa rest mode.
Sa diha nga ang CPHA (clock phase) bit gibutang, ang taas nga bit trap strobe mao ang ikaduha nga ngilit sa SCK signal (mahulog kon CPOL tin-aw, mobangon kon CPOL gibutang). Ang datos makuha sa ikaduhang pagbag-o sa signal sa orasan. Kung ang CPHA bit klaro, ang taas nga bit trap strobe mao ang pagtaas sa ngilit sa SCK signal (falling edge kung CPOL ang gitakda, ang pagtaas sa edge kung ang CPOL natangtang). Ang datos makuha sa unang pagbag-o sa signal sa orasan.

Ang pagkasuhop niini nga kahibalo, nakahinapos kami nga ang duha ka mga piraso kinahanglan magpabilin nga mga sero, tungod kay Gusto namon nga ang signal sa SCK magpabilin nga ubos kung dili gamiton, ug ang datos nga ipadala sa pagtaas sa ngilit sa pulso (tan-awa ang Fig. Rising Edge sa DM634 datasheet).

Pinaagi sa dalan, dinhi una namong nakit-an ang usa ka bahin sa bokabularyo sa ST datasheets: diha kanila ang hugpong sa mga pulong nga "i-reset ang gamay ngadto sa zero" gisulat. para ma reset gamay, ug dili para maklaro gamay, sama, pananglitan, Atmega.

3. Ibutang ang DFF bit aron matino kung ang data block 8-bit o 16-bit nga format

Ako espesipikong mikuha ug 16-bit DM634 aron dili mahasol sa pagpadala sa 12-bit nga PWM data, sama sa DM633. Makatarunganon nga ibutang ang DFF sa usa:

#define DFF         0x0800

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

4. I-configure ang LSBFIRST bit sa SPI_CR1 register aron matino ang block format

Ang LSBFIRST, sumala sa gisugyot sa ngalan niini, nag-configure sa transmission nga adunay labing gamay nga hinungdanon nga gamay una. Apan gusto sa DM634 nga makadawat mga datos sugod sa labing hinungdanon nga gamay. Busa, gibiyaan namo kini nga i-reset.

5. Sa hardware mode, kung gikinahanglan ang input gikan sa NSS pin, gamita ang taas nga signal sa NSS pin atol sa tibuok byte transfer sequence. Sa NSS software mode, ibutang ang SSM ug SSI bits sa SPI_CR1 register. Kung ang NSS pin gamiton isip output, ang SSOE bit lang ang kinahanglan nga itakda.

I-install ang SSM ug SSI aron makalimtan ang bahin sa NSS hardware mode:

#define SSI         0x0100
#define SSM         0x0200

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

6. Ang MSTR ug SPE bits kinahanglang itakda (sila magpabilin nga set lamang kung ang NSS signal taas)

Sa tinuud, sa kini nga mga piraso among gitudlo ang among SPI ingon usa ka agalon ug gi-on kini:

#define MSTR        0x0004
#define SPE         0x0040

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

Gi-configure ang SPI, isulat dayon nato ang mga function nga nagpadala sa mga byte sa drayber. Padayon sa pagbasa 25.3.3 "Pag-configure sa SPI sa master mode":

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Order sa pagbalhin sa datos
Nagsugod ang pagpadala kung ang usa ka byte gisulat sa Tx buffer.
Ang data byte gikarga sa shift register sa parallel mode (gikan sa internal nga bus) sa panahon sa transmission sa unang bit, human nga kini gipasa sa sunodsunod MOSI pin mode, una o katapusang bit forward depende sa setting sa LSBFIRST bit sa CPI_CR1 register. Ang bandila sa TXE gibutang human sa pagpadala sa datos gikan sa Tx buffer ngadto sa shift register, ug makamugna usab og interrupt kung ang TXEIE bit sa CPI_CR1 register gitakda.

Gipasiugda nako ang pipila ka mga pulong sa paghubad aron madani ang atensyon sa usa ka bahin sa pagpatuman sa SPI sa mga tigkontrol sa STM. Sa Atmega ang bandila sa TXE (Tx Walay sulod, Tx walay sulod ug andam sa pagdawat sa datos) gibutang lamang human ang tibuok byte gipadala paggawas. Ug dinhi kini nga bandila gibutang human ang byte gisal-ut ngadto sa internal nga shift register. Tungod kay kini giduso didto uban sa tanan nga mga piraso sa samang higayon (parallel), ug unya ang data ipadala sa sunod-sunod nga, TXE gibutang sa wala pa ang byte hingpit nga ipadala. Importante kini tungod kay sa kaso sa among LED driver, kinahanglan namong ibira ang LAT pin pagkahuman ipadala sa tanan datos, i.e. Ang bandila sa TXE lamang dili igo alang kanato.

Kini nagpasabot nga nagkinahanglan kita og laing bandila. Atong tan-awon ang 25.3.7 - "Mga Bandera sa Status":

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
<…>
Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
BUSY nga bandera
Ang bandila sa BSY gitakda ug gilimpyohan sa hardware (ang pagsulat niini walay epekto). Ang bandila sa BSY nagpakita sa kahimtang sa layer sa komunikasyon sa SPI.
Gi-reset kini:
kung nahuman na ang pagbalhin (gawas sa master mode kung padayon ang pagbalhin)
kung ang SPI na-disable
kung mahitabo ang usa ka master mode error (MODF=1)
Kung ang pagbalhin dili padayon, ang bandila sa BSY matangtang sa taliwala sa matag pagbalhin sa datos

Okay, kini magamit. Atong tan-awon kung asa nahimutang ang Tx buffer. Aron mahimo kini, basaha ang "SPI Data Register":

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Mga Bits 15:0 DR[15:0] Data Register
Data nga nadawat o data nga ipadala.
Ang rehistro sa datos gibahin sa duha ka buffer - usa para sa pagsulat (transmit buffer) ug usa para sa pagbasa (receive buffer). Ang pagsulat sa data register nagsulat sa Tx buffer, ug ang pagbasa gikan sa data register ibalik ang bili nga anaa sa Rx buffer.

Aw, ug ang rehistro sa status, diin ang mga bandila sa TXE ug BSY makita:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Gisulat namo:

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

Aw, tungod kay kinahanglan namon nga ipadala ang 16 ka beses nga duha ka byte, sumala sa gidaghanon sa mga output sa driver sa LED, usa ka butang nga sama niini:

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

Apan wala pa mi kahibalo unsaon pagbira sa LAT pin, mao nga mobalik mi sa I/O.

Pag-assign sa mga pin

Sa STM32F1, ang mga rehistro nga responsable sa kahimtang sa mga pin talagsaon kaayo. Klaro nga adunay daghan kanila kaysa sa Atmega, apan lahi usab sila sa ubang mga chip sa STM. Seksyon 9.1 Kinatibuk-ang Deskripsyon sa GPIO:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Ang matag usa sa kinatibuk-ang katuyoan sa I/O port (GPIO) adunay duha ka 32-bit configuration registers (GPIOx_CRL ug GPIOx_CRH), duha ka 32-bit data registers (GPIOx_IDR ug GPIOx_ODR), usa ka 32-bit set/reset register (GPIOx_BSRR), usa ka 16-bit reset register (GPIOx_BRR) ug 32- gamay nga blocking register (GPIOx_LCKR).

Ang una nga duha ka mga rehistro dili kasagaran, ug usab dili kombenyente, tungod kay ang 16 nga mga port pin nagkatag sa ilang taliwala sa usa ka "upat ka bit matag igsoon" nga format. Mga. Ang mga pin nga sero hangtod pito naa sa CRL, ug ang nahabilin naa sa CRH. Sa parehas nga oras, ang nahabilin nga mga rehistro malampuson nga naglangkob sa mga tipik sa tanan nga mga pin sa pantalan - kanunay nga nahabilin nga katunga nga "gireserba".

Alang sa kayano, magsugod kita gikan sa katapusan sa lista.

Wala mi magkinahanglan ug blocking register.

Ang set ug pag-reset nga mga rehistro medyo kataw-anan tungod kay sila partially duplicate sa usag usa: mahimo nimong isulat ang tanan sa BSRR lamang, diin ang mas taas nga 16 bits mag-reset sa pin ngadto sa zero, ug ang ubos nga mga butang ibutang sa 1, o mahimo usab nimo. gamita ang BRR, ang ubos nga 16 ka bits diin i-reset lang ang pin. Ganahan ko sa ikaduha nga kapilian. Importante kini nga mga rehistro tungod kay naghatag kini og atomic access sa mga pin:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Atomic Set o Reset
Dili kinahanglan nga pag-disable ang mga interrupts kung ang pagprograma sa GPIOx_ODR sa lebel sa gamay: ang usa o daghan pa nga mga bit mahimong usbon sa usa ka atomic write operation nga APB2. Kini makab-ot pinaagi sa pagsulat og "1" sa set/reset nga rehistro (GPIOx_BSRR o, alang lamang sa pag-reset, GPIOx_BRR) sa bit nga kinahanglang usbon. Ang ubang mga bit magpabilin nga wala mausab.

Ang mga rehistro sa datos adunay mga ngalan nga nagpatin-aw sa kaugalingon - IDR = input Direksyon Register, input register; ODR = output Direksyon Register, rehistro sa output. Dili namo kinahanglan sila sa kasamtangan nga proyekto.

Ug sa katapusan, pagkontrol sa mga rehistro. Tungod kay interesado kami sa ikaduhang SPI pin, nga mao ang PB13, PB14 ug PB15, tan-awon dayon namo ang CRH:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Ug nakita namon nga kinahanglan namon nga isulat ang usa ka butang sa mga piraso gikan sa 20 hangtod 31.

Nahibal-an na namon sa ibabaw kung unsa ang gusto namon gikan sa mga pin, mao nga dinhi akong buhaton nga wala’y screenshot, isulti lang nako nga ang MODE nagtino sa direksyon (input kung ang duha nga mga bit gitakda sa 0) ug ang tulin sa pin (kinahanglan namon ang 50MHz, i.e. pareho nga pin sa "1"), ug ang CNF nagtakda sa mode: regular nga "push-pull" - 00, "alternatibo" - 10. Sa kasagaran, ingon sa atong makita sa ibabaw, ang tanan nga mga pin adunay ikatulo nga bit gikan sa ubos (CNF0), kini nagbutang kanila sa mode naglutaw nga input.

Tungod kay nagplano ako nga buhaton ang usa ka butang sa kini nga chip, alang sa kayano gihubit nako ang tanan nga posible nga mga kantidad sa MODE ug CNF alang sa ubos ug taas nga mga rehistro sa kontrol.

Ingon ani

#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

Ang among mga pin nahimutang sa port B (base address - 0x40010C00), code:

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

Ug, sumala niana, mahimo nimong isulat ang mga kahulugan alang sa LAT, nga ma-twitch sa mga rehistro sa BRR ug 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 pinaagi lang sa inertia, kini kanunay nga ingon niana, pasagdi kini)

Karon ang tanan maayo, apan dili kini molihok. Tungod kay kini mao ang STM32, sila nagdaginot sa elektrisidad, nga nagpasabot nga kinahanglan nimo nga palihokon ang orasan sa gikinahanglan nga mga peripheral.

I-on ang orasan

Ang relo, nailhan usab nga Orasan, maoy responsable sa pag-orasan. Ug namatikdan na nato ang abbreviation nga RCC. Gipangita namo kini sa dokumentasyon: kini ang Reset ug Clock Control.

Sama sa giingon sa ibabaw, maayo na lang, ang labing lisud nga bahin sa orasan nga hilisgutan gihimo alang kanamo sa mga tawo gikan sa STM, diin kami nagpasalamat kaayo kanila (sa makausa pa maghatag ako usa ka link sa Ang website ni Di Halt, aron maklaro kung unsa kini kalibog). Kinahanglan lang namo ang mga rehistro nga responsable sa pagpagana sa peripheral clocking (Peripheral Clock Enable Registers). Una, atong pangitaon ang base nga adres sa RCC, kini sa sinugdanan sa "Memory Map":

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

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

Ug dayon i-klik ang link diin imong sulayan nga makit-an ang usa ka butang sa plato, o, labi ka maayo, pag-adto sa mga paghubit sa makapaarang nga mga rehistro gikan sa mga seksyon bahin sa makahimo sa mga rehistro. Diin atong makit-an ang RCC_APB1ENR ug RCC_APB2ENR:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Ug sila, sumala niana, adunay mga piraso nga naglakip sa clocking sa SPI2, IOPB (I/O Port B) ug alternatibong mga gimbuhaton (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;

Ang katapusan nga code makita dinhi.

Kung naa kay higayon ug tinguha sa pagsulay, dayon ikonektar ang DM634 sama niini: DAI sa PB15, DCK sa PB13, LAT sa PB14. Gihatagan namon ang drayber gikan sa 5 volts, ayaw kalimot sa pagkonektar sa mga nataran.

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

STM8 PWM

PWM sa STM8

Sa diha nga nagplano pa lang ko niini nga artikulo, nakahukom ko, isip usa ka pananglitan, sa pagsulay sa pag-master sa pipila ka mga gamit sa usa ka dili pamilyar nga chip gamit lamang ang usa ka datasheet, aron dili ako mahuman sa usa ka tigbuhat og sapatos nga walay botas. STM8 mao ang sulundon alang niini nga papel: una, ako adunay usa ka magtiayon nga sa mga Chinese tabla uban sa STM8S103, ug ikaduha, kini dili kaayo popular, ug busa ang tintasyon sa pagbasa ug pagpangita sa usa ka solusyon sa Internet anaa sa kakulang niini nga mga solusyon.

Adunay usab ang chip datasheet и reference nga manwal RM0016, sa una adunay pinout ug magparehistro nga mga adres, sa ikaduha - ang tanan. Ang STM8 giprograma sa C sa usa ka makalilisang nga IDE ST Visual Pag-uswag.

Clocking ug I/O

Sa kasagaran, ang STM8 naglihok sa frequency nga 2 MHz, kini kinahanglan nga matul-id dayon.

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
HSI (High Speed ​​​​Internal) nga Orasan
Ang signal sa orasan sa HSI nakuha gikan sa usa ka internal nga 16 MHz RC oscillator nga adunay usa ka programmable divider (1 hangtod 8). Gibutang kini sa rehistro sa divider sa orasan (CLK_CKDIVR).
Matikdi: sa pagsugod, usa ka HSI RC oscillator nga adunay divider nga 8 ang gipili isip nag-unang tinubdan sa signal sa orasan.

Atong makita ang rehistro nga adres sa datasheet, ang paghulagway sa refman ug tan-awa nga ang rehistro kinahanglan nga malimpyohan:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Tungod kay kita modagan sa PWM ug magkonektar sa mga LED, atong tan-awon ang pinout:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Ang chip gamay, daghang mga gimbuhaton ang gisuspinde sa parehas nga mga pin. Ang naa sa square bracket mao ang "alternative functionality", kini gibalhin sa "option bytes" (opsyon nga byte) – sama sa Atmega fuse. Mahimo nimong usbon ang ilang mga kantidad sa programmatically, apan dili kinahanglan, tungod kay Ang bag-ong pag-andar gi-aktibo lamang pagkahuman sa pag-reboot. Mas sayon ​​ang paggamit sa ST Visual Programmer (na-download gamit ang Visual Develop), nga makapausab niini nga mga byte. Ang pinout nagpakita nga ang CH1 ug CH2 pin sa unang timer gitago sa square bracket; gikinahanglan nga ibutang ang AFR1 ug AFR0 bits sa STVP, ug ang ikaduha mobalhin usab sa CH1 output sa ikaduhang timer gikan sa PD4 ngadto sa PC5.

Busa, 6 ka mga pin ang magkontrol sa mga LED: PC6, PC7 ug PC3 alang sa unang timer, PC5, PD3 ug PA3 alang sa ikaduha.

Ang pag-set up sa I/O nga mga pin sa STM8 mas simple ug mas lohikal kaysa sa STM32:

  • pamilyar gikan sa rehistro sa direksyon sa data sa Atmega DDR (Pagrehistro sa Direksyon sa Data): 1 = output;
  • ang unang control register CR1, sa diha nga ang output, nagtakda sa push-pull mode (1) o open drain (0); tungod kay gikonektar nako ang mga LED sa chip nga adunay mga cathodes, gibilin nako ang mga zero dinhi;
  • ang ikaduha nga control register CR2, kung ang output, nagtakda sa gikusgon sa orasan: 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

PWM setting

Una, atong ipasabut ang mga termino:

  • PWM Frequency - kasubsob diin ang timer nagtiktik;
  • Auto-reload, AR - autoloadable nga kantidad hangtod sa pag-ihap sa timer (panahon sa pulso);
  • Pag-update sa Hitabo, UEV - usa ka panghitabo nga mahitabo kung ang timer naihap sa AR;
  • Siklo sa Katungdanan sa PWM – PWM duty cycle, sagad gitawag nga “duty factor”;
  • Kuhaa/Itandi ang Bili - bili alang sa pagdakop / pagtandi, diin ang timer giihap buhaton ang usa ka butang (sa kaso sa PWM, gibalit-ad niini ang output signal);
  • Preload nga Bili – preloaded nga bili. Itandi ang bili dili mausab samtang ang timer nagtiktik, kon dili ang PWM cycle maguba. Busa, ang mga bag-ong gipasa nga mga kantidad gibutang sa usa ka buffer ug gibira kung ang timer moabut sa katapusan sa iyang countdown ug gi-reset;
  • Gi-align sa kilid и Mga mode nga gipahiangay sa sentro - pag-align sa utlanan ug sa tunga, parehas sa Atmel Paspas nga PWM и Phase-correct nga PWM.
  • OCiREF, Output Compare Reference Signal – reference output signal, sa pagkatinuod, unsa ang makita sa katugbang nga pin sa PWM mode.

Sama sa klaro na gikan sa pinout, ang duha ka mga timer adunay mga kapabilidad sa PWM - ang una ug ang ikaduha. Ang duha mao ang 16-bit, ang una adunay daghang dugang nga mga bahin (labi na, mahimo kini mag-ihap sa pataas ug paubos). Kinahanglan namon nga managsama ang pagtrabaho, mao nga nakahukom ako nga magsugod sa klaro nga labing kabus nga ikaduha, aron dili aksidente nga magamit ang usa ka butang nga wala didto. Ang pipila ka problema mao nga ang paghulagway sa PWM functionality sa tanan nga mga timer sa reference manual anaa sa kapitulo mahitungod sa unang timer (17.5.7 PWM Mode), mao nga kinahanglan ka nga molukso balik-balik sa tibuok dokumento sa tanang panahon.

Ang PWM sa STM8 adunay hinungdanon nga bentaha sa PWM sa Atmega:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Boundary Aligned PWM
Pag-configure sa account gikan sa ubos hangtod sa taas
Aktibo ang pag-ihap sa ubos kung ang DIR bit sa rehistro sa TIM_CR1 matangtang
Pananglitan:
Ang pananglitan naggamit sa unang PWM mode. Ang PWM reference signal OCiREF gihuptan nga taas basta TIM1_CNT <TIM1_CCRi. Kay kon dili, nagkinahanglan kini og ubos nga lebel. Kung ang pagtandi nga kantidad sa TIM1_CCRi rehistro mas dako kaysa sa autoload nga kantidad (TIM1_ARR rehistro), ang OCiREF signal gihuptan sa 1. Kung ang kantidad sa pagtandi 0, ang OCiREF gihimo sa zero....

STM8 timer sa panahon update nga panghitabo check una itandi ang bili, ug unya makahimo lamang og reference signal. Ang timer sa Atmega una nga nag-screw ug dayon nagtandi, nga miresulta sa compare value == 0 ang output usa ka dagom, nga kinahanglan nga atubangon sa usa ka paagi (pananglitan, pinaagi sa programmatically inverting ang logic).

Busa unsa ang gusto natong buhaton: 8-bit PWM (AR == 255), pag-ihap gikan sa ubos ngadto sa ibabaw, pag-align sa utlanan. Tungod kay ang mga bombilya konektado sa chip pinaagi sa mga cathodes, ang PWM kinahanglan nga mag-output 0 (LED sa) hangtod itandi ang bili ug 1 human.

Nakabasa na kami bahin sa pipila PWM mode, mao nga atong makita ang gikinahanglan nga rehistro sa ikaduhang timer pinaagi sa pagpangita sa reference manual alang niini nga hugpong sa mga pulong (18.6.8 - TIMx_CCMR1):

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
110: Unang PWM mode – kon mag-ihap gikan sa ubos ngadto sa ibabaw, ang unang channel aktibo samtang TIMx_CNT <TIMx_CCR1. Kung dili, ang una nga channel dili aktibo. [dugang pa sa dokumento adunay sayop nga copy-paste gikan sa timer 1] 111: Ikaduhang PWM mode – kon mag-ihap gikan sa ubos ngadto sa ibabaw, ang unang channel dili aktibo samtang TIMx_CNT < TIMx_CCR1. Kung dili, ang una nga channel aktibo.

Tungod kay ang mga LED konektado sa MK pinaagi sa mga cathodes, ang ikaduha nga mode angay kanamo (ang una usab, apan wala pa kami nahibal-an).

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Bit 3 OC1PE: I-enable ang preload sa pin 1
0: Ang preload nga rehistro sa TIMx_CCR1 gi-disable. Makasulat ka sa TIMx_CCR1 bisan unsang orasa. Ang bag-ong bili molihok dayon.
1: Ang preload nga rehistro sa TIMx_CCR1 gi-enable. Ang mga operasyon sa pagbasa/pagsulat nag-access sa preload nga rehistro. Ang preloaded value TIMx_CCR1 gikarga sa shadow register atol sa matag update nga panghitabo.
*Pahinumdom: Aron ang PWM mode mogana sa hustong paagi, ang preload registers kinahanglang ma-enable. Dili kini gikinahanglan sa single signal mode (ang OPM bit kay gibutang sa TIMx_CR1 register).

Okay, atong i-on ang tanan nga atong gikinahanglan alang sa tulo ka channel sa ikaduhang timer:

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

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

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

Ang AR naglangkob sa duha ka walo ka bit nga mga rehistro, ang tanan yano ra:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Ang ikaduha nga timer mahimo ra nga maihap gikan sa ubos hangtod sa taas, pag-align sa utlanan, wala’y kinahanglan nga usbon. Atong ibutang ang frequency divider, pananglitan, ngadto sa 256. Alang sa ikaduhang timer, ang divider gibutang sa TIM2_PSCR register ug usa ka gahum sa duha:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Ang nahabilin mao ang pagpabalik sa mga konklusyon ug ang ikaduha nga timer mismo. Ang unang problema masulbad pinaagi sa mga rehistro Kuhaa/Itandi makapahimo: adunay duha, tulo ka mga channel nga nagkatag sa ilang asymmetrically. Dinhi mahimo usab naton mahibal-an nga posible nga usbon ang polarity sa signal, i.e. sa prinsipyo, posible nga gamiton ang PWM Mode 1. Nagsulat kami:

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

Ug sa katapusan, atong sugdan ang timer sa TIMx_CR1 register:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Magsulat kita og usa ka yano nga analogue sa AnalogWrite(), nga magbalhin sa aktuwal nga mga bili ngadto sa timer alang sa pagtandi. Ang mga rehistro ginganlan nga matag-an Kuhaa/Itandi ang mga rehistro, adunay duha niini alang sa matag channel: ang low-order 8 bits sa TIM2_CCRxL ug ang high-order sa TIM2_CCRxH. Tungod kay nakahimo kami og 8-bit nga PWM, igo na nga isulat ang labing gamay nga mga tipik:

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

Ang matinagdanon nga magbabasa makamatikod nga kami adunay gamay nga depekto nga PWM, dili makahimo sa 100% nga pagpuno (sa usa ka maximum nga kantidad nga 255, ang signal gibalit-ad alang sa usa ka timer cycle). Alang sa mga LED dili kini igsapayan, ug ang matinagdanon nga magbabasa makatag-an na kung unsaon kini ayuhon.

Ang PWM sa ikaduha nga timer nagtrabaho, magpadayon kita sa una.

Ang una nga timer adunay parehas nga mga bit sa parehas nga mga rehistro (kini nga ang mga bit nga nagpabilin nga "gireserba" sa ikaduha nga timer aktibo nga gigamit sa una alang sa tanan nga mga lahi sa mga advanced nga butang). Busa, igo na nga makit-an ang mga adres sa parehas nga mga rehistro sa datasheet ug kopyahon ang code. Aw, usba ang kantidad sa frequency divider, tungod kay... ang unang timer gusto nga makadawat dili usa ka gahum sa duha, apan usa ka eksaktong 16-bit nga kantidad sa duha ka mga rehistro Taas nga prescaler и ubos. Gibuhat namo ang tanan ug... dili mugana ang first timer. Unsay problema?

Masulbad ra ang problema pinaagi sa pagtan-aw sa tibuuk nga seksyon bahin sa mga rehistro sa kontrol sa timer 1, diin gipangita namon ang usa nga wala sa ikaduha nga timer. Adunay mahitabo 17.7.30 Rehistro sa break (TIM1_BKR), diin adunay kini nga gamay:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
I-enable ang main output

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Mao na ang tanan sigurado karon, ang code didto.

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

STM8 Multiplex

Multiplexing sa STM8

Ang ikatulo nga mini-proyekto mao ang pagkonektar sa walo ka RGB LEDs ngadto sa ikaduhang timer sa PWM mode ug ipakita kini sa lain-laing mga kolor. Gibase kini sa konsepto sa LED multiplexing, nga kung imong i-on ug i-off ang mga LED nga dali kaayo, ingon og kini kanunay nga nag-on (pagpadayon sa panan-aw, inertia sa visual perception). Kausa akong gibuhat usa ka butang nga sama niini sa Arduino.

Ang algorithm sa pagtrabaho ingon niini:

  • konektado sa anode sa unang RGB LED;
  • gidagkutan kini, pagpadala sa gikinahanglan nga mga signal ngadto sa mga cathodes;
  • naghulat hangtud sa katapusan sa PWM cycle;
  • konektado sa anode sa ikaduha nga RGB LED;
  • sugdi na...

Aw, ug uban pa. Siyempre, alang sa nindot nga operasyon gikinahanglan nga ang anode konektado ug ang LED "nagdilaab" sa samang higayon. Aw, o hapit. Sa bisan unsang kaso, kinahanglan namon nga magsulat usa ka code nga magpagawas sa mga kantidad sa tulo nga mga channel sa ikaduha nga timer, usba kini kung maabot ang UEV, ug sa samang higayon usbon ang aktibo nga RGB LED.

Tungod kay awtomatiko ang pagbalhin sa LED, kinahanglan namon nga maghimo usa ka "memorya sa video" diin ang interrupt handler makadawat mga datos. Kini usa ka yano nga array:

uint8_t colors[8][3];

Aron mabag-o ang kolor sa usa ka piho nga LED, igo na nga isulat ang gikinahanglan nga mga kantidad sa kini nga laray. Ug ang variable mahimong responsable sa gidaghanon sa aktibo nga LED

uint8_t cnt;

Demux

Alang sa husto nga multiplexing, kinahanglan namon, sa katingad-an, usa ka CD74HC238 demultiplexer. Demultiplexer - usa ka chip nga nagpatuman sa operator sa hardware <<. Pinaagi sa tulo ka mga input pin (bits 0, 1 ug 2) gipakaon namo kini og tulo ka bit nga numero X, ug isip tubag kini nagpalihok sa numero sa output (1<<X). Ang nahabilin nga mga input sa chip gigamit sa pagsukod sa tibuuk nga disenyo. Kinahanglan namon kini nga chip dili lamang aron makunhuran ang gidaghanon sa mga okupado nga mga pin sa microcontroller, apan alang usab sa kaluwasan - aron dili aksidente nga ma-on ang daghang mga LED kaysa mahimo ug dili masunog ang MK. Ang chip nagkantidad ug usa ka sentimos ug kinahanglang tipigan kanunay sa imong kabinet sa tambal sa balay.

Ang atong CD74HC238 maoy responsable sa pagsuplay sa boltahe sa anode sa gusto nga LED. Sa usa ka bug-os nga multiplex, kini maghatag boltahe sa kolum pinaagi sa usa ka P-MOSFET, apan sa kini nga demo posible nga direkta, tungod kay kini nagdrowing 20 mA, sumala sa hingpit nga maximum nga mga rating sa datasheet. gikan sa Ang datasheet ng CD74HC238 kinahanglan namon ang mga pinout ug kini nga cheat sheet:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
H = taas nga lebel sa boltahe, L = ubos nga lebel sa boltahe, X - ayaw pagtagad

Gikonektar namon ang E2 ug E1 sa yuta, E3, A0, A1 ug A3 sa mga pin nga PD5, PC3, PC4 ug PC5 sa STM8. Tungod kay ang lamesa sa ibabaw adunay parehas nga ubos ug taas nga lebel, among gi-configure kini nga mga pin ingon mga push-pull pin.

PWM

Ang PWM sa ikaduhang timer gi-configure sa samang paagi sama sa miaging istorya, nga adunay duha ka kalainan:

Una, kinahanglan natong palihokon ang interrupt Pag-update sa Hitabo (UEV) nga magtawag sa usa ka function nga mag-toggle sa aktibo nga LED. Gihimo kini pinaagi sa pagbag-o sa gamay Pag-update sa Interrupt Enable sa usa ka rehistro nga adunay nagsulti nga ngalan

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
Interrupt enable register

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Ang ikaduha nga kalainan nalangkit sa panghitabo sa multiplexing, sama sa pagpangalibya – parasitic glow sa mga diode. Sa among kaso, kini mahimong makita tungod sa kamatuoran nga ang timer, nga nagpahinabo sa usa ka interrupt sa UEV, nagpadayon sa pag-tick, ug ang interrupt handler walay panahon sa pagbalhin sa LED sa dili pa magsugod ang timer sa pagsulat sa usa ka butang sa mga pin. Aron mabuntog kini, kinahanglan nimo nga balit-aron ang lohika (0 = maximum nga kahayag, 255 = wala’y suga) ug likayan ang grabe nga mga kantidad sa siklo sa katungdanan. Mga. siguroha nga human sa UEV ang mga LED hingpit nga mogawas alang sa usa ka PWM cycle.

Pagbag-o sa polarity:

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

Likayi ang pagbutang sa r, g ug b sa 255 ug hinumdomi nga balit-aron kini kung gamiton kini.

Mga interrupt

Ang diwa sa usa ka interrupt mao nga ubos sa pipila ka mga kahimtang ang chip mihunong sa pagpatuman sa nag-unang programa ug nagtawag sa pipila ka eksternal nga function. Ang mga interrupts mahitabo tungod sa eksternal o internal nga mga impluwensya, lakip ang timer.

Sa una namong gibuhat ang usa ka proyekto sa ST Visual Develop, dugang sa main.c nakadawat kami usa ka bintana nga adunay usa ka misteryosong file stm8_interrupt_vector.c, awtomatik nga gilakip sa proyekto. Niini nga file, usa ka function ang gi-assign sa matag interrupt NonHandledInterrupt. Kinahanglan natong ihigot ang atong function sa gusto nga interrupt.

Ang datasheet adunay usa ka talaan sa mga interrupt vectors, diin atong makita ang atong gikinahanglan:

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8
13 TIM2 update/overflow
14 TIM2 pagdakop/pagtandi

Kinahanglan namon nga usbon ang LED sa UEV, busa kinahanglan namon nga mabalda ang #13.

Busa, una, sa file stm8_interrupt_vector.c usba ang default nga ngalan sa function nga responsable sa interrupt No. 13 (IRQ13) sa imong kaugalingon:

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

Ikaduha, kinahanglan namon nga maghimo usa ka file main.h uban sa mosunod nga sulod:

#ifndef __MAIN_H
#define __MAIN_H

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

Ug sa katapusan, isulat kini nga function sa imong 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;
}

Ang nahabilin mao ang paghimo sa mga interrupts. Gihimo kini gamit ang assembler command rim - kinahanglan nimo pangitaon kini Manwal sa Programming:

//enable interrupts
_asm("rim");

Ang laing sugo sa assembler mao ang sim - gipalong ang mga interrupt. Kinahanglang i-off kini samtang gisulat ang mga bag-ong kantidad sa "memorya sa video", aron ang usa ka pagkabalda nga gipahinabo sa sayup nga higayon dili makadaut sa laray.

Tanan nga code- sa GitHub.

Basaha ang mga datasheet 2: SPI sa STM32; PWM, timers ug interrupts sa STM8

Kung labing menos adunay nakakaplag niini nga artikulo nga mapuslanon, nan wala ko kini gisulat sa kawang. Malipay ko nga makadawat mga komento ug komento, paningkamutan nako nga tubagon ang tanan.

Source: www.habr.com

Idugang sa usa ka comment