| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 |
- // Driverlib includes
- #include <inc/hw_types.h>
- #include <inc/hw_memmap.h>
- #include <inc/hw_ints.h>
- #include <driverlib/debug.h>
- #include <driverlib/interrupt.h>
- #include <driverlib/timer.h>
- #include <driverlib/rom.h>
- #include <driverlib/rom_map.h>
- #include <driverlib/prcm.h>
- // TI-RTOS includes
- #if defined(USE_TIRTOS) || defined(USE_FREERTOS) || defined(SL_PLATFORM_MULTI_THREADED)
- #include <stdlib.h>
- #include "osi.h"
- #endif
- #include "timer_if.h"
- static unsigned char
- GetPeripheralIntNum(unsigned long ulBase, unsigned long ulTimer)
- {
- if(ulTimer == TIMER_A)
- {
- switch(ulBase)
- {
- case TIMERA0_BASE:
- return INT_TIMERA0A;
- case TIMERA1_BASE:
- return INT_TIMERA1A;
- case TIMERA2_BASE:
- return INT_TIMERA2A;
- case TIMERA3_BASE:
- return INT_TIMERA3A;
- default:
- return INT_TIMERA0A;
- }
- }
- else if(ulTimer == TIMER_B)
- {
- switch(ulBase)
- {
- case TIMERA0_BASE:
- return INT_TIMERA0B;
- case TIMERA1_BASE:
- return INT_TIMERA1B;
- case TIMERA2_BASE:
- return INT_TIMERA2B;
- case TIMERA3_BASE:
- return INT_TIMERA3B;
- default:
- return INT_TIMERA0B;
- }
- }
- else
- {
- return INT_TIMERA0A;
- }
- }
- //*****************************************************************************
- //
- //! Initializing the Timer
- //!
- //! \param ePeripheral is the peripheral which need to be initialized.
- //! \param ulBase is the base address for the timer.
- //! \param ulConfig is the configuration for the timer.
- //! \param ulTimer selects amoung the TIMER_A or TIMER_B or TIMER_BOTH.
- //! \param ulValue is the timer prescale value which must be between 0 and
- //! 255 (inclusive) for 16/32-bit timers and between 0 and 65535 (inclusive)
- //! for 32/64-bit timers.
- //! This function
- //! 1. Enables and reset the peripheral for the timer.
- //! 2. Configures and set the prescale value for the timer.
- //!
- //! \return none
- //
- //*****************************************************************************
- void Timer_IF_Init( unsigned long ePeripheral, unsigned long ulBase, unsigned
- long ulConfig, unsigned long ulTimer, unsigned long ulValue)
- {
- //
- // Initialize GPT A0 (in 32 bit mode) as periodic down counter.
- //
- MAP_PRCMPeripheralClkEnable(ePeripheral, PRCM_RUN_MODE_CLK);
- MAP_PRCMPeripheralReset(ePeripheral);
- MAP_TimerConfigure(ulBase,ulConfig);
- MAP_TimerPrescaleSet(ulBase,ulTimer,ulValue);
- }
- //*****************************************************************************
- //
- //! setting up the timer
- //!
- //! \param ulBase is the base address for the timer.
- //! \param ulTimer selects between the TIMER_A or TIMER_B or TIMER_BOTH.
- //! \param TimerBaseIntHandler is the pointer to the function that handles the
- //! interrupt for the Timer
- //!
- //! This function
- //! 1. Register the function handler for the timer interrupt.
- //! 2. enables the timer interrupt.
- //!
- //! \return none
- //
- //*****************************************************************************
- void Timer_IF_IntSetup(unsigned long ulBase, unsigned long ulTimer,
- void (*TimerBaseIntHandler)(void))
- {
- //
- // Setup the interrupts for the timer timeouts.
- //
- #if defined(USE_TIRTOS) || defined(USE_FREERTOS) || defined(SL_PLATFORM_MULTI_THREADED)
- // USE_TIRTOS: if app uses TI-RTOS (either networking/non-networking)
- // USE_FREERTOS: if app uses Free-RTOS (either networking/non-networking)
- // SL_PLATFORM_MULTI_THREADED: if app uses any OS + networking(simplelink)
- if(ulTimer == TIMER_BOTH)
- {
- osi_InterruptRegister(GetPeripheralIntNum(ulBase, TIMER_A),
- TimerBaseIntHandler, INT_PRIORITY_LVL_1);
- osi_InterruptRegister(GetPeripheralIntNum(ulBase, TIMER_B),
- TimerBaseIntHandler, INT_PRIORITY_LVL_1);
- }
- else
- {
- osi_InterruptRegister(GetPeripheralIntNum(ulBase, ulTimer),
- TimerBaseIntHandler, INT_PRIORITY_LVL_1);
- }
-
- #else
- MAP_IntPrioritySet(GetPeripheralIntNum(ulBase, ulTimer), INT_PRIORITY_LVL_1);
- MAP_TimerIntRegister(ulBase, ulTimer, TimerBaseIntHandler);
- #endif
-
- if(ulTimer == TIMER_BOTH)
- {
- MAP_TimerIntEnable(ulBase, TIMER_TIMA_TIMEOUT|TIMER_TIMB_TIMEOUT);
- }
- else
- {
- MAP_TimerIntEnable(ulBase, ((ulTimer == TIMER_A) ? TIMER_TIMA_TIMEOUT :
- TIMER_TIMB_TIMEOUT));
- }
- }
- //*****************************************************************************
- //
- //! clears the timer interrupt
- //!
- //! \param ulBase is the base address for the timer.
- //!
- //! This function
- //! 1. clears the interrupt with given base.
- //!
- //! \return none
- //
- //*****************************************************************************
- void Timer_IF_InterruptClear(unsigned long ulBase)
- {
- unsigned long ulInts;
- ulInts = MAP_TimerIntStatus(ulBase, true);
- //
- // Clear the timer interrupt.
- //
- MAP_TimerIntClear(ulBase, ulInts);
- }
- //*****************************************************************************
- //
- //! starts the timer
- //!
- //! \param ulBase is the base address for the timer.
- //! \param ulTimer selects amoung the TIMER_A or TIMER_B or TIMER_BOTH.
- //! \param ulValue is the time delay in mSec after that run out,
- //! timer gives an interrupt.
- //!
- //! This function
- //! 1. Load the Timer with the specified value.
- //! 2. enables the timer.
- //!
- //! \return none
- //!
- //! \Note- HW Timer runs on 80MHz clock
- //
- //*****************************************************************************
- void Timer_IF_Start(unsigned long ulBase, unsigned long ulTimer,
- unsigned long ulValue)
- {
- MAP_TimerLoadSet(ulBase,ulTimer,MILLISECONDS_TO_TICKS(ulValue));
- //
- // Enable the GPT
- //
- MAP_TimerEnable(ulBase,ulTimer);
- }
- //*****************************************************************************
- //
- //! disable the timer
- //!
- //! \param ulBase is the base address for the timer.
- //! \param ulTimer selects amoung the TIMER_A or TIMER_B or TIMER_BOTH.
- //!
- //! This function
- //! 1. disables the interupt.
- //!
- //! \return none
- //
- //*****************************************************************************
- void Timer_IF_Stop(unsigned long ulBase, unsigned long ulTimer)
- {
- //
- // Disable the GPT
- //
- MAP_TimerDisable(ulBase,ulTimer);
- }
- //*****************************************************************************
- //
- //! De-Initialize the timer
- //!
- //! \param uiGPTBaseAddr
- //! \param ulTimer
- //!
- //! This function
- //! 1. disable the timer interrupts
- //! 2. unregister the timer interrupt
- //!
- //! \return None.
- //
- //*****************************************************************************
- void Timer_IF_DeInit(unsigned long ulBase,unsigned long ulTimer)
- {
- //
- // Disable the timer interrupt
- //
- MAP_TimerIntDisable(ulBase,TIMER_TIMA_TIMEOUT|TIMER_TIMB_TIMEOUT);
- //
- // Unregister the timer interrupt
- //
- MAP_TimerIntUnregister(ulBase,ulTimer);
- }
- //*****************************************************************************
- //
- //! starts the timer
- //!
- //! \param ulBase is the base address for the timer.
- //! \param ulTimer selects between the TIMER A and TIMER B.
- //! \param ulValue is timer reload value (mSec) after which the timer will run out and gives an interrupt.
- //!
- //! This function
- //! 1. Reload the Timer with the specified value.
- //!
- //! \return none
- //
- //*****************************************************************************
- void Timer_IF_ReLoad(unsigned long ulBase, unsigned long ulTimer,
- unsigned long ulValue)
- {
- MAP_TimerLoadSet(ulBase,ulTimer,MILLISECONDS_TO_TICKS(ulValue));
- }
- //*****************************************************************************
- //
- //! starts the timer
- //!
- //! \param ulBase is the base address for the timer.
- //! \param ulTimer selects amoung the TIMER_A or TIMER_B or TIMER_BOTH.
- //!
- //! This function
- //! 1. returns the timer value.
- //!
- //! \return Timer Value.
- //
- //*****************************************************************************
- unsigned int Timer_IF_GetCount(unsigned long ulBase, unsigned long ulTimer)
- {
- unsigned long ulCounter;
- ulCounter = MAP_TimerValueGet(ulBase, ulTimer);
- return 0xFFFFFFFF - ulCounter;
- }
- //*****************************************************************************
- //
- // Close the Doxygen group.
- //! @}
- //
- //*****************************************************************************
|