Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

В thawj ntu Kuv sim qhia qhov nyiam cov kws tsim hluav taws xob hluav taws xob uas loj hlob los ntawm Arduino ris yuav ua li cas thiab vim li cas lawv thiaj li yuav tsum nyeem cov ntaub ntawv thiab lwm cov ntaub ntawv rau microcontrollers. Cov ntawv nyeem tau dhau los ua qhov loj, yog li kuv tau cog lus tias yuav nthuav tawm cov piv txwv zoo hauv ib tsab xov xwm cais. Zoo, nws hu nws tus kheej yog mis nyuj ...

Hnub no kuv yuav qhia koj yuav ua li cas siv cov ntaub ntawv los daws qhov yooj yim heev, tab sis tsim nyog rau ntau txoj haujlwm, kev ua haujlwm ntawm STM32 (Blue Pill) thiab STM8 controllers. Txhua qhov project demo tau mob siab rau kuv nyiam LEDs, peb yuav teeb rau hauv ntau qhov ntau, uas peb yuav tau siv txhua hom kev nthuav dav.

Cov ntawv nyeem rov tig los ua qhov loj, yog li kom yooj yim kuv ua cov ntsiab lus:

STM32 Blue Pill: 16 LEDs nrog DM634 tsav tsheb
STM8: Teeb tsa rau XNUMX tus pin PWM
STM8: 8 RGB LEDs ntawm peb tus pins, cuam tshuam

Disclaimer: Kuv tsis yog ib tug engineer, kuv tsis ua txuj kom muaj kev paub tob hauv electronics, tsab xov xwm yog npaj rau amateurs li kuv. Qhov tseeb, kuv xav tias kuv tus kheej ob xyoos dhau los ua cov neeg tuaj saib lub hom phiaj. Yog hais tias ib tug neeg tau hais rau kuv ces cov ntaub ntawv ntawm ib tug tsis paub nti tsis txaus ntshai los nyeem, kuv yuav tsis tau siv sij hawm ntau mus nrhiav tej daim code nyob rau hauv Internet thiab inventing crutches nrog txiab thiab nplaum daim kab xev.

Lub hom phiaj ntawm tsab xov xwm no yog nyob rau hauv cov ntaub ntawv, tsis yog tej yaam num, yog li cov cai tej zaum yuav tsis zoo huv si thiab feem ntau cramped. Cov phiaj xwm lawv tus kheej yog qhov yooj yim heev, txawm hais tias tsim nyog rau thawj tus neeg paub nrog cov nti tshiab.

Kuv vam tias kuv tsab xov xwm yuav pab tau ib tug neeg nyob rau theem zoo sib xws ntawm immersion nyob rau hauv kev nyiam ua.

SWB 32

16 LEDs nrog DM634 thiab SPI

Ib txoj haujlwm me me siv Blue Pill (STM32F103C8T6) thiab DM634 LED tsav tsheb. Siv cov ntaub ntawv, peb yuav txheeb xyuas tus tsav tsheb, STM IO chaw nres nkoj thiab teeb tsa SPI.

DM634

Taiwanese nti nrog 16 16-ntsis PWM tso tawm, tuaj yeem txuas nrog cov saw hlau. Tus qauv qis kawg 12-ntsis yog paub los ntawm qhov project hauv tsev Lightpack. Nyob rau hauv ib lub sij hawm, xaiv ntawm DM63x thiab tus paub zoo TLC5940, kuv xaiv DM rau ntau yam: 1) TLC ntawm Aliexpress yog twv yuav raug hu fake, tab sis qhov no tsis yog; 2) DM muaj PWM autonomous nrog nws tus kheej zaus generator; 3) nws tuaj yeem yuav pheej yig hauv Moscow, tsis yog tos ib pob khoom los ntawm Ali. Thiab, ntawm chav kawm, nws yog qhov nthuav kom kawm paub tswj cov nti koj tus kheej, tsis yog siv lub tsev qiv ntawv npaj txhij. Cov chips tam sim no feem ntau nthuav tawm hauv pob SSOP24; lawv yooj yim rau solder rau lub adapter.

Txij li cov chaw tsim khoom yog Taiwanese, daim ntawv qhia lub nti yog sau ua lus Suav, uas txhais tau tias nws yuav lom zem. Ua ntej peb saib lub pinout (Pin kev sib txuas) kom nkag siab tias ceg twg txuas rau dab tsi, thiab piav qhia ntawm tus pins (Tus Piav Qhia Pin). 16 pin:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
DC Sink Sources (Open Drain)

Dab dej / Qhib-drain output - dej ntws; qhov chaw ntawm inflowing tam sim no; cov zis txuas nrog rau hauv av hauv lub xeev nquag - LEDs txuas nrog tus tsav tsheb los ntawm cathodes. Hluav taws xob, qhov no yog, ntawm chav kawm, tsis yog "qhib ntws" (qhib qhov dej), tab sis nyob rau hauv cov ntaub ntawv no lub npe rau tus pins nyob rau hauv hom ntws yog feem ntau pom.

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Sab nraud resistors ntawm REXT thiab GND los teeb tsa tus nqi tam sim no

Ib qho kev siv resistor yog ntsia nruab nrab ntawm REXT tus pin thiab hauv av, uas tswj cov kev tawm tsam sab hauv ntawm cov khoom tawm, saib daim duab ntawm nplooj 9 ntawm daim ntawv teev cov ntaub ntawv. Hauv DM634, qhov kev tiv thaiv no kuj tuaj yeem tswj tau los ntawm software, teeb tsa qhov ci ntsa iab (thoob ntiaj teb brightness); Kuv yuav tsis nkag mus rau hauv cov ntsiab lus hauv tsab xov xwm no, kuv tsuas yog muab 2.2 - 3 kOhm resistor ntawm no.

Txhawm rau kom nkag siab yuav ua li cas tswj lub nti, cia saib cov lus piav qhia ntawm lub cuab yeej interface:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Yog, ntawm no nws yog, Suav Askiv nyob rau hauv tag nrho nws lub yeeb koob. Txhais qhov no yog teeb meem, koj tuaj yeem nkag siab nws yog tias koj xav tau, tab sis muaj lwm txoj hauv kev - saib seb qhov kev sib txuas mus rau qhov ua haujlwm zoo li cas TLC5940 tau piav qhia hauv cov ntaub ntawv:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
... Tsuas yog peb tus pins yuav tsum tau nkag mus rau cov ntaub ntawv rau hauv lub cuab yeej. Qhov nce ntug ntawm SCLK teeb liab hloov cov ntaub ntawv los ntawm SIN tus pin mus rau hauv kev sau npe. Tom qab tag nrho cov ntaub ntawv tau raug thauj khoom, luv luv siab XLAT teeb liab latches cov ntaub ntawv xa mus rau hauv cov ntawv sau npe sab hauv. Cov ntawv sau npe sab hauv yog cov rooj vag tshwm sim los ntawm qib XLAT teeb liab. Tag nrho cov ntaub ntawv yog kis tau qhov tseem ceeb tshaj me ntsis ua ntej.

Latch - latch / latch / xauv.
Nce ntug - thawj ntug ntawm lub plawv dhia
MSB ua ntej - qhov tseem ceeb tshaj plaws (sab laugmost) me ntsis rau pem hauv ntej.
rau moos data - xa cov ntaub ntawv ua ntu zus (ntsis los ntawm me ntsis).

