Sunteți pe pagina 1din 2

RTT (Real Time Timer)

RTT este un timer de timp real, el primeste semnalul de la ceasul SLCK (slow
clock). Frecventa
acestuia este de 32 kHz daca se foloseste ceasul RC (Rezistor Condensator)
intern sau de 32.768 kHz daca se utilizeaza cristalul (quartz-ul) extern. RTT este
unul din putinele periferiale la care nu trebuie activat ceasul. El este compus dintrun registru RTT_VR (RTT Value Register) a carui valoare se incrementeaza la fiecare
tick al ceasului SLCK inmultit cu valoarea prescalarului setata in registrul RTT_MR
(RTT Mode Register) in primul word. Spre exemplu in codul de mai jos se va seta
prescalarul cu valoarea 0x128;
RTT->RTT_MR|=0x00000128; // Se va seta prescalarul la valoarea 0x128;

Periferialul RTT are capabilitatea de a genera doua intreruperi, O intrerupere la


fiecare incrementare a registrului RTT_VR, si a doua intrerupere cand valoarea
registrului RTT_VR atinge valoarea registrului RTT_AR (RTT Allarm Register).
Activarea intreruperilor se face prin configurarea bitilor RTT_MR_RTTINCIE (RTT
INCtrement Itrrrerupt ENeble) si RTT_MR_ALMIEN (RTT ALarM Interrupt ENable). In
continuare se prezinta un fragment de program in care se initializeaza registrul
RTT_MR astfel incat sa se genereze intreruperi la fiecare secunda
(RTT_MR_RTPRES=0x8000;) si de asemena va genera o intrerupere in momentul in
care registrul RTT_VR va avea valoarea 45 (adica dupa 45 de secunde).
RTT->RTT_MR=(RTT_MR_RTTRST|RTT_MR_RTTINCIEN|RTT_MR_ALMIEN|(0x8000)); //Se initializeaza
//prescalacurl cu valoarea in zecimal 32768 (0x8000)
RTT->RTT_AR=45;
//Se incarca registrul de Alarma cu valoarea 45
NVIC_EnableIRQ(RTT_IRQn); //Se activeaza intreruprea pentru periferialul RTT.

Periferialul RTT nu are decat o singura adresa in vectorul de intreruperi si de aceea


intrerupera va fi procesata de catre un singur handler, si anume RTT_Handler();
Pentru a se putea reintra in handler-ul de intrerupere va trebui sa se citeasca
registrul de stare RTT_SR.
void RTT_Handler()
{
if(RTT->RTT_SR & RTT_SR_ALMS){ //Se verifica daca flagul de alarma este setat si tot odata se
//reseteaza flagurile pentru generarea unei noi intreruperi
Serial.println("Allarm");
//Se printeaza la consola serial Allarm in momentul in care
//RTT_VR == RTT_AR
loc

RTT->RTT_MR=(RTT_MR_RTTRST|RTT_MR_RTTINCIEN|RTT_MR_ALMIEN|(0x8000)); //In momentul in care are


//intrerupera generate de allarma se va restea timerul a.i. valoarea //registrului
RTT_VR sa fie 0

}else{
Serial.println("Tick");
}
}

//In toate celelalte cazuri se printeaza Tick

asdf ;;lkj fdsa jkl; ;ala dkfj asdf ;lkj fdsa jkl; ;afa dlfj
falk dala sasa falk dala sasa falk dala sassa falk dala sasa

S-ar putea să vă placă și