ST10 - scheme și programe pentru Speccy

ST10.Urok 2. Cum se configurează porturile și LED-uri clipit (140201-140205)

Pentru a continua studiul MK (Microcontroller) STM32xx avem nevoie de documentația de la producător.

Distribuția Keil. mai precis în pachetele de furnizor. deja include aproape tot ce ai nevoie.

manual Referense pe chip și miezul. foaie de date.

acestea sunt localizate fizic. de exemplu STM32F100RB

'Papka_gde_ustanovlena_Keil' \ ARM \ Pack \ Keil \ STM32F1xx_DFP \ 1.0.2 \ Documente

Și cele mai multe IDE au organizat lucrul cu documentația că totul a fost la îndemână atunci când se lucrează cu proiectul.

IDE → Vezi meniul -> Cărți.

ST10 - scheme și programe pentru Speccy

Cu toate acestea, STM documentare frecvent corectate și actualizate.

Descărcați documentație posibilă pe site-ul producătorului.

>>> - cum ar fi cip montat pe descoperirea STM32VL

În afară de Referense manuală și foi de date. extrem de necesară pentru a studia documentele -

Erata, care conține o descriere a erorilor de hardware și modalități de a eluda aceste erori.

ES0136: STM32F100xC, STM32F100xD și STM32F100xE de înaltă densitate limitări ale dispozitivului linie de valoare

De asemenea, este recomandat să aibă la îndemână aceste documente.

>>> - Cum de a face module

Brian Kernighan, Dennis Ritchie. C Programming Language

Deci, tot ce avem nevoie.

Creați un modul cu GPIO.

Abreviere GPIO de uz general o I / Os - intrări / ieșiri de destinație generală

În primul rând, un pic despre calendarul.

În mod implicit sistemul este setat la cristal extern - HSE (8MHz) și 24MHz SYSCLK.

GPIOx în STM32F10xx cronometrat de APB2.

Într-o configurație suplimentară, și va examina ceasul sursă și frecvența. dar de acum vom lua aceste informații de la sine.

Momentul implicit (și, prin urmare, locul de muncă), toate modulele periferice dezactivate.

Pentru conectarea lor modul CRC responsabil. special pentru GPIO x.

ceas periferice APB2 permite registru - APB2ENR.

Deschideți Referense RM0041 manuală și găsi descrierea acestui registru utilizând

o listă de marcaje sau o căutare.

ST10 - scheme și programe pentru Speccy

Pe STM32VL descoperire are două LED-uri - albastru conectate la PC8 și verde la PC9. Avem nevoie de a controla biții 8 și 9 din portul C.

Aici am face o digresiune. Determinarea modulelor de ei înșiși și registrele lor în biții de antet fișier sunt stm32f10x.h.

Registrele au fuzionat în structura pe baza funcției.

__IO uint32_t CR;

__IO uint32_t CFGR;

__IO uint32_t CIR;

__IO uint32_t APB2RSTR;

__IO uint32_t APB1RSTR;

__IO uint32_t AHBENR;

__IO uint32_t APB2ENR;

__IO uint32_t APB1ENR;

__IO uint32_t BDCR;

__IO uint32_t CSR;

__IO uint32_t AHBRSTR;

__IO uint32_t CFGR2;

#if definit (STM32F10X_LD_VL) || definită (STM32F10X_MD_VL) || definit (STM32F10X_HD_VL)

__IO uint32_t CFGR2;

# endif / * STM32F10X_LD_VL || STM32F10X_MD_VL || STM32F10X_HD_VL * /

biți definite constantele de caractere și sunt biți, în esență, măști:

#define RCC_APB2ENR_AFIOEN ((uint32_t) 0x00000001) / *!

#define RCC_APB2ENR_IOPAEN ((uint32_t) 0x00000004) / *!

#define RCC_APB2ENR_IOPBEN ((uint32_t) 0x00000008) / *!

#define RCC_APB2ENR_IOPCEN ((uint32_t) 0x00000010) / *!

#define RCC_APB2ENR_IOPDEN ((uint32_t) 0x00000020) / *!

#define RCC_APB2ENR_ADC1EN ((uint32_t) 0x00000200) / *!

bit determinare caractere conține. și o unitate de registru în care este ea însăși biți și nume de biți, separate printr-o linie de subliniere.

Ei înșiși ca nume de module, registre, biți - o abreviere.

CCR - R eset și C de blocare C ontrol

APB2ENR - APB2P ceas eripheral RO egister R capabil

Pentru a lucra cu biți individuale de registre vor utiliza următoarea structură.

