mbed library sources

Dependents:   frdm_kl05z_gpio_test

Fork of mbed-src by mbed official

Revision:
270:e2babe29baf8
Parent:
224:e7c230c6cb31
Child:
300:55638feb26a4
diff -r 0e58554f11d5 -r e2babe29baf8 targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/targets/hal/TARGET_NORDIC/TARGET_MCU_NRF51822/us_ticker.c	Fri Aug 01 14:45:06 2014 +0100
@@ -0,0 +1,127 @@
+/* mbed Microcontroller Library
+ * Copyright (c) 2013 Nordic Semiconductor
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include <stddef.h>
+#include "us_ticker_api.h"
+#include "cmsis.h"
+#include "PeripheralNames.h"
+
+#define US_TICKER_TIMER      NRF_TIMER1
+#define US_TICKER_TIMER_IRQn TIMER1_IRQn
+
+int us_ticker_inited = 0;
+volatile uint16_t overflow=0; //overflow value that forms the upper 16 bits of the counter
+volatile uint16_t timeStamp=0;
+
+#ifdef __cplusplus
+extern "C" {
+#endif 
+void TIMER1_IRQHandler(void){ 
+
+     if ((US_TICKER_TIMER->EVENTS_COMPARE[1] != 0) && 
+       ((US_TICKER_TIMER->INTENSET & TIMER_INTENSET_COMPARE1_Msk) != 0))
+    {
+		US_TICKER_TIMER->EVENTS_COMPARE[1] = 0;
+		overflow++;    
+		US_TICKER_TIMER->CC[1] =0xFFFF;
+		if(timeStamp>0)
+		{			
+			timeStamp--;
+			if(timeStamp==0)
+			{				
+				us_ticker_clear_interrupt();
+				us_ticker_disable_interrupt();
+				us_ticker_irq_handler();					
+				return;
+			}
+		}			       
+    }
+	if ((US_TICKER_TIMER->EVENTS_COMPARE[0] != 0) && 
+    ((US_TICKER_TIMER->INTENSET & TIMER_INTENSET_COMPARE0_Msk) != 0))
+    {	
+		us_ticker_clear_interrupt();
+		us_ticker_disable_interrupt();
+		if(timeStamp==0)
+			us_ticker_irq_handler();			
+    }
+        
+}
+#ifdef __cplusplus
+}
+#endif 
+void us_ticker_init(void){
+    if (us_ticker_inited && US_TICKER_TIMER->POWER){
+        return;
+    }
+    
+    us_ticker_inited = 1;
+    
+    US_TICKER_TIMER->POWER = 0;
+    US_TICKER_TIMER->POWER = 1;
+    
+    US_TICKER_TIMER->MODE = TIMER_MODE_MODE_Timer;
+    
+    US_TICKER_TIMER->PRESCALER = 4;
+    US_TICKER_TIMER->BITMODE = TIMER_BITMODE_BITMODE_16Bit; 
+    US_TICKER_TIMER->TASKS_CLEAR =1;
+    US_TICKER_TIMER->CC[1] = 0xFFFF;
+    US_TICKER_TIMER->INTENSET = TIMER_INTENSET_COMPARE1_Set << TIMER_INTENSET_COMPARE1_Pos;
+	
+    NVIC_SetPriority(US_TICKER_TIMER_IRQn, 3);
+    NVIC_EnableIRQ(US_TICKER_TIMER_IRQn);
+    
+    US_TICKER_TIMER->TASKS_START = 0x01;
+}
+
+uint32_t us_ticker_read(){
+    if (!us_ticker_inited || US_TICKER_TIMER->POWER==0){
+        us_ticker_init();
+    }
+    
+    uint16_t bufferedOverFlow   =         overflow;
+    US_TICKER_TIMER->TASKS_CAPTURE[2] = 1; 
+	
+    if(overflow!=bufferedOverFlow){
+		bufferedOverFlow = overflow;
+		US_TICKER_TIMER->TASKS_CAPTURE[2] = 1;
+	}
+    return (((uint32_t)bufferedOverFlow<<16) | US_TICKER_TIMER->CC[2]);
+}
+
+void us_ticker_set_interrupt(unsigned int timestamp){
+    if (!us_ticker_inited || US_TICKER_TIMER->POWER==0)
+    {
+        us_ticker_init();
+    }	
+	
+	US_TICKER_TIMER->TASKS_CAPTURE[0] = 1;	
+	uint16_t tsUpper16 = (uint16_t)((timestamp-us_ticker_read())>>16);
+	if(tsUpper16>0){
+		if(timeStamp ==0 || timeStamp> tsUpper16){
+			timeStamp = tsUpper16;			
+		}
+	}
+	else{
+		US_TICKER_TIMER->INTENSET |= TIMER_INTENSET_COMPARE0_Set << TIMER_INTENSET_COMPARE0_Pos;
+		US_TICKER_TIMER->CC[0] += timestamp-us_ticker_read();
+	}
+}
+
+void us_ticker_disable_interrupt(void){
+    US_TICKER_TIMER->INTENCLR = TIMER_INTENCLR_COMPARE0_Clear << TIMER_INTENCLR_COMPARE0_Pos;
+}
+void us_ticker_clear_interrupt(void){
+    US_TICKER_TIMER->EVENTS_COMPARE[0] = 0;
+}