mirror of https://github.com/ARMmbed/mbed-os.git
[BEETLE] Fix US_Ticker read
MBED OS requires an us_ticker_read function that returns a 32bit value in microseconds. This can not be represented directly on the Beetle Timer Load register. max_us_on_reg = (0xFFFFFFFF ticks)/DIVIDER_US This patch introduces an intermediate layer that counts the timer wraps around and returns the correct value of us to the MBED library. Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>pull/2204/head
parent
1b364a1e52
commit
4f5b191e74
|
|
@ -165,14 +165,22 @@ uint32_t Timer_Read(uint32_t timer)
|
||||||
*/
|
*/
|
||||||
void Timer_SetInterrupt(uint32_t timer, uint32_t time_us)
|
void Timer_SetInterrupt(uint32_t timer, uint32_t time_us)
|
||||||
{
|
{
|
||||||
|
uint32_t load_time_us = 0;
|
||||||
/* Verify if the Timer is enabled */
|
/* Verify if the Timer is enabled */
|
||||||
if (Timer_isEnabled(timer) == 1) {
|
if (Timer_isEnabled(timer) == 1) {
|
||||||
/* Disable Timer */
|
/* Disable Timer */
|
||||||
Timer_Disable(timer);
|
Timer_Disable(timer);
|
||||||
/* Enable Interrupt */
|
/* Enable Interrupt */
|
||||||
(Timers[timer].timerN)->CTRL = CMSDK_TIMER_CTRL_IRQEN_Msk;
|
(Timers[timer].timerN)->CTRL = CMSDK_TIMER_CTRL_IRQEN_Msk;
|
||||||
|
|
||||||
|
/* Check time us condition */
|
||||||
|
if(time_us == TIMER_DEFAULT_RELOAD)
|
||||||
|
load_time_us = TIMER_MAX_VALUE;
|
||||||
|
else
|
||||||
|
load_time_us = time_us * TIMER_TICKS_US;
|
||||||
|
|
||||||
/* Initialize Timer Value */
|
/* Initialize Timer Value */
|
||||||
Timers[timer].timerReload = (time_us) * TIMER_TICKS_US;
|
Timers[timer].timerReload = load_time_us;
|
||||||
(Timers[timer].timerN)->RELOAD = Timers[timer].timerReload;
|
(Timers[timer].timerN)->RELOAD = Timers[timer].timerReload;
|
||||||
(Timers[timer].timerN)->VALUE = Timers[timer].timerReload;
|
(Timers[timer].timerN)->VALUE = Timers[timer].timerReload;
|
||||||
/* Enable Counter */
|
/* Enable Counter */
|
||||||
|
|
@ -234,3 +242,21 @@ uint32_t Timer_GetTicksUS(uint32_t timer)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timer_GetReloadValue(): returns the load value of the selected
|
||||||
|
* timer.
|
||||||
|
* timer: timer associated with the Ticks per us
|
||||||
|
* @return: reload value of the selected singletimer
|
||||||
|
*/
|
||||||
|
uint32_t Timer_GetReloadValue(uint32_t timer)
|
||||||
|
{
|
||||||
|
/* Verify if the Timer is enabled */
|
||||||
|
if (Timer_isEnabled(timer) == 1) {
|
||||||
|
if (timer == TIMER1)
|
||||||
|
return Timers[timer].timerReload / TIMER_TICKS_US;
|
||||||
|
else
|
||||||
|
return Timers[timer].timerReload / TIMER_TICKS_US;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,9 @@ extern "C" {
|
||||||
#define TIMER0 0
|
#define TIMER0 0
|
||||||
#define TIMER1 1
|
#define TIMER1 1
|
||||||
|
|
||||||
|
/* Default reload */
|
||||||
|
#define TIMER_DEFAULT_RELOAD 0xFFFFFFFF
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Timer_Initialize(): Initializes an hardware timer
|
* Timer_Initialize(): Initializes an hardware timer
|
||||||
* timer: timer to be Initialized
|
* timer: timer to be Initialized
|
||||||
|
|
@ -92,6 +95,14 @@ uint32_t Timer_GetIRQn(uint32_t timer);
|
||||||
*/
|
*/
|
||||||
uint32_t Timer_GetTicksUS(uint32_t timer);
|
uint32_t Timer_GetTicksUS(uint32_t timer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Timer_GetReloadValue(): returns the load value of the selected
|
||||||
|
* timer.
|
||||||
|
* timer: timer associated with the Ticks per us
|
||||||
|
* @return: reload value of the selected singletimer
|
||||||
|
*/
|
||||||
|
uint32_t Timer_GetReloadValue(uint32_t timer);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
|
|
@ -23,11 +23,19 @@ static uint32_t us_ticker_reload = 0x0; /* Max Value */
|
||||||
/* us ticker initialized */
|
/* us ticker initialized */
|
||||||
static uint32_t us_ticker_inited = 0;
|
static uint32_t us_ticker_inited = 0;
|
||||||
/* us ticker overflow */
|
/* us ticker overflow */
|
||||||
static uint32_t us_ticker_overflow = 0;
|
static uint32_t us_ticker_overflow_delta = 0;
|
||||||
|
/* us ticker overflow limit */
|
||||||
|
static uint32_t us_ticker_overflow_limit = 0;
|
||||||
|
|
||||||
void __us_ticker_irq_handler(void) {
|
void __us_ticker_irq_handler(void) {
|
||||||
Timer_ClearInterrupt(TIMER1);
|
Timer_ClearInterrupt(TIMER1);
|
||||||
us_ticker_overflow++;
|
/*
|
||||||
|
* For each overflow event adds the timer max represented value to
|
||||||
|
* the delta. This allows the us_ticker to keep track of the elapsed
|
||||||
|
* time:
|
||||||
|
* elapsed_time = (num_overflow * overflow_limit) + current_time
|
||||||
|
*/
|
||||||
|
us_ticker_overflow_delta += us_ticker_overflow_limit;
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_init(void) {
|
void us_ticker_init(void) {
|
||||||
|
|
@ -57,6 +65,18 @@ void us_ticker_init(void) {
|
||||||
us_ticker_irqn1 = Timer_GetIRQn(TIMER1);
|
us_ticker_irqn1 = Timer_GetIRQn(TIMER1);
|
||||||
NVIC_SetVector((IRQn_Type)us_ticker_irqn1, (uint32_t)__us_ticker_irq_handler);
|
NVIC_SetVector((IRQn_Type)us_ticker_irqn1, (uint32_t)__us_ticker_irq_handler);
|
||||||
NVIC_EnableIRQ((IRQn_Type)us_ticker_irqn1);
|
NVIC_EnableIRQ((IRQn_Type)us_ticker_irqn1);
|
||||||
|
|
||||||
|
/* Timer set interrupt on TIMER1 */
|
||||||
|
Timer_SetInterrupt(TIMER1, TIMER_DEFAULT_RELOAD);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set us_ticker Overflow limit. The us_ticker overflow limit is required
|
||||||
|
* to calculated the return value of the us_ticker read function in us
|
||||||
|
* on 32bit.
|
||||||
|
* A 32bit us value cannot be represented directly in the Timer Load
|
||||||
|
* register if it is greater than (0xFFFFFFFF ticks)/TIMER_DIVIDER_US.
|
||||||
|
*/
|
||||||
|
us_ticker_overflow_limit = Timer_GetReloadValue(TIMER1);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t us_ticker_read() {
|
uint32_t us_ticker_read() {
|
||||||
|
|
@ -64,7 +84,9 @@ uint32_t us_ticker_read() {
|
||||||
|
|
||||||
if (!us_ticker_inited)
|
if (!us_ticker_inited)
|
||||||
us_ticker_init();
|
us_ticker_init();
|
||||||
return_value = Timer_Read(TIMER1);
|
|
||||||
|
return_value = us_ticker_overflow_delta + Timer_Read(TIMER1);
|
||||||
|
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue