Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

В in prima parte, Conatus sum indicare fabrum electronicarum amabam qui ab Arduino braccas creverunt quomodo et cur datas cartas legerent et alia documenta pro microcontrolers. Textus magnus evasit, ergo pollicitus sum exempla practica in uno articulo demonstrare. Bene se appellabat fungus lac.

Hodie monstrabo tibi quomodo schedulis utaris ad solvendum satis simplex, sed necessarium multis inceptis, muneribus in STM32 (Blue Pill) et STM8 moderatoris. Omnia demo incepta dicata meis dilectis LEDs, eas in magna quantitate accendemus, quibus omnibus iucunda periphericis uti debebimus.

Textus iterum ingens evasit, ut commodum contentus sum:

STM32 Blue Pill: XVI LEDs cum DM16 exactoris
STM8: constituens PWM sex paxillos
STM8: VIII RGB LEDs in tribus paxillis obloquitur

Disclaimer: ingeniarius non sum, altam scientiam in electronicis habere non simulo, articulus amateurs similis mei destinatur. Revera biennio ante consideravi ut scopum audientium. Si quis mihi indicasset tunc chartas schedae ignotae in scalpello incognitas non esse FORMIDULOSUS ut legerem, non multum temporis quaesivi in ​​Interreti fragmenta quaedam codicis et fuscinulas cum forfice et taenia tenaces inveniendi.

Focus huius articuli in schedae datae, non inceptae, ut signum non sit nimis nitidum et saepe coartatum. Negotiones ipsae sunt valde simplices, licet primae notitiae novae spumae aptae sint.

Spero quod articulus meus aliquem adiuvabit in simili statu immersionis in amabam.

STM32

XVI LEDs cum DM16 et SPI

Parva propositio utens Blue Pill (STM32F103C8T6) et DM634 exactoris DUXERIT. Tabulae datae utentes, aurigam STM IO portus figurabimus et SPI figurabimus.

DM634

Chipum Taiwanese cum 16 16-bit PWM outputibus coniungi potest in vinculis. Low-finem 12-bit exemplar notum est ex project domestico Lightpack. Uno tempore, eligens inter DM63x et TLC5940 notos, compluribus de causis elegi DM: 1) TLC in Aliexpress definite fictus est, sed hic non est; 2) DM sui iuris frequentiam generans habet PWM; 3) vilius Moscuae emi potuit quam exspectans particulam ab Ali. Et, sane, studium fuit discere quomodo te ipsum chip regere, quam prompto bibliothecae factae utens. Astulae nunc maxime in involucro SSOP24 exhibentur, facilia sunt ad solidiora adaptori.

Cum fabrica Taiwanese datasheet chip Anglice scripta in Sinica, quod significat illud erit iocum. Primum intueri pinout (Pin Connection) utro crure iungat quid , ac fibularum descriptionem .pin Description). 16 fibulae;

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
DC Sink Sources (Open Exhaurire)

Submerge / Aperto-exhaurire output — exhaurire; fons influens vena; the output is connected to ground in activo statu - LEDs are connected with driver by cathodes. Electrice, hoc est, utique, non "detrito aperto" (aperta exhauriunt) , sed in schedulis saepissime haec designatio pro paxillis in modus exhauriendis invenitur.

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Resistentes externi inter REXT et GND ut output monetae publicae

Relatio resistor instituitur inter REXT clavum et terram, quae resistentiam internam outputorum regit, vide graphum in pagina 9 paginae notae. In DM634, haec resistentia etiam per programmatum moderari potest, cum in altiore splendore ponitur (global claritas); Singula in hoc articulo non ingrediar, ego modo 2.2 - 3 kOhm resistor hic ponam.

Ut scias quomodo intelligas moderari, inspiciamus descriptionem instrumenti instrumenti:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Yeah, hic est, Chinese Anglis in omni gloria sua. Translatio haec problematica est, intelligere potes si vis, sed alius modus est - vide quomodo nexus cum similibus TLC5940 in notitia schedae descriptus est:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
... Tantum tres fibulae notitiae in notam ingrediuntur. Ortus ortu SCLK notae notitias e clavo ad tabulam internum transfert. Postquam omnia indicia onerata sunt, signum breve altum XLAT evinctum, quae notitias consequenter in tabulas internas transfert. Tabulae internae portae in gradu XLAT signo excitatae sunt. Omnia notitia prima momentis insignium transmittitur.

Claustrum - pessulus / pessulus / pessulus.
Resurgens ora - ducit ore pulsus
MSB primum - insignium (leftmost) paulum deinceps.
ad horologium data - transmittunt notitia continue (per partes).

sermo pessulus saepe in documentis pro astularum invenitur et variis modis transfertur, sic intellegendi causa me patiar

parva institutionis progressioAgitator DUCTUS essentialiter mandare trabea est. "Vertere" (subcinctus) in nomine - bitwise motus notitiarum intra machinam: unumquodque novum frenum detrusum intus protrudit totam catenam ante ipsam. Cum nemo observare velit tenebrarum blinking LEDs in transpositione, processus fit in tabulatis quiddam distinctum ab operantibus tabulariis per damper (pessulus) est genus spei locus ubi freni in optata serie disponuntur. Cum omnia parata sunt, shutter aperit, frena ad opus faciendum, priorem massam reponat. Verbum pessulus in documentis pro microcircuitibus fere semper talem damper implicat, in quibuscunque combinationibus adhibetur.

Ita, notitia translationis ad DM634 exercetur sic: DAI input ad valorem insignium tantillum longi LED, trahere DCK sursum et deorsum; DAI input pone ad valorem alterius frenum, collige DCK; et sic deinceps usque ad omnes partes traductae sunt ( . )clocked in *) post quem LAT trahimus. Hoc manually fieri potest (frenum-bang) , sed praestat SPI interfaciei specialiter ad hoc formandam uti, cum in duobus exemplaribus nostro STM32 exhibeatur.

Blue Pill STM32F103

Introductorium: STM32 moderatores multo magis implicati sunt quam Atmega328 quam formidulose videri possent. Praeterea, ob rationes energiae salutaris, omnes fere peripherales in initio aversae sunt, et frequentia horologii 8 MHz ab interno fonte est. Fortunate STM programmarii codicem scripsit qui spumam ad "calculatum" 72 MHz adducit, et omnium IDuum quas novi auctores in processu initializationi comprehendisse scio, horologio non opus est (sed potes, si vere vis). Sed vertere debebis in peripherals.

Documenta: Pillula caerulea cum chip STM32F103C8T6 populari instructa, duo documenta utilia ei sunt;

In datasheet possumus interesse in:

  • Pinouts - chip pinouts - in casu quod ipsi tabulas facere constituimus;
  • Map memoriae - map memoriae pro certo chip. Relatio Manualis chartam totius lineae habet, et registra commemorat quae nostros non habent.
  • Acus Definitiones tabulae principales et alternae fibulas enumerat; nam picturas "hyacinthini" commodiores in Interreti reperire potes cum indice fibularum et functionum. Ergo statim google Pillula caerulea nos pinout et hanc imaginem in manu tenemus:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
NB: error fuit in pictura ex interreti, quod in commentis notabatur, tibi gratias ago. Pictura reposita est, sed haec lectio est - melius est notitias non ex schedulis compescere.

Data scheda removemus, Relatio Manualis aperimus, eoque posthac tantum utimur.
De modo procedendi: input/output vexillum tractamus, configurare SPI, in necessariis periphericis verte.

Input output

De Atmega328, I/O perquam simpliciter perficitur, quare abundantia optionum STM32 confundi potest. Nunc conclusionibus tantum indigemus, sed etiam hae quattuor bene habent:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
apertum exhaurire, dis-traho, alternative dis-traho, alternative open drain

"dis-traho" (viverra urna) usitatum est ab Arduino coactum, clavum valorem vel ALTUM vel SUBJECTUM accipere potest. Sed cum "patentibus exhauriendis" sunt difficultatibusquamvis tamen omnia simplicia sint;

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Output configuration / cum portus attribuitur output: / output quiddam enabled: / - aperta exhauriunt modum: "0" in registro output dat N-MOS, "1" in output registri relinquit portum in modo Hi-Z ( P-MOS non reducitur ) / modum viverra urna: "0" in tabulario output operatur N-MOS, "1" in tabulario output actuat P-MOS.

Discrimen inter aperta exhaurire (aperta exhauriunt) Ex "dis-traho" (viverra urna) est in primo clavo statum ALTUM accipere non posse: cum scribens unum ad output tabularium, in modum repugnantiae ingreditur (excelsum impedimentum, Hi-Z*). Cum nulla scriptura, clavus in utroque modo, et logice et electrically se gerit.

In normali output modo, paxillus simpliciter transmittit contenta output mandare. In "alternativo" per peripherales correspondentes regitur (cf. 9.1.4);

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Si frenum in alterna functione clavum configuratur, actis mandare debilis est et paxillus periphericis clavo iungitur.

Officialis alternativa singulorum clavorum describitur Definitiones pin Datasheet est imago receptae. Ad quaestionem quid faciendum si clavus plura officia habeat, respondetur per nota in scheda:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Si plures peripherales eodem clavo utantur, ad vitandum conflictum inter functiones alternativas, una tantum peripherica ad tempus utendum est, utens horologii peripherici frenum (in congruo RCC registro).

Denique fibulae in output modum etiam celeritatem horologii habent. Haec alia industria salvifica est, in casu nostro, eam ad maximam modo ponemus et obliviscamur.

Ita: utimur SPI, quod significat duos fibulas (ex data et horologii signo) debere esse "munus dis-traho alternum", alterum "dis-traho iusto". Sed antequam eas adiuves, agamus cum SPI.

SPI

Alius parva institutionis progressio

SPI seu Serial interface periphericum (Vide interface periphericum) est interfacies simplex et efficacissima ad iungendum MK cum aliis MKs et extra in genere. Principium operationis suae iam supra descriptum est, ubi de Sinensi auriga DUXERIT (in the reference manual, see section 25). SPI in domino (“domini”) et servo (“servi”) modo operari potest. SPI quattuor praecipuas canales habet, quarum non omnes adhiberi possunt;

  • MOSI, Magister Output / Servus Input: hic paxillus notitias in modum domini transmittit, et in servo modum notitias accipit;
  • MISO, Magister Input / Servus Output: imo recipit in dominum et in servum transmittit;
  • SCK, Serial Horologium: frequentia notitiarum transmissio in domino ponit aut horologium signum in servo accipit. Per se verberat percutit;
  • SS, Slava Selecta: adiuvante hoc canali, servus scit aliquid ab eo deesse. Die STM32 dicitur NSS, ubi N = negativa, i.e. gubernator servus fit, si in hoc canali teritur. Bene coniungit cum modum Open Exhaurire Output, sed aliam fabulam esse.

Sicut omnia alia, SPI in STM32 officinas dives est, quae aliquantum difficilis intellectui reddit. Exempli gratia, operari non solum cum SPI, sed etiam cum I2S interface, et in documentis eorum descriptiones permiscentur, necesse est excessum tempestive abscindere. Nostrum negotium perquam simplex est: tantum opus est notitias mittere utentes modo MOSI et SCK. Ad sectionem 25.3.4 accedimus (communicatio dimidia duplex, communicatio dimidia duplex), ubi invenimus I horologium et I unidirectional data filum (1 signum horologii et 1 unidirectional datae amnis);

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Hoc modo, applicatio adhibet SPI in vel transmittendo tantum vel modo accipiendo. / Transmit-unus modus duplex modus est similis: notitia transmittit in clavum transmissum (MOSI in modo domini vel MISO in modum servilem), et paxillus (MISO vel MOSI respective) adhiberi potest ut regularis I/O paxillus . Hoc in casu, applicatio solum quiddam Rx ignorare debet (si legatur, nulla translatio notitiarum ibi erit).

Magnus, MISO paxillus immunis est, signum LAT connectamus. Intueamur Slavum Lego, quod in STM32 programmatice regi potest, quod perquam commodum est. Ejusdem nominis legitur paragrapho in sectione 25.3.1 SPI Descriptio Generalis:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Software imperium NSS (SSM = 1) / Informationes selectae servi in ​​SSI frenum de SPI_CR1 mandare continentur. NSS paxillus externa ad alias applicationes necessitates libera manet.

Tempus est tabulas scribere. SPI2 uti decrevi, eius basim inscriptionem electronicam in pagina data quaeramus - in sectione 3.3 Memoriae Tabulae:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Bene, incipiamus:

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

Pars aperta 25.3.3 cum titulo auto-explatorio "Configing SPI in Mode Magistro":

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

1. Vide horologium frequentiam cum lamellis BR[2:0] in tabulario SPI_CR1 constitue.

Regesta collecta in sectione manuali ejusdem nominis. Oratio subcinctus (Oratio offset) pro CR1 - 0x00, per defaltam omnia frena tolluntur (Reset valorem 0x0000);

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

