Microcontrolere STM8

Microcontrolere STM8. Sistem de ceas.

Bună ziua, Ultima dată am început să luăm în considerare cronometrele, iar astăzi ne vom da seama cum funcționează sistemul de ceas în STM8S. Comparativ cu AVR, STM8 are un avantaj puternic în ceea ce privește puterea și flexibilitatea de sincronizare. Singurul negativ este incapacitatea de a tasta de la cuarț cu o frecvență mai mică de 1 MHz, dar acest lucru este compensat de prezența unui oscilator intern de joasă frecvență. Cel mai important avantaj al STM8 față de AVR este absența biților FUSE! Toți parametrii de sincronizare sunt configurați direct în cursul programului. Deci, putem avea surse de frecvență de ceas: —un rezonator extern de cuarț cu o frecvență de 1-24MHz (HSEHigh Speed ​​​​External); —sursă de frecvență externă 1-24MHz (HSE-extExternă de mare viteză); —oscilator RC intern de mare viteză de 16 MHz (HSIIntern de mare viteză); —Oscilator RC intern de viteză mică de 128 kHz (LSIIntern de viteză mică). Așa arată schema bloc a modulului de ceas:

microcontrolere
În diagramă, vedem că alegerea frecvenței principale are loc înComutatorul ceasului principalmodul. După aceasta, merge la dispozitivele periferice (timere, SPI etc.) și printr-un divizor la CPU. La pornire, sursa principală de ceas este HSI cu un divizor de 8, care ne oferă o frecvență de funcționare după pornire de 16/8=2 MHz. Este logic ca atunci când procesorul este pornit, acesta începe să funcționeze ca un generator intern - la urma urmei, este posibil să nu existe unul extern. Reducerea frecvenței se face astfel încât procesorul să poată porni într-o stare proastă de putere. Oscilatorul de viteză redusă poate acționa atât CPU-ul, cât și poate funcționa independent de sursele principale de ceas,controlarea unui temporizator de supraveghere independent (IWD) și a unui modul de trezire. Modulul sistemului de ceas poate declanșa două întreruperi - la comutatorul sursei ceasului (Evenimentul comutatorului sursei ceasului principal) și la declanșarea de securitate a ceasului (Evenimentul sistemului de securitate al ceasului). Semnalul de la oricare dintre sursele de ceas, indiferent dacă este activ sau nu în prezent, poate fi transmis în afara controlerului la pinulCCO. Puteți comuta sursa ceasului manual sau automat. Consultați Manualul de referință de la pagina64pentru informații despre cum să comutați. Comut astfel: 1. Scriem în registrulCLK_SWRvaloarea corespunzătoare sursei de ceas cerută. 2. Așteptăm ca sursa de frecvență să se stabilizeze prin monitorizarea bituluiSWIFdin registrulCLK_SWCR. 3. Activați comutarea sursei setând bitulSWENîn registrulCLK_SWCR. 4. Scriem în registrulCLK_SWRvaloarea corespunzătoare sursei de ceas cerută. Aceasta setează bitulSWBSYîn registrulCLK_SWCRși sursa de ceas corespunzătoare este pornită. În acest moment, microcontrolerul este încă tactat de la vechea sursă. După ce frecvența se stabilizează, valoarea din registrulCLK_SWReste copiată în CLK_CMSRși sursa de ceas este comutată. 5. Așteptăm ca steagulSWIFsă fie setat în registrulCLK_SWCR. După ce este setat, este apelată o întrerupere dacă este activată de bitulSWIEN.

Luați în considerare registrele de control ale modulului de ceas: RegistrulCLK_CMSR-Registrul de stare master al ceasului. Registrul principal de stare a frecvenței. Acest registru stochează informații despreeste sursa ceasului care este curentă în acest moment. Registrul este doar pentru citire, scrierea în acest registru nu va avea niciun efect. Valori de registru posibile:

  • 0xE1: sursa ceas curent - HSI (valoare după resetare);
  • 0xD2: sursa ceas - LSI;
  • 0xB4: sursă ceas - HSE.
RegistrulCLK_SWR-Registrul comutatorului principal al ceasului. Registrul principal de comutare a frecvenței. Este scris pentru a schimba sursa ceasului. Constantele pentru selectarea acestuia sunt aceleași ca în registrulCLK_CMSR. Scrierea în acest registru nu este posibilă în timpul procesului de comutare a frecvenței (bitulSWBSYdin registrulCLK_SWCReste setat în acest moment). RegistrulCLK_CKDIVR-Registrul divizor ceas. Registrul divizor de frecvență. BițiiHSIDIV[1:0]selectează divizorul pentru oscilatorul intern. Valori posibile:
  • 00 - divizorul este 1 (frecvența nu este împărțită);
  • 01 - divizorul este 2;
  • 10 - divizorul este 4;
  • 11 - divizorul este 8.
