Ingo Electronics


    HOME                                                           Stellaris LM4F120 LaunchPad


Stellaris LauncPad.   System  Timer  SysTick  ir funkcijos SysCtlDelay  naudojimas

Stellaris Cortex-M4 turi integruotą laikmatį - SysTick. Tai paprastas 24 bitų, dirbantis mažėjančia tvarka, skaitiklis.

Paprastai naudojamas nustatyti reikiamo užlaikimo, vėlinimo periodams.

SysTick registro reikšmę galima nuskaityti ir įrašyti.

SysTick skaitiklis dirba tiesiogiai nuo mikrokontrolerio vidinio nustatyto taktavimo, t.y jo reikšmė pakinta su kiekvienu procesoriaus taktu.

 
Yra naudojamos trys pagrindinės funkcijos:

 //Enables the SysTick counter.
SysTickEnable();

 
//Enables the SysTick interrupt.
//Leidžiami programiniai pertraukimai

SysTickIntEnable();

//Sets the period of the SysTick counter.          
SysTickPeriodSet(tick_period);

Kadangi SysTick yra 24 bitų, tai tick_period'o max reikšmė yra 16777216 ir degali jos viršyti.

SysTickPeriodSet nustato po kiek procesoriaus taktų SysTick pasieks nulinę reikšmę, tuo metu suveikia programinių pertraukimų rodyklė.

 Pvz. jeigu norime, kad pertraukimų funkcija suveiktų kas 1000 procesoriaus taktų, rašome taip:

SysTickPeriodSet(1000);

 
Kai yra naudojamas SysTick, paprastai yra kuriama ir pertraukimų funkciją, kaip pvz:
//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

//SysTick pertraukimų funkcija

void SysTickIntHandler(void)
{  

      tick_int++;

 //toggle state of Status green LED on each SysTick interrupt

       if(tick_int==10){

       state = ~state&0x08;

       GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,state);                                                          

       tick_int=0;

       }

}

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Pertraukimų funkcijos pavadinimą galima laisvai pasirinkti, šiuo atveju ši funkcija buvo pavadinta SysTickIntHandler, tačiau yra vienas svarbus dalykas, reikia šia funkciją deklaruoti faile startup_ccs.c ir tame pat faile pertraukimų vektorių lentelėje reikiamoje vietoje, 
ties // The SysTick handler  nurodyti šios funkcijos pavadinimą:Pvz. iš startup_ccs.c 

Capture13

 Capture14

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Žemiau pateiktas  SysTick vartojimo pavyzdys, tai elementarus LED mirgsiukas, laiko išlaikymas viena sekundė, t.y LED vieną sekundę šviečia, o kitą nešviečia:

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

#include "inc/hw_ints.h"
#include "inc/hw_gpio.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/systick.h"

unsigned int led_state;
unsigned int tick_period;
unsigned int tick_int;

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
//Pertraukimų f-ja
void SysTickIntHandler(void)
{

       tick_int++;

    //toggle state Status LED on each SysTick interrupt

       if(tick_int==10){

       led_state = ~led_state&0x08;

       GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3,led_state);

       tick_int=0;

       }

}

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

void main() { 

          //Set the clocking to run from the PLL at 50MHz.

           SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ);

           SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

           GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);

                      //Set the system tick

                         SysTickEnable();

                         SysTickIntEnable();

                         //delay_100ms = SysCtlClockGet()/10;

                         //nustatome 100ms perioda

                         tick_period = SysCtlClockGet()/10;

                         SysTickPeriodSet(tick_period);        //max 16777216

                     led_state = 0x08;

                     tick_int =0;

while(1){}


}//end main

//''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

                                                          Funkcijos SysCtlDelay naudojimas

SysCtlDelay yra gana dažnai naudojama funkcija įvairios trukmės uždelsimams sukurti.

SysCtlDelay(unsigned long Coun);

 
Svarbu atkreipti dėmesį į tai kad,
1 Count = 3 procesoriaus taktai

 
Taigi pvz., jeigu procesoriaus dažnis yra 50Mhz, tai vienos sekundės uždelsimui

parametras  Count = 50000000/3=16666666

Parametro Count skaitmeninė reikšmė negali viršyti 32 bitų, t.y 4294967295

Jeigu negailėti mikrokontrolerio resursų, tai uždelsimui sukurti naudojama funkcija:

//Gets the processor clock rate.
//Procesoriaus dažnis, (Hz)

SysCtlClockGet();

 

Tuomet vienos sekundės uždelsimas atrodytų taip:
SysCtlDelay(SysCtlClockGet()/3);

 
Arba galima programoje iš anksto paskaičiuoti:

delay_1000ms = SysCtlClockGet()/3;

ir toliau programos kode naudoti:

SysCtlDelay(delay_1000ms);

 
SysCtlDelay nepatartina piktnaudžiauti, ir naudoti tik tada, kuomet tai yra tikrai būtina, nes kai mikrokontroleris vykdo šią funkcija, jis bereikalingai sukasi vienoje vietoje, kai tuo tarpu jis galėtu atlikti kitus darbus. Pvz. įvairiems signaliniams LED pamirgsėjimams, periodiniams duomenų siuntimams ir gavimams patartina naudoti periferinių taimerių programinius pertraukimus, kaip kad buvo parodyta ankstesniame pavyzdyje.