In BR frena constitue moderatorem horologii divisoris, ita frequentiam in qua SPI agunt. STM32 nostra frequentia 72 MHz erit, agitator DUCTUS, secundum datas paginas, cum frequentia usque ad 25 MHz operatur, sic per quattuor dividere oportet (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. CPOL et CPHA particulas constitue ut relationem inter notitia translationis et horologii vide (vide iconem pag 240) definiant.

Cum chartam datam hic legamus et schismaticos non inspiciamus, propius inspiciamus descriptionem textus CPOL et CPHA frenorum pag 704 (SPI Descriptio generalis):

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Horologium tempus et verticitatem
Utens CPOL et CPHA frena SPI_CR1 registri, quattuor relationes sincere programma eligere potes. CPOL (horologii verticitas) statum horologii signo momordit moderatur cum nulla notitia traducitur. Hic frenum domini moderatur et ancillae modorum. Si CPOL est reset, paxillus SCK in reliquis modus est humilis. Si CPOL frenum positum est, paxillus SCK in modo quietis altus est.
Cum frenum CPHA (horologii pascha) positum est, strobe laqueus altus frenum est scopulus secundus signum SCK (cadens si CPOL patet, ortus si CPOL ponitur). Data capitur secunda mutatione in signo horologii. Si CPHA frenum patet, strobe laqueus altitudinis frenum est signum oriens SCK (ora cadens si CPOL ponatur, marginem assurgentem si CPOL purgatum est). Data prima mutatione capitur in signo horologii.

Cognita hac scientia, ad conclusionem venimus ambas frenos manere debere cyphris, quia Signum SCK humile manere volumus, cum in usu non sint, et data in pulsum oram orientis transmitti (vide Fig. Resurgens Edge in DM634 datasheet).

Obiter hic primum notam vocabulorum in ST datarum schedae invenimus: in iis scriptum " frenum in nihilum reponi" scriptum est. ut reset aliquantuluset non ut purgare aliquantulusvelut, exempli gratia, Atmega.

3. constitue DFF frenum determinare an notitia obstructionum sit VIII-bit vel XVI frenum format

Ego specialiter 16-bit DM634 cepi ut non molestus sim cum tradendo 12-bit PWM data, sicut in DM633. Sensum facit DFF ponere uni;

#define DFF         0x0800

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

4. LSBFIRST frenum in SPI_CR1 mandare configurare ut forma truncum determinet

LSBFIRST, ut nomen sonat, transmissionem configurat cum prima parte minimi significantis. Sed DM634 notitias accipere cupit ex parte insignium rerum incipiens. Unde eam retexere relinquimus.

5. In modum ferramentorum, si initus ex NSS paxillus requiritur, altum signum ad NSS clavum applica per totam seriem translationis byte. In NSS modum programmatis pone SSM et SSI frenos in SPI_CR1 mandare. Si NSS paxillus utendum pro output, tantum SSOE frenum inponendum est.

Install SSM et SSI ut obliviscatur circa NSS hardware modum:

#define SSI         0x0100
#define SSM         0x0200

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

6. MSTR et SPE frena ponenda sunt (solummodo positae manent si signum NSS altum est)

Profecto his frenis designamus nostrum SPI ut dominum et vicissim;

#define MSTR        0x0004
#define SPE         0x0040

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

SPI configuratur, statim munera scribamus quae bytes ad aurigam mittimus. Continue reading 25.3.3 "Configurans SPI in domini modus";

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Data translatio ordinis
Transmissio incipit cum byte ad Tx quiddam scriptum est.
Data byte oneratur in mandare subcinctus at parallela modus (ex bus internis) in traductione primi frenum, post quem traducitur sequential MOSI paxillus modus primus vel ultimus deinceps secundum partem LSBFIRST frenum in registro CPI_CR1 pendens. Quod TXE vexillum est pone cum notitia tradenda de quiddam TX subcinctus mandarenec non interregem si TXEIE frenum in CPI_CR1 registro positum est.

Pauca verba in translatione illustravi ut animadvertamus unum notam exsecutionis SPI in STM moderatoris. In Atmega vexillum TXE (Tx Inanis, Tx inanis est et ad notitias recipiendas paratas ) solum positum est postquam totum byte missum est de. Hoc autem vexillum hic positum est postquam byte in tabulario transpositio interno inserta est. Cum omnibus frustularum simul (parallelis) illuc impellitur, et tunc notitia ducta transfertur, TXE ante byte funditus mittitur. Hoc est momenti, quod in casu aurigae ductus nostro, necesse est ut LAT clavum missum trahas всех data, i.e. Vexillum TXE solum nobis satis non erit.

Hoc significat quod vexillum alio indigemus. Intueamur 25.3.7 - "Status Flags":

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
<...>
Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
EXERCITUS vexillum
Vexillum BSY ferramentis exaratum est et purgatum (ad ipsum scribens nullum effectum habet). Vexillum BSY significat statum SPI stratum communicationis.
resets:
expleta translatio (praeter modum magistri, si translatio continua sit)
cum SPI is disabled
cum dominus error occurs modus (MODF = I)
Si translatio continua non sit, vexillum BSY inter singulas notitias translationis summovetur

Purus, hac in promptu veniam. Quaeramus ubi sita sit quiddam Tx. Hoc facere, lege "SPI Data Register":

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Bits 15:0 DR [15:0] Data Register
Data recipi vel data tradenda.
Tabulae datae in duos buffers dividitur, unum pro scripto (transmittit quiddam) et unum pro legendo. Scribens ad actis mandare scribens ad Tx quiddam scribit, et ex actis mandandi legens reddet valorem in quiddam Rx contentum.

Bene, ac status registri, ubi vexilla TXE et BSY inveniuntur;

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

scribimus:

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

Bene, quoniam opus est ut 16 vicies binos bytes transmittere, secundum numerum outputs coegi LED, aliquid simile:

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

Sed detrahere LAT clavum adhuc nescimus, sic ad I/O revertemur.

paxillos assignare

In STM32F1, in registra publica fibulae responsabilia admodum sunt inusitata. Patet plures ex eis esse quam Atmega, sed etiam ab aliis STM chippis diversae sunt. Sectio 9.1 Descriptio generalis GPIO:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Uterque de communi proposito I/O portuum (GPIO) Configurationis tabulae duo 32- frenum (GPIOx_CRL et GPIOx_CRH), duo 32-frena actis diurnorum (GPIOx_IDR et GPIOx_ODR), a 32-frenum/regestorum tabulatorum (GPIOx_BSRR), tabula 16-bit tabulatorum (GPIOx_BRR) et 32- bis tabulae interclusionis (GPIOx_LCKR).

Primae duae tabulae inusitatae sunt, et etiam satis incommodi, quia 16 portus fibulae trans eas dispersae sunt in forma "quattuor minutas fratris". Illae. fibulae nulla ad septem sunt in CRL, reliqui in CRH. Eodem tempore reliqui registri bene globulos omnium portuum fibularum continent - saepe dimidium "reservatum" remanentes.

Pro simplici, a fine indice incipiamus.

Non opus est tabulario interclusio.

Tabulae copiae et tabulae retexere satis ridiculae sunt in eo quod ex parte se mutuo duplicant: omnia scribere potes in BSRR, ubi superiores 16 freni ad nihilum clavum reset, inferiores ad 1 ponentur, vel etiam potes. uti BRR, inferior XVI frusta e quibus paxillus tantum retexere. I. option alterum amo. Haec tabula magni momenti sunt quod aditum nuclei praebent paxillos:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Aut nuclei Set Reset
Nihil opus est ut disable obloquitur cum programmatio GPIOx_ODR in gradu particulae: una vel plura minuta mutari possunt cum una operatione atomica scribe APB2. Hoc obtinetur scribendo "1" ad tabulam reponendam (GPIOx_BSRR vel, ad solum rete, GPIOx_BRR) de frenum mutandum. Aliae minutae non mutabuntur.

In actis diplomatis nomina propria explanatoria satis habent - IDR = initus Directio Register, input register; ODR = Output Directio Registri, output mandare. Non opus est illis in re praesenti.

Demum regere registra. Cum in secundo SPI fibulas quaerimus, nempe PB13, PB14 & PB15, statim in CRH intuemur;

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Et videmus quod in calcariis aliquid scribere debebimus ab 20 ad 31 .

Iam supra figuratum est quod e paxillis velimus, ita hic sine tortore faciam, modo dicam quod INSTITUTUM designat directionem (input si ambae ponuntur ad 0) et clavum celeritatem (opus 50MHz, i.e. utrumque clavum ad "1"), et CNF modum ponit: regularis "dis-traho" - 00, "alterativus" - 10. Defectu, ut supra vidimus, omnes fibulae tertiam partem ab imo (CNF0) habent; ponit modum tristique initus.

Cum aliud consilium cum hoc spumae facere instituo, pro simplici modo omnia possibilia definivi et CNF valores tam inferiores quam superiores in registris potestate.

Nescio quomodo sic

#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

Fibulae nostrae in portu B sita sunt (inscriptio basis – 0x40010C00), codice:

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

Et proinde definitiones scribere potes pro LAT, quae vellicabuntur ex registris BRR et 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 modo inertia, semper talis fuit, manere)

