Browse Source

Upload files to ''

Sree 6 years ago
parent
commit
3148f87573
2 changed files with 336 additions and 0 deletions
  1. 291 0
      timer_if.c
  2. 45 0
      timer_if.h

+ 291 - 0
timer_if.c

@@ -0,0 +1,291 @@
+// 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.
+//! @}
+//
+//*****************************************************************************

+ 45 - 0
timer_if.h

@@ -0,0 +1,45 @@
+//*****************************************************************************
+
+#ifndef __TIMER_IF_H__
+#define __TIMER_IF_H__
+
+//*****************************************************************************
+//
+// If building with a C++ compiler, make all of the definitions in this header
+// have a C binding.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+
+/****************************************************************************/
+/*                MACROS                    */
+/****************************************************************************/
+#define SYS_CLK           80000000
+#define MILLISECONDS_TO_TICKS(ms)   ((SYS_CLK/1000) * (ms))
+#define PERIODIC_TEST_LOOPS     5
+
+extern void Timer_IF_Init( unsigned long ePeripheralc, unsigned long ulBase,
+    unsigned long ulConfig, unsigned long ulTimer, unsigned long ulValue);
+extern void Timer_IF_IntSetup(unsigned long ulBase, unsigned long ulTimer, 
+                   void (*TimerBaseIntHandler)(void));
+extern void Timer_IF_InterruptClear(unsigned long ulBase);
+extern void Timer_IF_Start(unsigned long ulBase, unsigned long ulTimer, 
+                unsigned long ulValue);
+extern void Timer_IF_Stop(unsigned long ulBase, unsigned long ulTimer);
+extern void Timer_IF_ReLoad(unsigned long ulBase, unsigned long ulTimer, 
+                unsigned long ulValue);
+extern unsigned int Timer_IF_GetCount(unsigned long ulBase, unsigned long ulTimer);
+void Timer_IF_DeInit(unsigned long ulBase,unsigned long ulTimer);
+//*****************************************************************************
+//
+// Mark the end of the C bindings section for C++ compilers.
+//
+//*****************************************************************************
+#ifdef __cplusplus
+}
+#endif
+#endif //  __TIMER_IF_H__