12.27.2013

Timer0 w trybie OneShot z funkcją WaitOnTrigger EK-TM4C123GXL

Działanie Timera w trybie one shot polega na jednorazowym przejściu licznika i zatrzymaniu działania. Aby odliczanie rozpoczęło się ponownie należy włączyć ponownie Timer.

W przykładzie zastosowałem dodatkowe ustawienie  Wait-for-Trigger mode Timera0_B.
Jest to opcja polegająca na starcie n+1 Timera po zakończeniu zliczania Timera n, czyli Timera wcześniejszego w procesorze. Funkcja Wait-for-Trigger w daisy chaining nie działa dla Timera 0-A lub timera0-A 32bit gdyż nie ma przed nimi wcześniejszego timera wyzwalającego.

Dodatkowo w przykładzie został ustawiony preskaler dla Timera0-A aby przy częstotliwości CPU 3,125Mhz uzyskać wywoływanie one szhot Timera0-B co 1s. W przeciwieństwie do preskalera przy PWM mode, preskaler Timera działającego w periodic mode lub one-shot mode z liczeniem w dół jest uruchomiany inaczej. Jest on mnożnikiem liczby przekazanej w TimerLoadSet().




#include "inc/hw_ints.h"

#include "inc/hw_types.h"

#include "inc/hw_memmap.h"

#include "driverlib/sysctl.h"

#include "driverlib/gpio.h"

#include "driverlib/timer.h"

#include "driverlib/pin_map.h"

#include "driverlib/interrupt.h"



int main(void) {



 //clock:

 SysCtlClockSet(SYSCTL_USE_PLL|SYSCTL_SYSDIV_64|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); // OSC MAIN and PLL DIV 64 = 3,125-MHz frequency


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_3);



    // Enable Peripheral Timer0

    SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);

    TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR|TIMER_CFG_A_PERIODIC|TIMER_CFG_B_ONE_SHOT);



    TimerControlWaitOnTrigger(TIMER0_BASE, TIMER_B,1); // after the Timer0 A is 0 Timer0 B is start



    TimerLoadSet(TIMER0_BASE, TIMER_B, 65535); // 6536 Tc = 0,0209s and one shot -> go to Timer0IntHandlerB

    TimerLoadSet(TIMER0_BASE, TIMER_A,31250);

    TimerPrescaleSet(TIMER0_BASE, TIMER_A, 100);  // one second period 100*31250Tc



    IntEnable(INT_TIMER0B);                         // enable interrupt Timer0 B

    TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT);  // interrupt on TIMEOUT

    IntMasterEnable();



    TimerEnable(TIMER0_BASE, TIMER_BOTH); // enable Timer0 A and B



    while(1) {

    }

}





void Timer0IntHandlerB(void){



 TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT); // clear interrupt register

 TimerEnable(TIMER0_BASE, TIMER_B); // one shot mode must be enabled after every use



 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 8); // blink green led

 SysCtlDelay(50000);  // in real project never use SysCtlDelay in interrupt

 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_3, 0);

}