lo lus npaws yog feem ntau pom nyob rau hauv cov ntaub ntawv rau chips thiab yog txhais nyob rau hauv ntau txoj kev, yog li rau lub hom phiaj ntawm kev nkag siab kuv yuav tso cai rau kuv tus kheej.

ib qho kev kawm me meLED tsav tsheb yog qhov tseem ceeb ntawm kev hloov npe. "Shift" (ua haujlwm) nyob rau hauv lub npe - bitwise txav ntawm cov ntaub ntawv nyob rau hauv lub ntaus ntawv: txhua me ntsis tshiab shoved hauv pushes tag nrho cov saw rau pem hauv ntej ntawm nws. Txij li thaum tsis muaj leej twg xav soj ntsuam chaotic blinking ntawm LEDs thaum lub sij hawm ua hauj lwm, cov txheej txheem yuav siv sij hawm qhov chaw nyob rau hauv tsis muaj npe sib cais los ntawm lub chaw ua hauj lwm sau npe los ntawm ib tug damper (npaws) yog hom chav tos uas cov khoom tau teem rau hauv qhov xav tau ua ntu zus. Thaum txhua yam npaj txhij, lub kaw lus qhib thiab cov khoom mus ua haujlwm, hloov cov khoom qub dhau los. Lo lus npaws nyob rau hauv cov ntaub ntawv rau microcircuits yuav luag ib txwm implies xws li ib tug damper, txawm nyob rau hauv dab tsi ua ke nws yog siv.

Yog li, cov ntaub ntawv hloov mus rau DM634 yog ua raws li qhov no: teeb tsa DAI cov tswv yim rau tus nqi ntawm qhov tseem ceeb tshaj plaws ntawm qhov deb LED, rub DCK nce thiab nqis; teeb tsa DAI cov tswv yim rau tus nqi ntawm qhov tom ntej me ntsis, rub DCK; thiab lwm yam kom txog thaum tag nrho cov khoom tau raug xa mus (teev nyob rau hauv), tom qab ntawd peb rub LAT. Qhov no tuaj yeem ua tau manually (bit-bang), tab sis nws yog qhov zoo dua los siv SPI interface tshwj xeeb rau qhov no, txij li nws tau nthuav tawm ntawm peb STM32 hauv ob daim ntawv luam.

Blue Pill STM32F103

Taw qhia: STM32 cov tswj hwm muaj ntau qhov nyuaj dua li Atmega328 dua li lawv yuav zoo li txaus ntshai. Ntxiv mus, rau cov laj thawj ntawm kev txuag hluav taws xob, yuav luag tag nrho cov khoom siv hluav taws xob raug tua thaum pib, thiab lub moos zaus yog 8 MHz los ntawm qhov chaw sab hauv. Hmoov zoo, STM programmers tau sau cov lej uas coj cov nti mus rau "xam" 72 MHz, thiab cov kws sau ntawv ntawm txhua tus IDEs kuv paub suav nrog nws hauv cov txheej txheem pib, yog li peb tsis tas yuav moos (tab sis koj tuaj yeem yog koj xav tau tiag tiag). Tab sis koj yuav tau qhib lub peripheral.

Cov ntaub ntawv: Blue Pill yog nruab nrog nrov STM32F103C8T6 nti, muaj ob daim ntawv tseem ceeb rau nws:

Nyob rau hauv cov ntaub ntawv peb yuav txaus siab rau:

  • Pinouts - nti pinouts - yog tias peb txiav txim siab ua cov laug cam peb tus kheej;
  • Memory Map - daim ntawv qhia nco rau ib qho tshwj xeeb nti. Phau Ntawv Qhia siv muaj ib daim ntawv qhia rau tag nrho cov kab, thiab nws hais txog cov npe uas peb tsis muaj.
  • Pin lus txhais lus – teev lub ntsiab thiab lwm txoj hauj lwm ntawm pins; rau "blue ntsiav tshuaj" koj tuaj yeem pom cov duab yooj yim dua hauv Is Taws Nem nrog cov npe ntawm tus pins thiab lawv cov haujlwm. Yog li ntawd, peb tam sim ntawd google Blue Pill pinout thiab khaws daim duab no ntawm tes:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
NB: muaj qhov yuam kev hauv daim duab hauv Is Taws Nem, uas tau sau tseg hauv cov lus, ua tsaug rau qhov ntawd. Daim duab tau hloov lawm, tab sis qhov no yog ib zaj lus qhia - nws yog qhov zoo dua los xyuas cov ntaub ntawv tsis yog los ntawm cov ntaub ntawv.

Peb tshem tawm daim ntawv teev cov ntaub ntawv, qhib phau ntawv qhia siv, thiab txij no mus peb tsuas siv nws xwb.
Cov txheej txheem: peb cuam tshuam nrog tus qauv nkag / tawm, teeb tsa SPI, qhib cov khoom tsim nyog.

Input Output

Ntawm Atmega328, I / O tau siv yooj yim heev, uas yog vim li cas qhov kev xaiv ntau ntawm STM32 tuaj yeem ua rau tsis meej pem. Tam sim no peb tsuas xav tau cov lus xaus, tab sis txawm tias cov no muaj plaub txoj kev xaiv:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
qhib qhov dej, thawb-rub, lwm txoj kev thawb-rub, lwm qhov qhib dej

"Pull-push" (thawb-rub) yog cov zis ib txwm los ntawm Arduino, tus pin tuaj yeem coj tus nqi siab lossis qis. Tab sis nrog "qhib ntws" muaj nyuajTxawm hais tias qhov tseeb txhua yam yog qhov yooj yim ntawm no:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Output configuration / thaum qhov chaw nres nkoj raug muab tso rau tso zis: / tso zis tsis enabled: / – qhib ntws hom: "0" nyob rau hauv lub tso zis register enables N-MOS, "1" nyob rau hauv lub tso zis register tawm qhov chaw nres nkoj nyob rau hauv Hi-Z hom ( P-MOS tsis qhib ) / – thawb-rub hom: "0" nyob rau hauv cov zis tso zis tso npe qhib N-MOS, "1" nyob rau hauv cov zis tso npe activates P-MOS.

Txhua qhov sib txawv ntawm qhov qhib qhov dej (qhib qhov dej) los ntawm "push-rub" (thawb-rub) yog tias nyob rau hauv thawj tus pin tsis tuaj yeem lees txais HIGH lub xeev: thaum sau ib qho mus rau qhov tso zis tso npe, nws nkag mus rau hauv hom kev ua haujlwm siab (siab impedance, Nyob zoo-Z). Thaum sau xoom, tus pin coj tib yam hauv ob hom, ob qho tib si logically thiab hluav taws xob.

Nyob rau hauv ib txwm tso zis hom, tus pin tsuas yog tshaj tawm cov ntsiab lus ntawm cov ntawv tso zis tso zis. Hauv "lwm yam" nws yog tswj los ntawm cov khoom siv sib txuas (saib 9.1.4):

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Yog tias qhov chaw nres nkoj me me tau teeb tsa ua tus lej hloov pauv, tus lej sau npe yog neeg xiam thiab tus pin txuas nrog tus pin peripheral.