BițiiCPUDIV[2:0]definesc divizorul pentru CPU. Valori posibile:
  • 000 - fCPU=fMASTER
  • 001 - fCPU=fMASTER/2
  • 010 - fCPU=fMASTER/4
  • 011 - fCPU=fMASTER/8
  • 100 - fCPU=fMASTER/16
  • 101 - fCPU=fMASTER/32
  • 110 - fCPU=fMASTER/64
  • 111 - fCPU=fMASTER/128
ÎnregistrațiCLK_ICKR-Registrul intern al ceasului. Registrul de control pentru sursele interne de ceas. Acest registru este responsabil pentru setarea generatoarelor HSI și LSI. Luați în considerare biții săi: BitulHSIENeste responsabil pentru pornirea generatorului de înaltă frecvență. În mod implicit, este egal cu unu și generatorul este activat. BitulHSIRDYdetermină starea generatoruluiHSI. Dacă este instalat, atunci generatorul este gata să funcționeze. Setarea bituluiFHWUpermite trezirea rapidă din modurile de repaus. Funcțiile bițilorLSIENșiLSIRDYcorespund celor pentru HSI și sunt responsabile pentru funcționarea generatorului de viteză mică. ÎnregistrareCLK_ECKR-Registru extern de ceas. Registrul extern de control al sursei ceasului. Acest registru este responsabil pentru setarea generatorului HSE. Are doar doi biți de configurare:HSEEN– setarea acestui bit activează o sursă de ceas externă (cuarț sau oscilator);HSERDY– acest bit este setat de hardware și indică faptul că sursa externă este gata să funcționeze. RegistrulCLK_SWCR-Comutați registrul de control. Registrul de control al comutării ceasului. Să aruncăm o privire asupra biților săi componente:SWBSY– acest bit este setat de hardware în timpul procesului de comutare a sursei de ceas.SWEN– Setarea acestui bit permite comutarea sursei ceasului. Setați bițiiSWIENactivează întreruperea comutării sursei de ceas. FlagSWIFeste setat după comutarea sursei. În procedura de gestionare a întreruperilor, aceasta trebuie șters. ÎnregistrareCLK_CSSR-Înregistrare sistem de securitate ceas. Registrul de control al sistemului de siguranță al ceasului. BitulCSSENactivează modululCSS. BitulCSSDIEactivează o întrerupere de siguranță a ceasului. PavilionulCSSDeste setat atunci când modululCSSeste declanșat. În procedura de gestionare a întreruperilor, aceasta trebuie șters. O descriere mai detaliată a acestui modul va fi mai jos.

Este timpul să exersați pe pisici. Pe placa STM8S - Discovery este instalat quartz16 MHz și o vom folosi. Să schimbăm programul din articolul anterior despre cronometre: vom adăuga comutarea ceasului la cuarț. În același timp, vom crește prescalerul Timer1 pentru a vedea comutarea LED-ului, deoarece frecvența de ceas a temporizatorului va crește de la 2 MHz (valoare implicită) la 16 MHz, iar clipirea LED-ului va fi imperceptibilă pentru ochi.

STM8 are un modul minunat precumCSS(Clock Security System). El monitorizează funcționarea oscilatorului cu cristal și poate, în caz de defecțiune, comuta ceasul pe oscilatorul intern. În acest caz, divizorul de frecvență de intrare este setat la 8, ceea ce corespunde la 2 MHz. De asemenea, în momentul comutării, indicatorulCSSD(Detecție sistem de securitate ceas) este setat în registrulCLK_CSSRși se declanșează o întrerupere când securitatea ceasului sistemul este declanșat (Întreruperea detectării sistemului de securitate a ceasului) dacă este activat deCSSDIE(Activare a întreruperii detectării sistemului de securitate a ceasului). Acest modul este activat prin setarea bituluiCSSEN(Activare sistem de securitate ceas) în registrulCSSR. Să ne edităm programul astfel încât, în cazul unei defecțiuni de cuarț, acesta să treacă automat laHSI, să provoace o întrerupere și să efectueze unele acțiuni. Și aici am întâlnit o eroare în mediul de programare. Permiteți-mi să vă reamintesc că folosesc IAR Embedded Workbench pentru STMicroelectronics STM8, versiunea 1.20. Fișierul antet iostm8s105s6.h pe care îl folosesc are această descriere a registruluiCLK_CSSR:

Ne uităm la Manualul de referință de la pagina77pentru o descriere a acestui registru și suntem surprinși: bițiiCSSDșiCSSDIEsunt inversați! Să reparăm conținutul acestui fișier.

Și fixează măștile puțin mai jos.

În general, pentru oricefamily hidere iostm8.h aceasta eroare este si ea. Nu m-am uitat la anteturi pentru alte procesoare, dar bănuiesc că aceeași eroare este prezentă acolo. În plus, nu există numere de vector de întrerupere pentru sistemul de ceas în iostm8s105s6.h. Să le luăm de pe iostm8.h și să le introducem la sfârșitul antetului nostru. Arata asa:

Și cu fișierul antet deja corectat, vom scrie programul nostru.

Asta e tot pentru astăzi, dar data viitoare vom continua să ne ocupăm de cronometre.