sdk-ameba-v4.0c_180328/component/common/mbed/targets/hal/rtl8711b/timer_api.c
2019-04-02 16:34:25 +08:00

201 lines
6 KiB
C
Executable file

/** mbed Microcontroller Library
******************************************************************************
* @file timer_api.c
* @author
* @version V1.0.0
* @date 2016-08-01
* @brief This file provides mbed API for gtimer.
******************************************************************************
* @attention
*
* This module is a confidential and proprietary property of RealTek and
* possession or use of this module requires written permission of RealTek.
*
* Copyright(c) 2016, Realtek Semiconductor Corporation. All rights reserved.
******************************************************************************
*/
#include "objects.h"
#include "timer_api.h"
/**
* @brief gtimer interrupt handler function.
* @param data: timer IRQ callback parameter
* @retval none
*/
static void gtimer_timeout_handler (uint32_t data)
{
gtimer_t *obj = (gtimer_t *)data;
uint32_t tid = obj->timer_id;
gtimer_irq_handler handler;
RTIM_INTClear(TIMx[tid]);
if (obj->handler != NULL) {
handler = (gtimer_irq_handler)obj->handler;
handler(obj->hid);
}
if (!obj->is_periodcal) {
gtimer_stop(obj);
}
}
/**
* @brief Initializes the timer device, include timer registers and interrupt.
* @param obj: timer object define in application software.
* @param tid: general timer ID, which can be one of the following parameters:
* @arg TIMER0
* @arg TIMER1
* @arg TIMER2
* @arg TIMER3
* @note TIMER0 is reserved, TIMER1/2/3 are recommended.
* @retval none
*/
void gtimer_init (gtimer_t *obj, uint32_t tid)
{
RTIM_TimeBaseInitTypeDef TIM_InitStruct;
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
obj->timer_id = tid;
RTIM_TimeBaseStructInit(&TIM_InitStruct);
TIM_InitStruct.TIM_Idx = (u8)tid;
TIM_InitStruct.TIM_UpdateEvent = ENABLE; /* UEV enable */
TIM_InitStruct.TIM_UpdateSource = TIM_UpdateSource_Overflow;
TIM_InitStruct.TIM_ARRProtection = ENABLE;
RTIM_TimeBaseInit(TIMx[tid], &TIM_InitStruct, TIMx_irq[tid], (IRQ_FUN) gtimer_timeout_handler, (u32)obj);
}
/**
* @brief Deinitializes the timer device, include timer function and interrupt.
* @param obj: timer object define in application software.
* @retval none
*/
void gtimer_deinit (gtimer_t *obj)
{
uint32_t tid = obj->timer_id;
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
RTIM_DeInit(TIMx[tid]);
}
/**
* @brief Get counter value of the specified timer.
* @param obj: timer object define in application software.
* @retval value: counter value
*/
uint32_t gtimer_read_tick (gtimer_t *obj)
{
uint32_t tid = obj->timer_id;
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
return (RTIM_GetCount(TIMx[tid]));
}
/**
* @brief Get count value in microseconds of the specified timer.
* @param obj: timer object define in application software.
* @retval value: count value in microseconds.
*/
uint64_t gtimer_read_us (gtimer_t *obj) //need to be test in IAR(64bit computing)
{
assert_param((obj->timer_id < GTIMER_MAX) && (obj->timer_id > TIMER0));
uint64_t time_us;
time_us = gtimer_read_tick(obj) *1000000 /32768;
return (time_us);
}
/**
* @brief Change period of the specified timer.
* @param obj: timer object define in application software.
* @param duration_us: the new period to be set in microseconds.
* @retval none
*/
void gtimer_reload (gtimer_t *obj, uint32_t duration_us)
{
uint32_t tid = obj->timer_id;
uint32_t temp = (uint32_t)((float)duration_us / 1000000 *32768);
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
RTIM_ChangePeriod(TIMx[tid], temp);
}
/**
* @brief Start the specified timer and enable update interrupt.
* @param obj: timer object define in application software.
* @retval none
*/
void gtimer_start (gtimer_t *obj)
{
uint32_t tid = obj->timer_id;
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
RTIM_INTConfig(TIMx[tid], TIM_IT_Update, ENABLE);
RTIM_Cmd(TIMx[tid], ENABLE);
}
/**
* @brief Start the specified timer in one-shot mode with specified period and interrupt handler.
* @param obj: timer object define in application software.
* @param duration_us: the new period to be set in microseconds.
* @param handler: user defined IRQ callback function
* @param hid: user defined IRQ callback parameter
* @retval none
* @note This function set the timer into one-shot mode which stops after the first time the counter overflows.
*/
void gtimer_start_one_shout (gtimer_t *obj, uint32_t duration_us, void* handler, uint32_t hid)
{
assert_param((obj->timer_id < GTIMER_MAX) && (obj->timer_id > TIMER0));
obj->is_periodcal = _FALSE;
obj->handler = handler;
obj->hid = hid;
gtimer_reload(obj, duration_us);
gtimer_start(obj);
}
/**
* @brief Start the specified timer in periodical mode with specified period and interrupt handler.
* @param obj: timer object define in application software.
* @param duration_us: the new period to be set in microseconds.
* @param handler: user defined IRQ callback function
* @param hid: user defined IRQ callback parameter
* @retval none
* @note This functon set the timer into periodical mode which will restart to count from 0 each time the counter overflows.
*/
void gtimer_start_periodical (gtimer_t *obj, uint32_t duration_us, void* handler, uint32_t hid)
{
assert_param((obj->timer_id < GTIMER_MAX) && (obj->timer_id > TIMER0));
obj->is_periodcal = _TRUE;
obj->handler = handler;
obj->hid = hid;
gtimer_reload(obj, duration_us);
gtimer_start(obj);
}
/**
* @brief Disable the specified timer peripheral.
* @param obj: timer object define in application software.
* @retval none
*/
void gtimer_stop (gtimer_t *obj)
{
uint32_t tid = obj->timer_id;
assert_param((tid < GTIMER_MAX) && (tid > TIMER0));
RTIM_Cmd(TIMx[tid], DISABLE);
}