Lwm txoj haujlwm ntawm txhua tus pin tau piav qhia hauv Cov Ntsiab Lus Pin Cov ntaub ntawv yog nyob rau ntawm daim duab downloaded. Rau lo lus nug ntawm yuav ua li cas yog tus pin muaj ob peb lwm txoj haujlwm, cov lus teb tau muab los ntawm cov lus hauv qab hauv cov ntaub ntawv:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Yog tias ntau lub peripherals siv tib tus pin, kom tsis txhob muaj teeb meem ntawm lwm txoj haujlwm, tsuas yog ib qho peripheral yuav tsum tau siv ib lub sijhawm, toggled siv lub moos peripheral pab me ntsis (hauv RCC daim ntawv sau npe tsim nyog).

Thaum kawg, pins hauv cov zis hom kuj muaj lub moos ceev. Qhov no yog lwm qhov kev txuag hluav taws xob; nyob rau hauv peb rooj plaub, peb tsuas yog teem nws mus rau qhov siab tshaj plaws thiab tsis nco qab nws.

Yog li: peb tab tom siv SPI, uas txhais tau hais tias ob tus pins (nrog cov ntaub ntawv thiab nrog lub moos teeb liab) yuav tsum yog "lwm txoj haujlwm thawb-rub", thiab lwm tus (LAT) yuav tsum yog "kev thawb-rub". Tab sis ua ntej muab lawv, cia peb nrog SPI.

SPI

Lwm qhov kev kawm me me

SPI los yog Serial Peripheral Interface (serial peripheral interface) yog ib qho yooj yim thiab siv tau zoo heev rau kev sib txuas MK nrog lwm tus MKs thiab lub ntiaj teb sab nraud. Lub hauv paus ntsiab lus ntawm nws txoj haujlwm tau piav qhia saum toj no, qhov twg hais txog Suav LED tsav tsheb (hauv phau ntawv qhia siv, saib ntu 25). SPI tuaj yeem ua haujlwm hauv tus tswv ("tus tswv") thiab qhev (" qhev") hom. SPI muaj plaub txoj hauv paus, uas tsis yog txhua tus siv tau:

  • MOSI, Master Output / Slave Input: tus pin no xa cov ntaub ntawv hauv hom tswv, thiab tau txais cov ntaub ntawv hauv hom qhev;
  • MISO, Master Input / Slave Output: ntawm qhov tsis sib xws, nws tau txais hauv tus tswv, thiab xa mus rau hauv qhev;
  • SCK, Serial Clock: teeb tsa qhov zaus ntawm cov ntaub ntawv xa mus rau tus tswv lossis tau txais lub moos teeb liab hauv tus qhev. Yeej tseem ceeb ntaus ntaus;
  • SS, qhev Xaiv: nrog kev pab los ntawm cov channel no, tus qhev paub tias ib yam dab tsi xav tau los ntawm nws. Ntawm STM32 nws yog hu ua NSS, qhov twg N = negative, i.e. tus maub los ua qhev yog tias muaj av hauv qhov channel no. Nws ua ke zoo nrog Open Drain Output hom, tab sis qhov ntawd yog lwm zaj dab neeg.

Zoo li txhua yam ntxiv, SPI ntawm STM32 yog nplua nuj hauv kev ua haujlwm, uas ua rau nws nkag siab me ntsis. Piv txwv li, nws tuaj yeem ua haujlwm tsis yog nrog SPI nkaus xwb, tab sis kuj nrog I2S interface, thiab hauv cov ntaub ntawv lawv cov lus piav qhia yog sib xyaw, nws yog ib qho tsim nyog yuav tau txiav tawm qhov ntau dhau raws sijhawm. Peb txoj haujlwm yog qhov yooj yim heev: peb tsuas yog yuav tsum xa cov ntaub ntawv siv MOSI thiab SCK nkaus xwb. Peb mus rau ntu 25.3.4 (ib nrab-duplex kev sib txuas lus, ib nrab-duplex kev sib txuas lus), qhov twg peb pom 1 teev thiab 1 unidirectional cov ntaub ntawv xaim (1 moos teeb liab thiab 1 unidirectional cov ntaub ntawv ntws):

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Hauv hom no, daim ntawv thov siv SPI hauv kev xa tawm nkaus xwb lossis tau txais nkaus xwb hom. / Transmit-tsuas yog hom zoo ib yam li hom duplex: cov ntaub ntawv kis tau ntawm tus pin kis (MOSI hauv hom tswv lossis MISO hauv hom qhev), thiab tus txais tus pin (MISO lossis MOSI feem) tuaj yeem siv los ua I / O tus pin li niaj zaus. . Hauv qhov no, daim ntawv thov tsuas yog yuav tsum tsis quav ntsej Rx tsis pub (yog tias nws tau nyeem, yuav tsis muaj cov ntaub ntawv xa mus rau ntawd).

Zoo heev, MISO tus pin yog dawb, cia peb txuas LAT teeb liab rau nws. Cia peb saib Slave Select, uas ntawm STM32 tuaj yeem tswj tau qhov programmatically, uas yooj yim heev. Peb nyeem kab lus ntawm tib lub npe nyob rau hauv nqe lus 25.3.1 SPI General Description:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Software tswj NSS (SSM = 1) / Cov ntaub ntawv xaiv qhev muaj nyob rau hauv SSI me ntsis ntawm SPI_CR1 sau npe. Tus pin NSS sab nraud tseem pub dawb rau lwm qhov kev thov xav tau.

Nws yog lub sijhawm los sau rau cov npe. Kuv txiav txim siab siv SPI2, nrhiav nws qhov chaw nyob hauv cov ntaub ntawv - hauv ntu 3.3 Memory Map:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Zoo, cia peb pib:

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

Qhib ntu 25.3.3 nrog lub npe piav qhia tus kheej "Configuring SPI in Master Mode":

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

1. Teem lub moos zaus zaus nrog cov khoom BR[2:0] hauv SPI_CR1 sau npe.

Cov ntawv sau npe tau sau rau hauv phau ntawv qhia kev siv ntawm tib lub npe. Hloov chaw nyob (Chaw nyob offset) rau CR1 - 0x00, los ntawm lub neej ntawd tag nrho cov khoom raug tshem tawm (Pib dua tus nqi 0x0000):

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

BR cov khoom teeb tsa lub moos tswj lub moos, yog li txiav txim siab qhov zaus ntawm SPI yuav ua haujlwm. Peb STM32 zaus yuav yog 72 MHz, LED tsav tsheb, raws li nws cov ntaub ntawv, ua haujlwm nrog ntau zaus txog 25 MHz, yog li peb yuav tsum tau faib los ntawm plaub (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. Teem lub CPOL thiab CPHA cov khoom los txhais cov kev sib raug zoo ntawm cov ntaub ntawv hloov chaw thiab lub sij hawm serial moos (saib daim duab ntawm nplooj ntawv 240)

Txij li thaum peb tab tom nyeem ib daim ntawv teev cov ntaub ntawv ntawm no thiab tsis saib schematics, cia peb ua tib zoo saib cov lus piav qhia ntawm CPOL thiab CPHA cov khoom ntawm nplooj 704 (SPI General Description):

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Lub moos theem thiab polarity
Siv CPOL thiab CPHA cov khoom ntawm SPI_CR1 rau npe, koj tuaj yeem xaiv plaub lub sijhawm sib raug zoo. Lub CPOL (clock polarity) ntsis tswj lub xeev ntawm lub moos teeb liab thaum tsis muaj ntaub ntawv xa mus. Qhov no me ntsis tswj tus tswv thiab qhev hom. Yog tias CPOL rov pib dua, SCK tus pin yog qis hauv so hom. Yog tias CPOL me ntsis tau teeb tsa, SCK tus pin siab thaum lub sijhawm so.
Thaum lub CPHA (clock theem) ntsis yog teem, lub siab me ntsis ntxiab strobe yog lub thib ob ntug ntawm lub SCK teeb liab (poob yog hais tias CPOL yog ntshiab, nce yog CPOL yog teem). Cov ntaub ntawv raug ntes los ntawm qhov hloov thib ob hauv lub moos teeb liab. Yog tias CPHA me ntsis meej, qhov siab me ntsis ntxiab strobe yog qhov nce ntawm ntug ntawm SCK teeb liab (poob ntug yog CPOL tau teeb tsa, nce ntug yog CPOL raug tshem tawm). Cov ntaub ntawv raug ntes ntawm thawj qhov kev hloov pauv hauv lub moos teeb liab.

Tom qab nqus cov kev paub no, peb tuaj txog qhov xaus tias ob qhov khoom yuav tsum nyob zeros, vim tias Peb xav kom SCK teeb liab nyob twj ywm qis thaum tsis siv, thiab cov ntaub ntawv yuav tsum tau xa mus rau ntawm qhov nce ntawm cov mem tes (saib daim duab. Rising Ntug hauv DM634 datasheet).

Los ntawm txoj kev, ntawm no peb xub ntsib ib qho ntawm cov lus hauv ST datasheets: nyob rau hauv lawv cov kab lus "rov pib dua qhov me ntsis rau xoom" yog sau. rov pib dua me ntsisthiab tsis kom meej me ntsis, zoo li, piv txwv li, Atmega.

3. Teem lub DFF me ntsis los txiav txim seb cov ntaub ntawv thaiv yog 8-ntsis lossis 16-ntsis hom

Kuv tshwj xeeb coj 16-ntsis DM634 kom tsis txhob thab nrog kev xa 12-ntsis PWM cov ntaub ntawv, zoo li DM633. Nws ua rau kev txiav txim siab los teeb DFF rau ib qho:

#define DFF         0x0800

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

4. Configure LSBFIRST me ntsis hauv SPI_CR1 sau npe los txiav txim qhov thaiv hom

LSBFIRST, raws li nws lub npe qhia, teeb tsa kev sib kis nrog qhov tseem ceeb me ntsis ua ntej. Tab sis DM634 xav tau txais cov ntaub ntawv pib los ntawm qhov tseem ceeb tshaj plaws. Yog li ntawd, peb tawm nws rov pib dua.

5. Nyob rau hauv hom kho vajtse, yog xav tau cov tswv yim los ntawm NSS tus pin, siv lub teeb liab siab rau NSS tus pin thaum lub sij hawm tag nrho byte hloov ib ntus. Hauv NSS software hom, teeb tsa SSM thiab SSI cov khoom hauv SPI_CR1 rau npe. Yog tias NSS tus pin yuav tsum tau siv los ua qhov tso zis, tsuas yog SSOE me ntsis yuav tsum tau teeb tsa.

Nruab SSM thiab SSI kom tsis nco qab txog NSS kho vajtse hom:

#define SSI         0x0100
#define SSM         0x0200

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

6. Cov MSTR thiab SPE cov khoom yuav tsum tau teeb tsa (lawv nyob twj ywm yog tias NSS teeb liab siab)

Qhov tseeb, nrog rau cov khoom no peb xaiv peb SPI ua tus tswv thiab tig rau:

#define MSTR        0x0004
#define SPE         0x0040

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

SPI tau teeb tsa, cia tam sim sau cov haujlwm uas xa bytes rau tus tsav tsheb. Txuas ntxiv nyeem 25.3.3 "Configuring SPI in master mode":

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Kev txiav txim hloov ntaub ntawv
Kev xa tawm pib thaum ib byte sau rau Tx tsis tau.
Cov ntaub ntawv byte yog loaded rau hauv kev hloov npe ntawm thaum uas tig mus hom (los ntawm lub tsheb npav sab hauv) thaum lub sij hawm kis tau tus mob thawj me ntsis, tom qab uas nws yog kis mus rau ua ntu zus MOSI tus pin hom, thawj lossis kawg me ntsis rau pem hauv ntej nyob ntawm qhov chaw ntawm LSBFIRST me ntsis hauv CPI_CR1 sau npe. TXE chij yog teem tom qab xa cov ntaub ntawv los ntawm Tx buffer rau shift register, thiab tseem tsim kev cuam tshuam yog tias TXEIE me ntsis hauv CPI_CR1 sau npe tau teeb tsa.

Kuv tau hais txog ob peb lo lus hauv kev txhais lus kom nyiam rau ib qho ntawm qhov kev siv SPI hauv STM controllers. On Atmega TXE flag (Tx Empty, Tx yog khoob thiab npaj tau txais cov ntaub ntawv) tsuas yog tom qab tag nrho byte tau xa tawm. Thiab ntawm no tus chij no tau teeb tsa tom qab byte tau muab tso rau hauv kev hloov pauv sab hauv. Txij li thaum nws raug thawb rau ntawd nrog tag nrho cov khoom nyob rau tib lub sijhawm (nyob rau hauv parallel), thiab tom qab ntawd cov ntaub ntawv raug xa mus tas li, TXE tau teeb tsa ua ntej byte xa tag. Qhov no yog qhov tseem ceeb vim nyob rau hauv cov ntaub ntawv ntawm peb tus tsav tsheb LED, peb yuav tsum rub tus LAT tus pin tom qab xa ntawm txhua tus data, ib. TXE chij ib leeg yuav tsis txaus rau peb.

Qhov no txhais tau tias peb xav tau lwm tus chij. Cia peb saib ntawm 25.3.7 - "Status Flags":

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
<…>
Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
BUSY chij
Tus chij BSY tau teeb tsa thiab tshem tawm los ntawm kev kho vajtse (sau rau nws tsis muaj txiaj ntsig). BSY chij qhia lub xeev ntawm SPI kev sib txuas lus txheej.
Nws rov pib dua:
thaum kev hloov pauv tiav (tshwj tsis yog hauv hom tswv yog tias kev hloov mus tas li)
thaum SPI raug kaw
thaum muaj qhov yuam kev hom tswv (MODF=1)
Yog tias qhov kev hloov pauv tsis tas mus li, BSY chij raug tshem tawm ntawm txhua cov ntaub ntawv hloov chaw

Okay, qhov no yuav los ua ke. Cia peb kawm saib qhov twg Tx tsis nyob. Txhawm rau ua qhov no, nyeem "SPI Data Register":

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Bits 15:0 DR[15:0] Data Register
Cov ntaub ntawv tau txais lossis cov ntaub ntawv xa mus.
Cov ntaub ntawv sau npe tau muab faib ua ob qhov chaw - ib qho rau kev sau ntawv (xa mus tsis tau) thiab ib qho rau kev nyeem ntawv (tau txais tsis). Kev sau ntawv rau cov ntaub ntawv sau npe sau rau Tx tsis tau, thiab nyeem los ntawm cov ntaub ntawv sau npe yuav rov qab tus nqi muaj nyob hauv Rx tsis.

Zoo, thiab cov xwm txheej sau npe, qhov twg TXE thiab BSY chij tau pom:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Peb sau:

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

Zoo, txij li thaum peb yuav tsum xa 16 zaug ob bytes, raws li tus naj npawb ntawm LED tsav tsheb tso tawm, qee yam zoo li no:

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

Tab sis peb tsis paub yuav rub LAT tus pin li cas, yog li peb yuav rov qab mus rau I / O.

Muab tus pins

Hauv STM32F1, cov ntawv sau npe lub luag haujlwm rau lub xeev ntawm cov pins yog qhov txawv heev. Nws yog qhov tseeb tias lawv muaj ntau dua li Atmega, tab sis lawv kuj txawv ntawm lwm cov chips STM. Tshooj 9.1 Kev piav qhia dav dav ntawm GPIO:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Txhua lub hom phiaj I/O ports (GPIO) muaj ob daim ntawv teev npe 32-ntsis configuration (GPIOx_CRL thiab GPIOx_CRH), ob 32-ntsis cov ntaub ntawv sau npe (GPIOx_IDR thiab GPIOx_ODR), 32-ntsis teeb / rov pib sau npe (GPIOx_BSRR), 16-ntsis rov pib sau npe (GPIOx_BRR) thiab 32- bit blocking register (GPIOx_LCKR).

Thawj ob qhov kev sau npe yog qhov txawv txav, thiab kuj tsis yooj yim heev, vim tias 16 qhov chaw nres nkoj pins tau tawg mus thoob plaws lawv hauv hom "plaub ib tus kwv tij". Cov. tus pins xoom rau xya yog nyob rau hauv CRL, thiab tus so yog nyob rau hauv CRH. Nyob rau tib lub sijhawm, cov ntawv sau npe ntxiv ua tiav muaj cov khoom ntawm txhua tus pins ntawm qhov chaw nres nkoj - feem ntau tshuav ib nrab "tso tseg".

Rau qhov yooj yim, cia peb pib los ntawm qhov kawg ntawm daim ntawv teev npe.

Peb tsis xav tau daim ntawv sau npe thaiv.

Cov txheej txheem thiab rov pib dua cov ntawv sau npe yog qhov lom zem heev hauv qhov lawv ib feem sib tshooj: koj tuaj yeem sau txhua yam hauv BSRR, qhov siab dua 16 cov khoom yuav rov pib dua tus pin rau xoom, thiab cov qis dua yuav raug teeb tsa rau 1, lossis koj tuaj yeem ua tau. siv BRR, qis dua 16 khoom uas tsuas yog rov pib dua tus pin. Kuv nyiam qhov kev xaiv thib ob. Cov ntawv sau npe no tseem ceeb vim tias lawv muab atomic nkag rau pins:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Atomic Set lossis Reset
Tsis tas yuav lov tes taw cuam tshuam thaum programming GPIOx_ODR ntawm qib me ntsis: ib lossis ntau cov khoom tuaj yeem hloov pauv nrog ib qho atomic sau ua haujlwm APB2. Qhov no yog ua tiav los ntawm kev sau ntawv "1" rau qhov teeb tsa / rov pib sau npe (GPIOx_BSRR lossis, rau rov pib dua nkaus xwb, GPIOx_BRR) ntawm qhov me me uas yuav tsum tau hloov pauv. Lwm cov khoom yuav nyob twj ywm tsis hloov.

Cov ntaub ntawv sau npe muaj npe piav qhia tus kheej - IDR = Tswv yim Direction Register, input register; ODR = tso zis Direction Register, tso zis tso npe. Peb yuav tsis xav tau lawv hauv qhov project tam sim no.

Thiab thaum kawg, tswj kev sau npe. Txij li thaum peb txaus siab rau qhov thib ob SPI pins, uas yog PB13, PB14 thiab PB15, peb tam sim ntawd saib CRH:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Thiab peb pom tias peb yuav tsum tau sau ib yam dab tsi hauv cov khoom ntawm 20 txog 31.

Peb twb xam pom saum toj no qhov peb xav tau los ntawm tus pins, yog li ntawm no kuv yuav ua yam tsis muaj lub screenshot, Kuv tsuas yog hais tias MODE qhia txog cov kev taw qhia (cov tswv yim yog tias ob qho khoom raug teeb tsa rau 0) thiab tus pin ceev (peb xav tau 50MHz, i.e. ob tus pin rau "1"), thiab CNF teeb tsa hom: tsis tu ncua "rub-rub" - 00, "alternative" - ​​10. Los ntawm lub neej ntawd, raws li peb pom saum toj no, txhua tus pins muaj qhov thib peb ntawm hauv qab (CNF0), nws teem lawv mus rau hom ntab input.

Txij li thaum kuv npaj yuav ua lwm yam nrog cov nti no, rau qhov yooj yim kuv tau txhais txhua qhov ua tau MODE thiab CNF qhov tseem ceeb rau ob qho tib si qis thiab sab sauv tswj kev sau npe.

Cas zoo li no

#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

Peb cov pins nyob ntawm qhov chaw nres nkoj B (chaw nyob hauv paus - 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;

Thiab, raws li, koj tuaj yeem sau cov lus txhais rau LAT, uas yuav raug cuam tshuam los ntawm BRR thiab BSRR cov npe:

/*** 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 tsuas yog los ntawm inertia, nws ib txwm zoo li ntawd, cia nws nyob)

Tam sim no txhua yam zoo heev, tab sis nws tsis ua haujlwm. Vim tias qhov no yog STM32, lawv txuag hluav taws xob, uas txhais tau hais tias koj yuav tsum tau ua kom lub moos ntawm cov khoom siv uas xav tau.

Qhib clocking

Lub moos, tseem hu ua Clock, yog lub luag haujlwm rau clocking. Thiab peb tuaj yeem pom cov ntawv luv RCC. Peb nrhiav nws hauv cov ntaub ntawv: qhov no yog Pib dua thiab Clock Control.

Raws li tau hais los saum toj no, hmoov zoo, qhov nyuaj tshaj plaws ntawm lub sijhawm teev tau ua tiav rau peb los ntawm cov neeg los ntawm STM, uas peb ua tsaug rau lawv ntau heev (ib zaug kuv mam li muab qhov txuas rau Di Halt lub vev xaib, kom paub meej tias nws tsis meej pem li cas). Peb tsuas yog xav tau cov ntawv sau npe lub luag haujlwm rau kev ua kom lub sijhawm peripheral clocking (Peripheral Clock Enable Registers). Ua ntej, cia peb nrhiav lub hauv paus chaw nyob ntawm RCC, nws yog qhov pib ntawm "Memory Map":

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

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

Thiab tom qab ntawd yog nyem rau ntawm qhov txuas uas koj sim nrhiav ib yam dab tsi hauv lub phaj, lossis, zoo dua, mus los ntawm cov lus piav qhia ntawm kev tso npe nkag los ntawm cov ntu hais txog pab sau npe. Qhov twg peb yuav pom RCC_APB1ENR thiab RCC_APB2ENR:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Thiab lawv, raws li, muaj cov khoom uas suav nrog lub sijhawm ntawm SPI2, IOPB (I/O Port B) thiab lwm txoj haujlwm (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;

Cov lej kawg tuaj yeem pom S, SѓS,.

Yog tias koj muaj sijhawm thiab xav sim, ces txuas DM634 zoo li no: DAI rau PB15, DCK rau PB13, LAT rau PB14. Peb lub zog tsav tsheb los ntawm 5 volts, tsis txhob hnov ​​​​qab txuas lub hauv paus.

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

STM8 PWM

PWM on STM8

Thaum kuv nyuam qhuav npaj tsab xov xwm no, kuv tau txiav txim siab, ua piv txwv, sim ua kom paub qee qhov kev ua haujlwm ntawm cov nti tsis paub siv tsuas yog ib daim ntawv teev cov ntaub ntawv xwb, yog li kuv yuav tsis xaus nrog tus tsim khau tsis muaj khau. STM8 yog qhov zoo tagnrho rau lub luag haujlwm no: thawj zaug, kuv muaj ob peb lub rooj sib tham Suav nrog STM8S103, thiab qhov thib ob, nws tsis nrov heev, thiab yog li kev ntxias kom nyeem thiab nrhiav kev daws teeb meem hauv Is Taws Nem nyob ntawm qhov tsis muaj cov kev daws teeb meem no.

Lub chip kuj muaj daim ntawv qhia и Daim ntawv qhia RM0016, nyob rau hauv thawj zaug muaj pinout thiab sau npe chaw nyob, nyob rau hauv lub thib ob - txhua yam. STM8 yog programmed hauv C hauv IDE txaus ntshai ST Visual Develop.

Clocking thiab I / O

Los ntawm lub neej ntawd, STM8 ua haujlwm ntawm qhov zaus ntawm 2 MHz, qhov no yuav tsum raug kho tam sim ntawd.

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
HSI (High Speed ​​​​Internal) moos
Lub HSI moos teeb liab yog muab los ntawm ib qho 16 MHz RC oscillator nrog lub programmable divider (1 txog 8). Nws yog teem rau hauv lub moos divider register (CLK_CKDIVR).
Nco tseg: thaum pib, HSI RC oscillator nrog lub faib ntawm 8 yog xaiv los ua qhov tseem ceeb ntawm lub moos teeb liab.

Peb pom qhov chaw nyob rau hauv daim ntawv teev cov ntaub ntawv, cov lus piav qhia hauv refman thiab pom tias daim ntawv teev npe yuav tsum tau muab tshem tawm:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Txij li thaum peb yuav khiav PWM thiab txuas cov LEDs, cia saib lub pinout:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Lub nti yog me me, ntau lub luag haujlwm raug tshem tawm ntawm tib tus pins. Dab tsi yog nyob rau hauv square brackets yog "alternative functionality", nws yog switched los ntawm "option bytes" (kev xaiv bytes) - ib yam dab tsi zoo li Atmega fuses. Koj tuaj yeem hloov lawv cov txiaj ntsig programmatically, tab sis nws tsis tsim nyog, vim Cov haujlwm tshiab tsuas yog qhib tom qab rov pib dua. Nws yooj yim dua los siv ST Visual Programmer (downloaded nrog Visual Develop), uas tuaj yeem hloov cov bytes no. Lub pinout qhia tau hais tias CH1 thiab CH2 tus pins ntawm thawj timer tau muab zais rau hauv square brackets; Nws yog ib qho tsim nyog los teeb tsa AFR1 thiab AFR0 cov khoom hauv STVP, thiab qhov thib ob tseem yuav hloov CH1 cov zis ntawm lub sijhawm thib ob los ntawm PD4 rau PC5.

Yog li, 6 tus pins yuav tswj cov LEDs: PC6, PC7 thiab PC3 rau thawj timer, PC5, PD3 thiab PA3 rau qhov thib ob.

Kev teeb tsa I / O tus pins lawv tus kheej ntawm STM8 yog qhov yooj yim dua thiab muaj txiaj ntsig ntau dua li ntawm STM32:

  • paub los ntawm Atmega DDR cov ntaub ntawv qhia kev sau npe (Daim ntawv qhia kev sau npe): 1 = tso zis;
  • thawj tswj sau npe CR1, thaum tso zis, teeb tsa lub laub-rub hom (1) lossis qhib ntws (0); txij li thaum kuv txuas cov LEDs rau lub nti nrog cathodes, kuv tawm zeros ntawm no;
  • qhov thib ob tswj sau npe CR2, thaum tso zis, teev lub moos ceev: 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

Ua ntej, cia peb txhais cov ntsiab lus:

  • PWM Zaus - zaus uas lub timer zuam;
  • Auto-reload, AR - autoloadable tus nqi mus txog qhov uas timer yuav suav (pulse lub sij hawm);
  • Update Event, UEV - ib qho xwm txheej uas tshwm sim thaum lub sij hawm tau suav rau AR;
  • PWM Duty Cycle - PWM lub voj voog lub luag haujlwm, feem ntau hu ua "duty factor";
  • Capture / Sib piv tus nqi - tus nqi rau kev ntes / kev sib piv, uas lub timer tau suav yuav ua ib yam dab tsi (nyob rau hauv rooj plaub ntawm PWM, nws inverts lub teeb liab tso zis);
  • Preload tus nqi - tus nqi preloaded. Sib piv tus nqi tsis tuaj yeem hloov thaum lub sijhawm teem sijhawm, txwv tsis pub lub voj voog PWM yuav tawg. Yog li ntawd, cov nqi xa tawm tshiab tau muab tso rau hauv qhov tsis muaj thiab rub tawm thaum lub sijhawm timer mus txog qhov kawg ntawm nws qhov kev suav rov qab thiab rov pib dua;
  • Ntug-aligned и Cov hom hauv nruab nrab - kev sib raug zoo raws ciam teb thiab hauv nruab nrab, tib yam li Atmel's PWM ceev и Phase-correct PWM.
  • OCiREF, Tso Tawm Sib Piv Cov Lus Qhia - siv cov teeb liab tso tawm, qhov tseeb, qhov tshwm sim ntawm tus pin sib thooj hauv PWM hom.

Raws li twb tau hais meej los ntawm pinout, ob lub sijhawm muaj peev xwm PWM - thawj thiab thib ob. Ob leeg yog 16-ntsis, thawj zaug muaj ntau yam ntxiv (tshwj xeeb, nws tuaj yeem suav ob qho tib si nce thiab nqis). Peb xav tau ob qho tib si ua haujlwm sib npaug, yog li kuv txiav txim siab pib nrog qhov pom tseeb tsis zoo thib ob, yog li tsis txhob siv qee yam uas tsis nyob ntawd. Qee qhov teeb meem yog qhov kev piav qhia ntawm PWM kev ua haujlwm ntawm txhua tus timers hauv phau ntawv siv yog nyob rau hauv tshooj txog thawj timer (17.5.7 PWM hom), yog li koj yuav tsum dhia rov qab mus rau hauv cov ntaub ntawv txhua lub sijhawm.

PWM ntawm STM8 muaj qhov txiaj ntsig tseem ceeb tshaj PWM ntawm Atmega:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Boundary Aligned PWM
Account configuration ntawm qab mus rau sab saum toj
Kev suav hauv qab yog ua haujlwm yog tias DIR ntsis hauv TIM_CR1 sau npe raug tshem tawm
Piv Txwv:
Cov piv txwv siv thawj PWM hom. PWM siv lub teeb liab OCiREF yog nyob siab ntev li TIM1_CNT < TIM1_CCRi. Txwv tsis pub nws yuav siv qib qis. Yog tias qhov sib piv tus nqi hauv TIM1_CCRi sau npe ntau dua tus nqi autoload (TIM1_ARR sau npe), OCiREF teeb liab yog tuav ntawm 1. Yog tias qhov sib piv tus nqi yog 0, OCiREF yog nyob ntawm xoom....

STM8 timer thaum lub sijhawm hloov tshiab xwm txheej kuaj ua ntej piv tus nqi, thiab tsuas yog tom qab ntawd tsim cov teeb liab siv. Atmega's timer thawj zaug screws thiab tom qab ntawd sib piv, ua rau compare value == 0 cov zis yog ib rab koob, uas yuav tsum tau ua nrog qee yam (piv txwv li, los ntawm programmatically inverting lub logic).

Yog li peb xav ua: 8-ntsis PWM (AR == 255), suav los ntawm hauv qab mus rau sab saum toj, sib dhos raws ciam teb. Txij li thaum lub teeb qhov muag teev tau txuas nrog lub nti los ntawm cathodes, PWM yuav tsum tso tawm 0 (LED rau) txog thaum piv tus nqi thiab 1 tom qab.

Peb twb tau nyeem txog ib co PWM mode, yog li peb pom qhov yuav tsum tau sau npe ntawm lub sijhawm thib ob los ntawm kev tshawb nrhiav hauv phau ntawv qhia siv rau kab lus no (18.6.8 - TIMx_CCMR1):

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
110: Thawj PWM hom - thaum suav los ntawm hauv qab mus rau sab saum toj, thawj cov channel ua haujlwm thaum TIMx_CNT < TIMx_CCR1. Txwv tsis pub, thawj channel tsis ua haujlwm. [Ntxiv rau hauv cov ntaub ntawv muaj ib qho yuam kev luam-paste los ntawm timer 1] 111: Thib ob PWM hom - thaum suav los ntawm qab mus rau sab saum toj, thawj channel tsis ua haujlwm thaum TIMx_CNT < TIMx_CCR1. Txwv tsis pub, thawj channel yog nquag.

Txij li cov LEDs txuas nrog MK los ntawm cathodes, hom thib ob haum rau peb (thawj ib yam nkaus, tab sis peb tsis paub qhov ntawd).

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Bit 3 OC1PE: Qhib tus pin 1 preload
0: Preload register ntawm TIMx_CCR1 yog neeg xiam. Koj tuaj yeem sau rau TIMx_CCR1 txhua lub sijhawm. Tus nqi tshiab ua haujlwm tam sim ntawd.
1: Preload sau npe ntawm TIMx_CCR1 tau qhib. Nyeem / sau cov haujlwm nkag mus rau lub npe preload. Tus nqi preloaded TIMx_CCR1 yog loaded rau hauv tus duab ntxoov ntxoo sau npe thaum lub sij hawm txhua qhov kev hloov tshiab.
* Ceeb Toom: Rau PWM hom ua haujlwm zoo, cov ntawv sau npe ua ntej yuav tsum tau qhib. Qhov no tsis tsim nyog nyob rau hauv ib qho teeb liab hom (OPM me ntsis yog teem rau hauv TIMx_CR1 sau npe).

Okay, cia peb tig rau txhua yam peb xav tau rau peb channel ntawm lub sijhawm thib ob:

#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 muaj ob yim-ntsis sau npe, txhua yam yooj yim:

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Lub sijhawm thib ob tuaj yeem suav los ntawm hauv qab mus rau sab saum toj, kev sib dhos raws ciam teb, tsis muaj dab tsi yuav tsum tau hloov pauv. Cia peb teeb lub zaus faib, piv txwv li, rau 256. Rau qhov thib ob timer, lub divider yog teem rau hauv TIM2_PSCR sau npe thiab yog lub hwj chim ntawm ob:

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Txhua yam uas tseem tshuav yog tig rau cov lus xaus thiab lub sijhawm thib ob nws tus kheej. Thawj qhov teeb meem yog daws los ntawm kev sau npe Capture / Sib piv pab kom: muaj ob, peb txoj kab sib faib thoob plaws lawv asymmetrically. Ntawm no peb tuaj yeem kawm tau tias nws tuaj yeem hloov pauv lub polarity ntawm lub teeb liab, i.e. hauv paus ntsiab lus, nws muaj peev xwm siv PWM hom 1. Peb sau:

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

Thiab thaum kawg, peb pib timer hauv TIMx_CR1 sau npe:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Cia peb sau ib qho yooj yim analogue ntawm AnalogWrite(), uas yuav hloov cov nqi tiag tiag rau lub sijhawm rau kev sib piv. Cov ntawv sau npe tau twv ua ntej Capture / Sib piv cov npe, muaj ob ntawm lawv rau txhua tus channel: qhov qis-qib 8 khoom hauv TIM2_CCRxL thiab cov xaj siab hauv TIM2_CCRxH. Txij li thaum peb tau tsim 8-ntsis PWM, nws txaus los sau tsuas yog cov khoom tseem ceeb tshaj plaws:

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

Tus neeg nyeem ntawv yuav pom tias peb muaj qhov tsis zoo me ntsis PWM, tsis tuaj yeem tsim 100% sau (ntawm tus nqi siab tshaj plaws ntawm 255, lub teeb liab hloov mus rau ib lub sijhawm timer). Rau LEDs qhov no tsis muaj teeb meem, thiab cov neeg nyeem nyeem tau tuaj yeem twv seb yuav kho nws li cas.

PWM ntawm lub sijhawm thib ob ua haujlwm, cia peb txav mus rau thawj zaug.

Thawj timer muaj raws nraim tib yam khoom hauv tib cov ntawv sau npe (nws tsuas yog tias cov khoom uas tseem "tso tseg" hauv lub sijhawm thib ob tau nquag siv thawj zaug rau txhua yam khoom siab). Yog li ntawd, nws yog txaus kom nrhiav tau qhov chaw nyob ntawm tib lub npe hauv cov ntaub ntawv thiab luam cov cai. Zoo, hloov tus nqi ntawm qhov sib faib zaus, vim ... thawj timer xav tau txais tsis yog lub zog ntawm ob, tab sis qhov tseeb 16-ntsis tus nqi hauv ob lub npe Prescaler Siab и Tsawg. Peb ua txhua yam thiab ... thawj timer tsis ua haujlwm. Dab tsi yog qhov teeb meem?

Qhov teeb meem tsuas yog daws tau los ntawm kev saib tag nrho cov ntu hais txog kev tswj cov ntawv teev npe ntawm timer 1, qhov twg peb tab tom nrhiav ib qho uas lub sijhawm thib ob tsis muaj. Yuav muaj 17.7.30 Nws. (TIM1_BKR), qhov twg muaj qhov no me ntsis:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Qhib lub ntsiab tso zis

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Qhov ntawd yog txhua yam kom paub meej tam sim no, cov cai nyob ntawd.

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

STM8 Multiplex

Multiplexing ntawm STM8

Qhov thib peb qhov project mini yog txuas yim RGB LEDs rau lub sijhawm thib ob hauv PWM hom thiab ua rau lawv pom cov xim sib txawv. Nws yog raws li lub tswv yim ntawm LED multiplexing, uas yog hais tias yog tias koj tig rau thiab tawm LEDs heev, sai heev, nws yuav zoo li peb tias lawv nyob tas li (kev tsis pom kev, inertia ntawm kev pom kev pom). Kuv ib zaug ua ib yam dab tsi zoo li no ntawm Arduino.

Lub algorithm ua haujlwm zoo li no:

  • txuas lub anode ntawm thawj RGB LED;
  • teeb nws, xa cov cim tsim nyog rau cathodes;
  • tos kom txog thaum kawg ntawm lub voj voog PWM;
  • txuas lub anode ntawm ob RGB LED;
  • lit nws...

Zoo, thiab lwm yam. Tau kawg, rau kev ua haujlwm zoo nkauj nws yuav tsum tau ua kom lub anode txuas thiab LED yog "ignited" tib lub sijhawm. Zoo, los yog yuav luag. Nyob rau hauv txhua rooj plaub, peb yuav tsum tau sau ib tug code uas yuav tso tawm qhov tseem ceeb nyob rau hauv peb raws ntawm lub thib ob timer, hloov lawv thaum UEV mus txog, thiab nyob rau tib lub sij hawm hloov lub tam sim no active RGB LED.

Txij li thaum hloov pauv LED yog tsis siv neeg, peb yuav tsum tsim "video nco" los ntawm qhov cuam tshuam tus tuav yuav tau txais cov ntaub ntawv. Nov yog ib qho yooj yim array:

uint8_t colors[8][3];

Txhawm rau hloov cov xim ntawm ib qho LED tshwj xeeb, nws yuav txaus los sau cov txiaj ntsig xav tau rau hauv cov array no. Thiab qhov sib txawv yuav yog lub luag haujlwm rau tus naj npawb ntawm cov active LED

uint8_t cnt;

Demux

Txhawm rau kom muaj txiaj ntsig zoo, peb xav tau, oddly txaus, CD74HC238 demultiplexer. Demultiplexer - ib tug nti uas siv tus neeg teb xov tooj hauv kho vajtse <<. Los ntawm peb lub tswv yim pins (ntsis 0, 1 thiab 2) peb pub nws peb-ntsis tus lej X, thiab hauv kev teb nws qhib cov lej tso tawm (1<<X). Cov khoom siv ntxiv ntawm cov nti yog siv los ntsuas tag nrho cov qauv tsim. Peb xav tau cov nti no tsis tsuas yog txo cov naj npawb ntawm cov pins nyob ntawm lub microcontroller, tab sis kuj muaj kev nyab xeeb - yog li tsis txhob cuam tshuam ntau dua LEDs ntau dua li qhov ua tau thiab tsis hlawv MK. Cov nti raug nqi ib npib nyiaj thiab yuav tsum tau khaws cia rau hauv koj lub tsev tshuaj txee.

Peb CD74HC238 yuav ua lub luag haujlwm rau muab qhov hluav taws xob rau lub anode ntawm LED xav tau. Nyob rau hauv ib tug puv-fledged multiplex, nws yuav muab hluav taws xob rau kem los ntawm ib tug P-MOSFET, tab sis nyob rau hauv no demo nws yog ua tau ncaj qha, vim hais tias Nws kos 20 mA, raws li qhov kev ntsuas siab tshaj plaws hauv daim ntawv qhia. Los ntawm Cov ntaub ntawv CD74HC238 peb xav tau pinouts thiab no cheat sheet:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
H = high voltage theem, L = low voltage, X – tsis tu

Peb txuas E2 thiab E1 rau hauv av, E3, A0, A1 thiab A3 rau pins PD5, PC3, PC4 thiab PC5 ntawm STM8. Txij li cov lus saum toj no muaj ob theem qis thiab siab, peb teeb tsa cov pins li thawb-rub pins.

PWM

PWM ntawm lub sijhawm thib ob yog teeb tsa tib yam li hauv zaj dab neeg dhau los, nrog ob qhov sib txawv:

Ua ntej, peb yuav tsum pab kom muaj kev cuam tshuam rau Hloov tshiab Event (UEV) uas yuav hu ua lub luag haujlwm uas toggles lub active LED. Qhov no yog ua los ntawm kev hloov me ntsis Hloov tshiab Interrupt Enable nyob rau hauv ib daim ntawv teev npe

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
Interrupt enable register

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Qhov thib ob sib txawv yog hais txog qhov tshwm sim ntawm multiplexing, xws li dab neeg - parasitic glow ntawm diodes. Hauv peb qhov xwm txheej, nws yuav tshwm sim vim qhov tseeb tias lub sijhawm teem sijhawm, tau ua rau muaj kev cuam tshuam ntawm UEV, txuas ntxiv zuam, thiab tus neeg saib xyuas cuam tshuam tsis muaj sijhawm los hloov LED ua ntej lub sijhawm pib sau ib yam dab tsi rau tus pins. Txhawm rau tiv thaiv qhov no, koj yuav tsum tau hloov lub logic (0 = qhov siab tshaj plaws ci ntsa iab, 255 = tsis muaj dab tsi yog lit) thiab tsis txhob muaj lub luag haujlwm hnyav. Cov. xyuas kom meej tias tom qab UEV cov LEDs tawm tag nrho rau ib lub voj voog PWM.

Hloov polarity:

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

Tsis txhob teeb tsa r, g thiab b rau 255 thiab nco ntsoov hloov lawv thaum siv lawv.

Kev cuam tshuam

Lub ntsiab lus ntawm kev cuam tshuam yog tias nyob rau hauv qee qhov xwm txheej lub nti nres ua tiav cov haujlwm tseem ceeb thiab hu rau qee qhov haujlwm sab nraud. Kev cuam tshuam tshwm sim vim muaj kev cuam tshuam sab nraud lossis sab hauv, nrog rau lub sijhawm.

Thaum peb xub tsim ib qhov project hauv ST Visual Develop, ntxiv rau main.c peb tau txais lub qhov rais nrog cov ntaub ntawv tsis meej stm8_interrupt_vector.c, cia li suav nrog hauv qhov project. Hauv cov ntaub ntawv no, ib txoj haujlwm raug muab rau txhua qhov cuam tshuam NonHandledInterrupt. Peb yuav tsum khi peb txoj haujlwm rau qhov xav tau cuam tshuam.

Cov ntaub ntawv muaj ib lub rooj ntawm kev cuam tshuam vectors, qhov twg peb pom cov uas peb xav tau:

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8
13 TIM2 update/overflow
14 TIM2 capture/compare

Peb yuav tsum hloov lub LED ntawm UEV, yog li peb xav tau kev cuam tshuam #13.

Raws li, ua ntej, hauv cov ntaub ntawv stm8_interrupt_vector.c Hloov lub npe ua haujlwm ntawm lub luag haujlwm rau kev cuam tshuam No. 13 (IRQ13) rau koj tus kheej:

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

Qhov thib ob, peb yuav tau tsim cov ntaub ntawv main.h nrog cov ntsiab lus hauv qab no:

#ifndef __MAIN_H
#define __MAIN_H

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

Thiab thaum kawg, sau cov haujlwm no hauv koj li 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;
}

Txhua yam uas tseem tshuav yog ua kom muaj kev cuam tshuam. Qhov no yog ua tiav siv cov lus txib assembler rim - Koj yuav tsum nrhiav nws hauv Programming Phau Ntawv:

//enable interrupts
_asm("rim");

Lwm cov lus txib assembler yog sim - kaw kev cuam tshuam. Lawv yuav tsum raug muab tua thaum qhov tseem ceeb tshiab tau sau rau "video nco", yog li ntawd qhov kev cuam tshuam los ntawm lub sijhawm tsis ncaj ncees lawm tsis ua rau cov khoom tawg.

Tag nrho cov code - ntawm GitHub.

Nyeem cov ntaub ntawv 2: SPI ntawm STM32; PWM, timers and interrupts on STM8

Yog tias tsawg kawg ib tus neeg pom cov ntawv no muaj txiaj ntsig, ces kuv tsis tau sau nws tsis muaj nuj nqis. Kuv yuav zoo siab tau txais cov lus thiab cov lus hais, Kuv yuav sim teb txhua yam.

Tau qhov twg los: www.hab.com

Ntxiv ib saib