mbed library sources. Supersedes mbed-src.
Dependents: Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more
Diff: targets/TARGET_Realtek/TARGET_AMEBA/us_ticker.c
- 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); }