Lecția 5

Microcontrolerele STM8 pot fi cronometrate din trei surse:

Generator RC de mare viteză intern (HSI). care operează la o frecvență de 16 MHz -
Generator RC cu viteză redusă (LSI). care funcționează la o frecvență de 128KHz






Generator RC exterior (cuarț) care poate funcționa la o frecvență de 1 până la 24 MHz,
În timpul microcontrolere STM8 studiu vom folosi oscilator intern, care suntem destul de mulțumiți (Vreau să rețineți că oscilatorul intern este calibrat foarte bun). Desigur, cuartul extern ne-ar oferi mai multă precizie, dar înainte de a începe să facem un ceas sau altceva, de ce avem nevoie de piese suplimentare pe bord.

În timpul începerii microcontrolerului, dacă nu am făcut nicio modificare în registre, oscilatorul intern va funcționa la o frecvență de 2 MHz. Vom schimba setarea divizorului de frecvență astfel încât oscilatorul intern să înceapă să funcționeze la 16 MHz

Algoritmul de reglare a generatorului nostru este următorul:
-Resetați toate registrele generatorului la valoarea lor inițială
-Selectați sursa ceasului
-Activarea mecanismului de ceasornicare
- Așteptarea stabilizării sistemului de sincronizare a microcontrolerului

Registrele sistemului de ceas
Descrierea înregistrărilor de ceas începe în jurul paginii 89 a Manualului de Referință STM8S. În acest articol, vom trece prin registrele de îmbogățire din valorile pe care le vom stabili. Pentru a descrie completul, trebuie să vă referiți la manualul de referință STM8S.

CLK_ICKR - Registrul de ceasuri interne

Nume / descriere a înregistrării
REGAH / Controlați acțiunile regulatorului de tensiune intern atunci când cipul intră în modul Active-Halt.
LSIRDY / Setat de hardware, acest bit indică dacă LSI este gata și stabilă. 0 - indică faptul că oscilatorul nu este gata, 1 - indică faptul că oscilatorul este stabil
LSIEN / Acest bit determină dacă microcontrolerul este sursa de sincronizare.
FHWU / Acest bit poate fi schimbat în programul propriu-zis. Acest bit indică dacă activarea rapidă este activată din modul Active-Halt. 0 = dezactivat, 1 = activat
HSIRDY / Setarea și resetarea hardware-ului, acest bit determină dacă sursa internă de ceas HSI este stabilă și gata de utilizare.
HSIEN / Acest bit poate fi schimbat în programul propriu-zis. Aceasta determină dacă HSI este selectată ca sursă de ceas. De asemenea, acest bit poate fi instalat în hardware, dacă este necesară operarea forțată de la HSI. 0 = indică faptul că HSI nu este selectat, 1 = indică faptul că HSI este selectat.

CLK_ECKR - Registrul ceasului extern

Nume / descriere a înregistrării
Starea sursei ceasului extern / HSERDY. 0 = nu este gata, 1 = gata.
HSEEN / Activează / dezactivează sursa ceasului extern. 0 = dezactivat, 1 = activat

CLK_CMS R - Registrul stării generatorului ceasului (Registrul de stare a registrului de stare)
Acest registru este setat și resetat prin hardware și indică care dintre generatoare este selectată ca sursă de ceas.
Sursa ceasului de valoare
0xe1HSI
0xd2 LSI
0xb4 HSE
CLK_SWR - Registrul de comutare a ceasului de sistem
Acest registru poate fi modificat în programul de utilizator și folosit pentru a selecta sursa ceasului.
Sursa ceasului de valoare
0xe1 HSI
0xd2 LSI
0xb4 HSE

CLK_CKDIVR - un divizor al ceasului sistemului
Ceasul sistemului poate fi împărțit pentru a oferi o frecvență de operare mai mică a miezului microcontrolerului. Acest registru vă permite să setați prescaler pentru sursa ceasului intern (HSI) și prescaler pentru miezul microcontrolerului.
Nume / descriere a înregistrării
HSIDIV / Generator oscilator intern
CPUDIV / Preamplificator de frecvență de bază







Aici pot fi folosite astfel de valori ca prezentatori ai HSI
Valoare / Prezentator
0 / frecvența HSI
1 / Frecvența HIS împărțită la 2
2 / Frecvența HIS împărțită la 4
3 / Frecvența HIS împărțită la 8

Acestea sunt valorile care pot fi utilizate ca prescaler pentru kernel.
Valoare / Prezentator
0 / Frecvența ceasului
1 / Frecvența ceasului împărțită la 2
2 / Frecvența ceasului împărțită la 4
3 / Frecvența ceasului împărțită la 8
4 / Frecvența ceasului împărțită la 16
5 / Frecvența ceasului împărțită la 32
6 / Frecvența ceasului împărțită la 64
7 / Frecvența ceasului împărțită la 128

CLK_PCKENR1 CLK_ PCKENR2 - Registre pentru ceasornicarea întregii periferi
Aceste registre sunt necesare pentru a asigura calendarul pentru periferia de care avem nevoie - timeri, beeperi, I2C și așa mai departe. Pentru fiecare dispozitiv periferic, un bit este alocat acolo. Bitul setat în unitate permite sincronizarea și resetarea la zero - dezactivează temporizarea.