Nunc magna sunt omnia, sed non opus. Quia hoc est STM32, electricitatem conservant, id quod opus est ut clocking requiritur peripheralium.

Conversus in clocking

Excubiae, quae etiam pro horologio dicuntur, pro clocking. Et iam potuimus notare abbreviationem RCC. Illud exspectamus in documentis: hoc est Reset et Horologium Imperium.

Difficillima pars horologii nostri, ut supra dictum est, feliciter evenit ab hominibus STM, ob quod illis gratias maximas agimus (iterum nexum dabo. Di Hal's websiteut pateat quam conturbatio sit). Tantum opus est registris author ut clocking periphericum (Periphericum Clock activare registra). Primum, basim RCC inscriptionis inveniamus, est in ipso initio "Manae Memoriae":

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

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

Et tunc vel deprime nexum ubi aliquid in lamella invenire conaris vel multo melius per descriptiones elaborandi regestis e sectionibus circa. enable commentariis. Ubi invenies RCC_APB1ENR et RCC_APB2ENR:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Atque hi igitur frena continentes clocking SPI2, IOPB (I/O Port B) et functiones alternativas (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;

Ultima codice potest inveniri hic.

Si facultas et vis experiendi habes, coniunge DM634 hoc simile: DAI ad PB15, DCK ad PB13, LAT ad PB14. Possimus a 5 volts aurigam, campos coniungere noli.

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

STM8 PWM

PWM in STM8

Cum hoc articulum inibam modo, decrevi, exempli causa, tentare aliquam functionem ignotae chip utentis tantum schedulae, ut cum sutore sine ocreis non desinam. STM8 huic muneri specimen fuit: primum, duas tabulas Sinensium cum STM8S103 habui, secundo, non admodum popularis, ideoque tentatio legendi et solutionis in interreti innititur defectu harum ipsarum solutionum.

Chip quoque datasheet и manual RM0016 referat "in primo pinout et tabulae inscriptiones sunt, in secundo reliqua omnia. STM8 programmatum est in C in IDE terribili ST Visual Develop.

Clock et / O *

Defalta, STM8 in frequentia 2 MHz operatur, hoc statim corrigi debet.

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
HSI (CELITAS Internum) Horologium
Signum horologii HSI derivatur ab interno 16 MHz RC oscillatoris cum divisore programmabili (1 ad 8). In tabula divisoris horologii positum est (CLK_CKDIVR).
Nota: initio, HSI RC oscillator cum divisore 8 eligetur ut fons praecipuus horologii signum.

Inscriptionem electronicam in notitia electronicarum invenimus, descriptionem in refman et vide tabulam purgari debere:

#define CLK_CKDIVR *(volatile uint8_t *)0x0050C6

CLK_CKDIVR &= ~(0x18);

Cum PWM currere volumus et LEDs coniunge, inspiciamus pinout:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Chip parvum est, multa munera in eisdem paxillis suspenduntur. Quod in uncis quadratis est "officinatio alternativa", mutatur per "optionem bytes" (optio bytes) - aliquid simile Atmega fuses. Valores grammatice mutare potes, sed non est necessarium, quia Novus functionality solum post reboot reducitur. Facilius est uti ST Visual Programmer (downloaded with Visual Develop), qui hos bytes mutare potest. Pinout ostendit CH1 et CH2 fibulas primi timoris occultas in uncis quadratis; necesse est ut AFR1 & AFR0 frena in STVP constituant, & altera etiam CH1 outputa secundi timoris ab PD4 ad PC5 transferat.

Ita fibulae 6 continentes LEDs: PC6, PC7 et PC3 pro secundo, PC5, PD3 et PA3 pro secundo.

Erectio I/O fibulae ipsae in STM8 simplicius et logicius est quam in STM32;

  • nota ex Atmega DDR data directione mandare (Data Directio Register): 1 = output;
  • mandare primum imperium CR1, cum output, modum dis-trahendi ponit (1) vel exhaurire aperta (0); quoniam LEDs cum cathodibus coniungo, hic zeros relinquo;
  • secunda mandare potestate CR2, cum output, celeritas horologii ponit: 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 occasum

Primum verba definiamus;

  • WM Frequency - frequentia cum qua timor ricini;
  • Auto-reload, AR - autoloadable valorem usque ad quem timor numerabit (venae tempus);
  • Renovatio Vicis, UEV - eventus qui fit cum timor AR numeravit;
  • PWM Officium Cycle - PWM officium cycli, saepe vocatur "officium factor";
  • Captis / Compare Value - valorem pro captione / comparatione, cui timor numeravit facturus aliquid (in casu PWM, signum output invertit);
  • Preload Precium - preloaded valorem. Compare valorem mutare non potest dum timor utres, alioquin PWM cyclus franget. Novae igitur valores transmissae in quiddam ponuntur et evellitur, cum timor ad finem suae countionis perveniat et retegat;
  • Ora-aligned и Centrum-aligned modos - alignment in confinio et in centro, idem quod Atmel's Fast WM и Phase-recte PWM.
  • OCiREF, Output Compare Reference signum - signum output referat, re vera, quod in PWM modi clavum respondentem apparet.

Ut iam ex pinout liquet, duo timers facultatem habent PWM, primus et secundus. Utrumque XVI frenum, primum multum additamenta (praesertim, numerare potest et sursum et deorsum). Uterque opus est aequaliter laborare, itaque statui ab altera tenuiorum manifesto incipere, ut non casu aliquo utatur quod ibi non est. Aliquid problema est, descriptionem functionis PWM omnium timentium in relatione manuali in capitulo de primo timore (16 PWM Modus), sic tibi omni tempore salire et emittere per documentum.

PWM in STM8 magnum habet commodum super PWM in Atmega:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Terminus varius PWM
Ratio configuratione ab imo ad summum
Fundum computatio activa est si DIR frenum in TIM_CR1 mandare purgatum est
exempli gratia
Utitur exemplo primo PWM mode. Signum PWM referentis OCiREF alta est quamdiu TIM1_CNT < TIM1_CCRi. Alias ​​dictum suscipit sed, massa. Si valor comparationis in TIM1_CCRi registro maior est quam valorem autoload (TIM1_ARR registri), signum OCiREF apud 1 habetur. Si valor comparationis sit 0, OCiREF nulla habetur....

STM8 timer in update eventu primum checks simile valoremet tunc demum signum facit. Timor Atmega primum cochleis et deinde comparat, inde in compare value == 0 output est acus, de quo aliquo modo agendum est (exempli gratia, programmatice invertendo logicam).

Quid ergo facere velimus: 8-bit PWM (AR == 255), computatis ab imo ad summum, alignment per fines. Cum bulbi leves cathodes cum spumae coniunguntur, PWM output 0 (duc) debet donec simile valorem and 1 after.

De quibusdam iam legitur WM modus, sic invenimus tabularium inquisitum secundi timoris per inquisitionem in relatione manuali huius locutionis (18.6.8 - TIMx_CCMR1);

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
110: Modus primus PWM - cum ab imo ad summum computando, canalis primus activus est dum TIMx_CNT <TIMx_CCR1. Alioquin rivus primus iners est. [In documento est exemplum erroneum crustulum a timer 1] 111: Modus secundus PWM – computando ab imo ad summum, primus canalis iners est dum TIMx_CNT <TIMx_CCR1. Alioquin primus canalis est activus.

Cum LEDs cum MK per cathodis conexi sunt, secundus modus nobis convenit (primus quoque, sed tamen nondum scimus).

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Bit III OC3PE: Admitte pin I preload
0: Preload mandare in TIMx_CCR1 is disabled. Scribere potes ad TIMx_CCR1 aliquando. Novus valor statim operatur.
1: Preload mandare in TIMx_CCR1 est enabled. Legere / scribe res accedere preload mandare. Valor praeloadus TIMx_CCR1 in tabulario umbraculo in unoquoque eventu update onustus est.
*Nota: Pro modus PWM ad recte operandum, praescriptio tabulae praestanda est. Hoc non est necessarium in uno signo (opM frenum in TIMx_CR1 in tabulario positum).

Bene, omnia invertamus quae nobis necessaria sunt ad tres vias timoris secundi:

#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 ex duobus octonariis regestis constat, omnia simplicia sunt;

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

TIM2_ARRH = 0;
TIM2_ARRL = 255;

Secundus timor non potest nisi ab imo ad summum numerare, alignment in finibus, nihil mutari debet. Ponamus divisorem frequentiam, exempli gratia, ad 256. Pro secundo divisore in TIM2_PSCR registro positum est et potestas duorum est;

#define TIM2_PSCR  *(volatile uint8_t *)0x00530E

TIM2_PSCR = 8;

Restat ut in conclusiones et ipsum secundo. Prima quaestio ex registris solvitur Captis/Compare enablebini, tres canales asymmetrice per eos dispersi. Hic etiam discimus quod signum verticitatem potest mutare, i.e. in principio, PWM Mode uti potuit 1. Scribimus:

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

Et tandem incipiunt timer in TIMx_CR1 subcriptio:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

#define TIM2_CR1   *(volatile uint8_t *)0x005300

TIM2_CR1 |= 1;

Simplex analogon AnalogWrite scribamus (), quod ipsa bona ad timerem ad comparationem transferet. Registra nominantur praedictio Captis/Compare commentariisdua sunt pro quolibet canali: ordo inferior 8 calcaria in TIM2_CCRxL et summus ordo in TIM2_CCRxH. Cum an-triginta PWM creavimus, satis est ad notas minimas tantummodo scribere;

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

Attentus lector animadvertet nos PWM leviter deesse, non posse C% satietatem producere (ad valorem maximum 100, signum unius cycli timentis inverti). Nam LEDs hoc non refert, et attentus lector jam quomodo reficere possit divinare.

PWM secundo opera timentis, ad primum transeamus.

Prima timer frena isdem prorsus in eisdem registris habet (sicut ea quae in secundo tempore "reservantur" manserunt, in primo pro omnibus provectis rebus active adhibentur). Itaque satis est inscriptiones earumdem tabularum in scheda reperiri et in codice exscribere. Bene, mutant valorem divisorem frequentiam, quia... Primus timor vult non potestatem duorum recipere, sed valorem XVI obolum in duobus registris Prescaler High и Minimum. Omnia facimus, et prima timor non operatur. Quid rei est?

Quaestio solui potest nisi per totam sectionem de registris timentis 1 inspiciendo, ubi quaerimus illam, quam secundus timor non habet. Erit 17.7.30 Mandatum frange (TIM1_BKR)ubi haec bit;

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Admitte principalis output

#define TIM1_BKR   *(volatile uint8_t *)0x00526D

TIM1_BKR = (1<<7);

Id nunc certum est, codicem ibi.

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

STM8 Multiplex

Multiplicatio in STM8

Tertium mini-projectum est octo RGB LEDs coniungere ad modum secundi timoris in PWM et eos colores diversos ostendere. Fundatur in conceptu multiplicationis LED, quae est quod si LEDs valde et celerrime conversus est, nobis videbitur constanter in (pertinacia visionisInertia visus). Ego statim feci aliquid simile hoc in Arduino.

Opus algorithmus simile hoc est:

  • anode primi RGB LED;
  • accensis, cathodes necessariis significationibus missis;
  • expectavit usque ad finem cycli PWM;
  • secundi RGB LED;
  • lit illud...

Bene, etc. Utique ad pulchram operationem requiritur quod anode iungitur et LED "ignitur" simul. Bene vel fere. In casu, necesse est codicem scribere, qui valores in tribus secundis vicissitudines outputabit, eas cum UEV pervenit, simulque mutabit actuosam RGB LED.

Cum commutatio ducatur automatice, necesse est "videre memoriam" creare ex qua manubrium interregem datam accipiet. Haec simplex ordinata est;

uint8_t colors[8][3];

Ut colorem specifici LED mutet, satis erit bona requisita in hunc ordinata scribere. Et variabilis reus erit numero LED . activi

uint8_t cnt;

Demux

Ad propriam multiplicem, satis impariter, CD74HC238 demultiplexor est. Multiplexer - chip qui operantem in hardware <<. Per tres initus fibulas (bitras 0, 1 et 2) eum numero trium numerorum X pascimus, et respondens numerus output operatur (1<<X). Reliquae inputationes spumae totum consilium scalis adhibentur. Hoc chip non opus est non solum ad numerum paxillos microcontrollorum occupatorum reducere, sed etiam ad salutem — ut non in plures LEDs quam fieri possit et MK non incendat accidens. Chipum denarium constat et semper in domo tua medicinalis scrinium servari debet.

Nostra CD74HC238 author erit ut intentionem praebeat ad anoodum desiderati LED. In multiplici multiplex-cursu, per P-MOSFET subministret intentionem columnae, sed in hoc demo potest directe, quia trahit XX mA, secundum absolutum maximum ratings in datasheet. Ex datasheet CD74HC238 pinouts et hoc opus est fraudulentus sheet:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
H = alta intentione gradu, L = humili intentione gradu, X - non curat

Ad paxillos PD2, PC1, PC3 & PC0 of StM1 applicamus. Mensa superiora cum gradus tam humiles quam excelsos contineat, paxillos istos quasi clavos distrahentes configuramus.

PWM

PWM secundo configuratur eodem modo, quo in priori fabula, duabus differentiis;

Primum, opus est ut interregem Update Event (UEV) quae munus vocabit quod toggles activum LED. Hoc fit mutato frenum Admitte update Interpellare in actis mandare cum vera nominis

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
Adjicias enable mandare

#define TIM2_IER   *(volatile uint8_t *)0x005303

//enable interrupt
TIM2_IER = 1;

Secunda differentia comparatur ad phaenomenon multiplicationis, ut ghosting — Parasitus ardor Diodorum. In nobis, constare potest ex eo quod timer, interregem in UEV, pergit tick, et tracto interpellare non vacat mutandae ductus antequam timer aliquid scribere coeperit ad paxillos. Ad hoc pugnandum, logicam invertere debebis (0 = maximam splendorem, 255 = nihil illuminatum) et extremam officii cycli valores vitabis. Illae. ut post UEV LEDs exeant perfecte ad unum cyclum PWM.

Verticitas mutabilis:

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

Fuge occasum r, g et b ad 255 et memento invertere ea cum utendo.

obloquitur

Essentia interpellationis est quod in quibusdam circumstantiis chippis sistit principale propositum exequi et munus aliquod externum appellat. Obloquitur ob influxus externos vel internas, etiam timer.

Cum primum consilium in ST Visual Evolvere, in addition to main.c accepimus fenestram cum arcanum file stm8_interrupt_vector.cipso facto inclusa est in re. In hoc fasciculo, munus unicuique interrumpendum tribuitur NonHandledInterrupt. Munus nostrum optatum interrumpere debemus obligare.

Data scheda habet mensam vectorum interpellandi, ubi ea quae opus sunt invenimus:

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8
XIII TIM13 renovatio / inundatio
14 TIM2 captis/compare

Necesse est nos duxerunt ad UEV mutare, ut interrumpat #13.

Primo igitur in tabula stm8_interrupt_vector.c mutare defaltam nomen muneris responsalis ad interpellandum No. 13 (IRQ13) ad proprium tuum:

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

Secundo, tabellam creare debebimus main.h cum sequenti contenti:

#ifndef __MAIN_H
#define __MAIN_H

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

Et tandem scribe hoc munus in tuo 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;
}

Reliquum est ut obloquitur. Hoc fit per mandatum assemblea rim - habebis eam quaerere Aliquam libero Juris Domestici:

//enable interrupts
_asm("rim");

Alius coetus mandatum est sim - obloquitur vertit off. Avertendi sunt oportet dum bona nova scribentur ad "memoriam video", ut interruptio causata in momento iniquo aciem non corrumpat.

Omnes codicem - in GitHub.

Lege datasheets 2: SPI in STM32; PWM, timers et obloquitur in STM8

Si quis saltem utilem hunc articulum invenerit, frustra non scripsi. Libenter commentarios et dicta recipere, omnia respondere conabor.

Source: www.habr.com

Add a comment