mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Revision:
174:b96e65c34a4d
Parent:
173:e131a1973e81
Child:
177:d650f5d4c87a
--- a/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c	Fri Sep 15 14:59:18 2017 +0100
+++ b/targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c	Mon Oct 02 15:33:19 2017 +0100
@@ -20,8 +20,22 @@
 #include "PeripheralNames.h"
 
 #define TICK_READ_FROM_CPU  0   // 1: read tick from CPU, 0: read tick from G-Timer
-#define SYS_TIM_ID      1   // the G-Timer ID for System
-#define APP_TIM_ID      6   // the G-Timer ID for Application
+#define SYS_TIM_ID          1   // the G-Timer ID for System
+#define APP_TIM_ID          6   // the G-Timer ID for Application
+
+/*
+ * For RTL8195AM, clock source is 32k
+ *
+ *   us per tick: 30.5
+ *   tick per ms: 32.7
+ *   tick per us: 0.032
+ *   tick per sec: 32768
+ *
+ * Define the following macros to convert between TICK and US.
+ */
+#define MS_TO_TICK(x)       (uint64_t)(((x)*327) / 10)
+#define US_TO_TICK(x)       (uint64_t)(((x)*32) / 1000)
+#define TICK_TO_US(x)       (uint64_t)(((x)/2) * 61 + ((x)%2) * TIMER_TICK_US)
 
 static int us_ticker_inited = 0;
 static TIMER_ADAPTER TimerAdapter;
@@ -29,19 +43,25 @@
 extern HAL_TIMER_OP HalTimerOp;
 extern HAL_TIMER_OP_EXT HalTimerOpExt;
 
-VOID _us_ticker_irq_handler(IN  VOID *Data)
+VOID _us_ticker_irq_handler(void *Data)
 {
     us_ticker_irq_handler();
 }
 
-void us_ticker_init(void) 
+void us_ticker_init(void)
 {
-    
-    if (us_ticker_inited) return;
+    if (us_ticker_inited) {
+        return;
+    }
+
     us_ticker_inited = 1;
-    
 
-    // Initial a G-Timer
+    // Reload and restart sys-timer
+    HalTimerOp.HalTimerDis(SYS_TIM_ID);
+    HalTimerOpExt.HalTimerReLoad(SYS_TIM_ID, 0xFFFFFFFFUL);
+    HalTimerOp.HalTimerEn(SYS_TIM_ID);
+
+    // Initial a app-timer
     TimerAdapter.IrqDis = 0;    // Enable Irq @ initial
     TimerAdapter.IrqHandle.IrqFun = (IRQ_FUN) _us_ticker_irq_handler;
     TimerAdapter.IrqHandle.IrqNum = TIMER2_7_IRQ;
@@ -52,58 +72,58 @@
     TimerAdapter.TimerLoadValueUs = 0xFFFFFFFF;
     TimerAdapter.TimerMode = USER_DEFINED;
 
-    HalTimerOp.HalTimerInit((VOID*) &TimerAdapter);
+    HalTimerOp.HalTimerInit((void *) &TimerAdapter);
 
     DBG_TIMER_INFO("%s: Timer_Id=%d\n", __FUNCTION__, APP_TIM_ID);
 }
 
-uint32_t us_ticker_read() 
+uint32_t us_ticker_read(void)
 {
     uint32_t tick_cnt;
-    uint32_t ticks_125ms;
-    uint32_t ticks_remain;
-    uint64_t us_tick;
+    uint64_t tick_us;
+
+    if (!us_ticker_inited) {
+        us_ticker_init();
+    }
 
     tick_cnt = HalTimerOp.HalTimerReadCount(SYS_TIM_ID);
-    tick_cnt = 0xffffffff - tick_cnt;   // it's a down counter
-    ticks_125ms = tick_cnt/(GTIMER_CLK_HZ/8);  //use 125ms as a intermediate unit; 
-    ticks_remain = tick_cnt - (ticks_125ms*(GTIMER_CLK_HZ/8));  //calculate the remainder
-    us_tick = ticks_125ms * 125000;  //change unit to us, 125ms is 125000 us
-    us_tick += (ticks_remain * 1000000)/GTIMER_CLK_HZ;  //also use us as unit
+    tick_us = TICK_TO_US(0xFFFFFFFFUL - tick_cnt);
 
-    return ((uint32_t)us_tick);  //return ticker value in micro-seconds (us)
+    return ((uint32_t)tick_us);  //return ticker value in micro-seconds (us)
 }
 
-void us_ticker_set_interrupt(timestamp_t timestamp) 
+void us_ticker_set_interrupt(timestamp_t timestamp)
 {
-    uint32_t cur_time_us;
-    uint32_t time_dif;
+    uint32_t time_cur;
+    uint32_t time_cnt;
 
     HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
-    cur_time_us = us_ticker_read();
-    if ((uint32_t)timestamp > cur_time_us) {
-        time_dif = (uint32_t)timestamp - cur_time_us;
+    time_cur = us_ticker_read();
+    if (timestamp > time_cur + TIMER_TICK_US) {
+        time_cnt = timestamp - time_cur;
     } else {
         HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, 0xffffffff);
-        HalTimerOpExt.HalTimerIrqEn((u32)TimerAdapter.TimerId);
         HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId);
-        NVIC_SetPendingIRQ(TIMER2_7_IRQ);
+        us_ticker_fire_interrupt();
         return;
-    }    
+    }
 
-    TimerAdapter.TimerLoadValueUs = time_dif;
-    HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, time_dif / TIMER_TICK_US);
-    HalTimerOpExt.HalTimerIrqEn((u32)TimerAdapter.TimerId);
+    TimerAdapter.TimerLoadValueUs = MAX(MS_TO_TICK(time_cnt/1000) + US_TO_TICK(time_cnt%1000), 1);
+    HalTimerOpExt.HalTimerReLoad((u32)TimerAdapter.TimerId, TimerAdapter.TimerLoadValueUs);
     HalTimerOp.HalTimerEn((u32)TimerAdapter.TimerId);
-
 }
 
-void us_ticker_disable_interrupt(void) 
+void us_ticker_fire_interrupt(void)
+{
+    NVIC_SetPendingIRQ(TIMER2_7_IRQ);
+}
+
+void us_ticker_disable_interrupt(void)
 {
     HalTimerOp.HalTimerDis((u32)TimerAdapter.TimerId);
 }
 
-void us_ticker_clear_interrupt(void) 
+void us_ticker_clear_interrupt(void)
 {
     HalTimerOp.HalTimerIrqClear((u32)TimerAdapter.TimerId);
 }