Reset bit - Var = (

Instalare - Var | = bitmask;

Deci, rândul său, pe portul ceas C.

RCC-> APB2ENR | = RCC_ APB2ENR_IOPCEN;

În cazul în care o variabilă este utilizată ca indicator s uetsya să se înregistreze APB2ENR.

Prin onfiguratsiya pinii portului.

RazdelGPIO 7.1 GPIO manualul Referense descriere funcțională

Prin onfiguratsiya constatările rezumate în tabelul de configurare biți Tabelul 16. Tabelul Port

ST10 - scheme și programe pentru Speccy

Atribuirea Bit GPIO registru de configurare sunt date în descriere

Port registru configurație ridicată (GPIOx_CRH) (x = A..G)

Deoarece portul are 16 pini. și fiecare PIN-ul are o configurație de 4 biți, există două registru de configurare 32bit - CRL și CRH.

Avem nevoie de CRH, deoarece concluziile PC8 și PC9 sunt în ea.

ST10 - scheme și programe pentru Speccy

Pentru noi opțiunea dorită - General Purpose de ieșire push-Pul, o combinație de biți

Acesta trebuie să fie după cum urmează.

CNFx - 00 - Binar

MODEX - 01 - la fel ca în acest caz, viteza de ieșire este lipsit de importanță. expune media.

Vom instala configurația necesară a efortului Preclearing

starea anterioară. Cu toate că aceste registre și are o stare definită după cip resetare. dar este mai bine să se obișnuiască să facă așa cum trebuie. terminale de configurare

uneori, aveți nevoie pentru a schimba „on the fly“.

(GPIO_CRH_CNF9 | GPIO_CRH_CNF8 | GPIO_CRH_MODE9 | GPIO_CRH_MODE8);

GPIOC-> CRH | = GPIO_CRH_MODE9_0 | GPIO_CRH_MODE8_0;

Lucrul cu concluziile.

ST10 - scheme și programe pentru Speccy

Pentru portul de ieșire de date există în ODR registru.

Există un număr de moduri.

Direct scrie o valoare într-un registru ODR

GPIOC-> ODR | = GPIO_ODR_ODR9; // reset ieșire

Dar nu este atomică, și, în plus, este compilat într-o grămadă de instrucțiuni.

și BRR registrele BSRR destinate accesului atomic la biții de port ODR

Prima resetare și setarea bitului. a doua doar pentru a reseta.

ST10 - scheme și programe pentru Speccy

BSRR registru simbolic împărțit în două pe 16 biți. Jr. servește pentru setarea bitului pentru resetare senior.

GPIOC-> BSRR = GPIO_BSRR_BR9; // reset ieșire

GPIOC-> BSRR = GPIO_BSRR_BS9; // set de ieșire

Pentru a simplifica scrierea codului și pentru percepție mai convenabil, scrie

definition zameschayushie aceste linii.

#define GreenLED_OFFGPIOC-> BSRR = GPIO_BSRR_BR9

#define GreenLED_ON GPIOC-> BSRR = GPIO_BSRR_BS9

#define BlueLED_OFF GPIOC-> BSRR = GPIO_BSRR_BR8

#define BlueLED_ON GPIOC-> BSRR = GPIO_BSRR_BS8

Ca rezultat, de lucru cu ieșire se reduce la:

Și nu trebuie să se uite prin codul sursă, în căutarea a ceea ce este pe de ieșire.

Pentru a deveni cod de auto-documentare.

Dar dacă vom lăsa să ne controleze LED-uri. Noi nu am văzut nimic.

Concluzii sunt comutate la viteză mare și ochiul uman nu poate prinde Situației flicker. Cauti o întârziere.

Nu voi descrie funcția de lucru ma condus complet. Pot spune doar că funcționează în întreruperea SYSTICK cronometru de sistem și vă permite să creați intervale de timp de 1 ms. și rezonabil de exacte. analiza pe deplin funcțiile de lucru în lecțiile viitoare.

Compilați sursa proiectului → Rebuild toate obiectivele, la fel ca în lecția anterioară.

Și eu întreb în Flash → Descărcare cip.

În cazul în care compilarea a fost de succes, iar proiectul este configurat. placa va lumina intermitent LED-uri.

Efectuarea modulul în sine.

Codul nostru funcționează. bine citit și ușor de utilizat. Dar, dacă vom continua să scrie mai mult în acest stil (toate într-un singur fișier).

Se va lua timp. transformarea de lucru într-o rutină. Se transferă activitatea la periferie modulului. și porturi de ieșire de intrare ale aceleași periferice,

un modul de software separat - în esență, o bibliotecă.

Se presupune că ai citit deja articolul Viktor Timofeev - Cum de a face modulele.

Crearea unui modul led.h antet fișier și salvați-l în folderul inc. doar a crea o sursă de

led.c și salvați-l în folderul src.

Se transferă de ieșire pentru a determina fișierele antet de comutare. și concluzii de inițializare port de switch și o funcție de ceas LED_init separat () în codul sursă.

Conectați fișierele antet în main.c codul sursă și se adaugă la proiect. precum și main.c adăugat

dar numai în src folder virtual.

Cu lecții leduyuschie vor folosi în mod activ materialul acestei lecții.

Primul exemplu de realizare main.c

#define GreenLED_OFF GPIOC-> BSRR = GPIO_BSRR_BR9

#define GreenLED_ON GPIOC-> BSRR = GPIO_BSRR_BS9

#define BlueLED_OFF GPIOC-> BSRR = GPIO_BSRR_BR8

#define BlueLED_ON GPIOC-> BSRR = GPIO_BSRR_BS8

statică TimingDelay uint32_t volatil;