mirror of https://github.com/ARMmbed/mbed-os.git
Adding implementation for us_ticker APIs. Not complete, yet to be tested.
parent
1fbe9894cd
commit
5f120e40de
|
@ -19,29 +19,95 @@
|
||||||
#include "mbed_assert.h"
|
#include "mbed_assert.h"
|
||||||
#include "ins_gclk.h"
|
#include "ins_gclk.h"
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
|
#include "tc.h"
|
||||||
|
#include "tc_interrupt.h"
|
||||||
|
|
||||||
void us_ticker_irq_handler_internal(void)
|
static int us_ticker_inited = 0;
|
||||||
|
|
||||||
|
struct tc_module us_ticker_module;
|
||||||
|
|
||||||
|
void us_ticker_irq_handler_internal(struct tc_module* us_tc_module)
|
||||||
{
|
{
|
||||||
|
us_ticker_irq_handler();
|
||||||
|
|
||||||
|
/* Disable the callback */
|
||||||
|
tc_disable_callback(us_tc_module, TC_CALLBACK_CC_CHANNEL0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_init(void)
|
void us_ticker_init(void)
|
||||||
{
|
{
|
||||||
|
uint32_t cycles_per_us;
|
||||||
|
uint32_t prescaler = 0;
|
||||||
|
struct tc_config config_tc;
|
||||||
|
enum status_code ret_status;
|
||||||
|
|
||||||
|
if (us_ticker_inited) return;
|
||||||
|
us_ticker_inited = 1;
|
||||||
|
|
||||||
|
|
||||||
|
tc_get_config_defaults(&config_tc);
|
||||||
|
|
||||||
|
cycles_per_us = system_gclk_gen_get_hz(config_tc.clock_source) / 1000000;
|
||||||
|
MBED_ASSERT(cycles_per_us > 0);
|
||||||
|
while((cycles_per_us & 1) == 0 && prescaler <= 10) {
|
||||||
|
cycles_per_us = cycles_per_us >> 1;
|
||||||
|
prescaler++;
|
||||||
|
}
|
||||||
|
config_tc.clock_prescaler = TC_CTRLA_PRESCALER(prescaler);
|
||||||
|
config_tc.counter_size = TC_COUNTER_SIZE_32BIT;
|
||||||
|
config_tc.counter_32_bit.value = 0;
|
||||||
|
config_tc.counter_32_bit.compare_capture_channel[0] = 0xFFFFFFFF;
|
||||||
|
|
||||||
|
//config_tc.oneshot = true;
|
||||||
|
|
||||||
|
/* Initialize the timer */
|
||||||
|
ret_status = tc_init(&us_ticker_module, TC4, &config_tc);
|
||||||
|
MBED_ASSERT(ret_status == STATUS_OK);
|
||||||
|
|
||||||
|
/* Register callback function */
|
||||||
|
tc_register_callback(&us_ticker_module, (tc_callback_t)us_ticker_irq_handler_internal, TC_CALLBACK_CC_CHANNEL0);
|
||||||
|
|
||||||
|
/* Enable the timer module */
|
||||||
|
tc_enable(&us_ticker_module);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t us_ticker_read()
|
uint32_t us_ticker_read()
|
||||||
{
|
{
|
||||||
|
if (!us_ticker_inited)
|
||||||
|
us_ticker_init();
|
||||||
|
|
||||||
|
return tc_get_count_value(&us_ticker_module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_set_interrupt(timestamp_t timestamp)
|
void us_ticker_set_interrupt(timestamp_t timestamp)
|
||||||
{
|
{
|
||||||
|
uint32_t cur_time;
|
||||||
|
int32_t delta;
|
||||||
|
|
||||||
|
cur_time = us_ticker_read();
|
||||||
|
delta = (int32_t)((uint32_t)timestamp - cur_time);
|
||||||
|
if (delta < 0)
|
||||||
|
{
|
||||||
|
/* Event already occurred in past */
|
||||||
|
us_ticker_irq_handler();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
tc_set_compare_value(&us_ticker_module, TC_CALLBACK_CC_CHANNEL0, timestamp);
|
||||||
|
|
||||||
|
/* Enable the callback */
|
||||||
|
tc_enable_callback(&us_ticker_module, TC_CALLBACK_CC_CHANNEL0);
|
||||||
|
|
||||||
|
/* Enable the timer module */
|
||||||
|
//tc_enable(&us_ticker_module);
|
||||||
}
|
}
|
||||||
|
|
||||||
void us_ticker_clear_interrupt(void)
|
void us_ticker_disable_interrupt(void) {
|
||||||
{
|
/* Disable the callback */
|
||||||
|
tc_disable_callback(&us_ticker_module, TC_CALLBACK_CC_CHANNEL0);
|
||||||
}
|
}
|
||||||
/***************************************************************/
|
|
||||||
|
void us_ticker_clear_interrupt(void) {
|
||||||
|
/* Disable the callback */
|
||||||
|
tc_disable_callback(&us_ticker_module, TC_CALLBACK_CC_CHANNEL0);
|
||||||
|
}
|
Loading…
Reference in New Issue