Nume de înregistrare / Periferice / Descriere

CLK_PCKENR1 / TIM1 / Activarea / dezactivarea cronometrului 1
TIM3 Activați / dezactivați cronometrul 2
TIM2 / TIM5 Activarea / dezactivarea cronometrului 2/5 (depinde de μ.)
TIM4 / TIM6 Pornește / oprește temporizatorul 4/6 (depinde de μ.)
UART1 / 2/3 Activați / dezactivați UART 1/2/3
SPI Activați / dezactivați SPI
I2C I2C pornit / oprit
CLK_PCKENR2 / CAN / Activarea / dezactivarea magistralei CAN
ADC Activează / dezactivează ADC
AWU Activează / dezactivează cronometrul de supraveghere

Perifericele incluse vor folosi frecvența ceasului. Dezactivarea tacticii serviciului însuși - îl dezactivează.
CLK_CSSR - Registrul sistemului de securitate
După pornire, CSS începe să monitorizeze îndeaproape semnalul ceasului de la HSE. Dacă a întrerupt brusc, se desfășoară următoarele activități de salvare:
- HSI pornește (dacă este oprit) și ceasul trece la el
- HSE este oprit
- În CLK_CSSR, steagul AUX crește, anunțându-ne că funcționează un generator de rezervă.
- Steagul CSSD este ridicat acolo și dacă este setat un bit CSSDIE, apare o întrerupere.
- Toate registrele din grupul CLK, cu excepția CLK_CKDIVR, sunt blocate pentru scriere. Modificarea setărilor de sincronizare (cu excepția divizorului) nu mai este posibilă până la următoarea repornire.

CLK_CCOR - Registru de ieșire a frecvenței reglabile
Acesta emite semnalul de ceas la piciorul MK.
CLK_HSITRIMR - Calibrarea oscilatorului intern

Ei bine și acum un mic exemplu care arată cum putem lucra cu sistemul de sincronizare.
De exemplu, vom inversa pur și simplu starea PD0 PIN-ul, și, astfel, modificați setările ceasului, iar osciloscopul va observa modificarea frecvenței la setarea prescaler.

Iată codul nostru de program

____________________________________________________________
#include
#include

//
// Setați frecvența de lucru a microcontrolerului 16 MHz de la oscilatorul intern
//
void InitialiseSystemClock ()
CLK_ICKR = 0; // Resetați registrul de ceasuri interne
CLK_ICKR_HSIEN = 1; // Porniți generatorul intern HSI
CLK_ECKR = 0; // Opriți generatorul extern
în timp ce (CLK_ICKR_HSIRDY == 0); // Așteptăm stabilizarea generatorului intern
CLK_CKDIVR = 0; // Setați frecvența maximă
CLK_PCKENR1 = 0xff; // Includeți toate perifericele
CLK_PCKENR2 = 0xff; // Același lucru
CLK_CCOR = 0; // Opriți CCO.
CLK_HSITRIMR = 0; // Opriți ornita HSIU.
CLK_SWIMCCR = 0; // Setați SWIM pentru a rula la ceas / 2.
CLK_SWR = 0xe1; // Utilizați HSI ca sursă a tactilei
CLK_SWCR = 0; // Resetați semnalizatorul comutatorului generator
CLK_SWCR_SWEN = 1; // Activați trecerea la HSI
în timp ce (CLK_SWCR_SWBSY! = 0); // Întrerupeți în timpul comutării
>

//
//
//
int principal (void)
__disable_interrupt (); // dezactivați inițializarea întreruperii
//
// Inițializați piciorul PD0
//
PD_DDR_DDR0 = 1; // Setați pinul PD0 la ieșire
PD_CR1_C14 = 1; // PIN-ul funcționează în modul push-pull
PD_CR2_C24 = 1; // Frecvența funcționării cu pin până la 10MHz
//
// Acum configurați ceasul sistemului
//
InitialiseSystemClock ();
__enable_interrupt (); // Permite întreruperi
(1) // Ciclul de comutare infinit al pinului nostru
PD_ODR_ODR4 = 1; // Dați unității (+ 5V) pinului PD0
PD_ODR_ODR4 = 0; // Returnați zero (masă) la pinul PD0
>
>

_______________________________________________________________
După conectarea osciloscop la PIN-ul de PD0 noastre vedem aici este o imagine. Trecerea de frecvență a PIN-ul nostru - 2,963MGts. (Observ că niciodată nu va vedea frecvența de 16MHz la PIN-ul, astfel încât în ​​exemplul nostru, frecvența 2,963MGts pur și simplu indicative și modificarea frecvenței prescaler, vom vedea cum se va schimba)

Și acum, iată ce se întâmplă dacă setăm prescaler pentru oscilatorul intern (HSI) la 2.
Pentru aceasta trebuie să schimbăm această linie a codului nostru.
___________________________________________________________
CLK_CKDIVR = 0
______________________________________________________

Aici este
______________________________________________________
CLK_CKDIVR = 0;
CLK_CKDIVR_HSIDEV = 1; // Setați prescaler la 2
______________________________________________________

Rezultatul lucrării noastre în imaginea de mai jos. Frecvența semnalului a devenit 1.335 MHz, adică aproximativ jumătate din frecvența noastră originală.







Articole similare

Trimiteți-le prietenilor: