mbed-os
Dependents: cobaLCDJoyMotor_Thread odometry_omni_3roda_v3 odometry_omni_3roda_v1 odometry_omni_3roda_v2 ... more
features/FEATURE_COMMON_PAL/nanostack-hal-mbed-cmsis-rtos/arm_hal_timer.cpp@0:b74591d5ab33, 2017-12-11 (annotated)
- Committer:
- be_bryan
- Date:
- Mon Dec 11 17:54:04 2017 +0000
- Revision:
- 0:b74591d5ab33
motor ++
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
be_bryan | 0:b74591d5ab33 | 1 | /* |
be_bryan | 0:b74591d5ab33 | 2 | * Copyright (c) 2016 ARM Limited, All Rights Reserved |
be_bryan | 0:b74591d5ab33 | 3 | */ |
be_bryan | 0:b74591d5ab33 | 4 | |
be_bryan | 0:b74591d5ab33 | 5 | // Include before mbed.h to properly get UINT*_C() |
be_bryan | 0:b74591d5ab33 | 6 | #include "ns_types.h" |
be_bryan | 0:b74591d5ab33 | 7 | |
be_bryan | 0:b74591d5ab33 | 8 | #include "mbed.h" |
be_bryan | 0:b74591d5ab33 | 9 | #include "platform/arm_hal_timer.h" |
be_bryan | 0:b74591d5ab33 | 10 | #include "platform/arm_hal_interrupt.h" |
be_bryan | 0:b74591d5ab33 | 11 | #include <mbed_assert.h> |
be_bryan | 0:b74591d5ab33 | 12 | |
be_bryan | 0:b74591d5ab33 | 13 | static Timer timer; |
be_bryan | 0:b74591d5ab33 | 14 | static Timeout timeout; |
be_bryan | 0:b74591d5ab33 | 15 | static EventQueue *equeue; |
be_bryan | 0:b74591d5ab33 | 16 | static uint32_t due; |
be_bryan | 0:b74591d5ab33 | 17 | static void (*arm_hal_callback)(void); |
be_bryan | 0:b74591d5ab33 | 18 | |
be_bryan | 0:b74591d5ab33 | 19 | // Called once at boot |
be_bryan | 0:b74591d5ab33 | 20 | void platform_timer_enable(void) |
be_bryan | 0:b74591d5ab33 | 21 | { |
be_bryan | 0:b74591d5ab33 | 22 | equeue = mbed_highprio_event_queue(); |
be_bryan | 0:b74591d5ab33 | 23 | MBED_ASSERT(equeue != NULL); |
be_bryan | 0:b74591d5ab33 | 24 | } |
be_bryan | 0:b74591d5ab33 | 25 | |
be_bryan | 0:b74591d5ab33 | 26 | // Actually cancels a timer, not the opposite of enable |
be_bryan | 0:b74591d5ab33 | 27 | void platform_timer_disable(void) |
be_bryan | 0:b74591d5ab33 | 28 | { |
be_bryan | 0:b74591d5ab33 | 29 | timeout.detach(); |
be_bryan | 0:b74591d5ab33 | 30 | } |
be_bryan | 0:b74591d5ab33 | 31 | |
be_bryan | 0:b74591d5ab33 | 32 | // Not called while running, fortunately |
be_bryan | 0:b74591d5ab33 | 33 | void platform_timer_set_cb(void (*new_fp)(void)) |
be_bryan | 0:b74591d5ab33 | 34 | { |
be_bryan | 0:b74591d5ab33 | 35 | arm_hal_callback = new_fp; |
be_bryan | 0:b74591d5ab33 | 36 | } |
be_bryan | 0:b74591d5ab33 | 37 | |
be_bryan | 0:b74591d5ab33 | 38 | static void timer_callback(void) |
be_bryan | 0:b74591d5ab33 | 39 | { |
be_bryan | 0:b74591d5ab33 | 40 | due = 0; |
be_bryan | 0:b74591d5ab33 | 41 | equeue->call(arm_hal_callback); |
be_bryan | 0:b74591d5ab33 | 42 | } |
be_bryan | 0:b74591d5ab33 | 43 | |
be_bryan | 0:b74591d5ab33 | 44 | // This is called from inside platform_enter_critical - IRQs can't happen |
be_bryan | 0:b74591d5ab33 | 45 | void platform_timer_start(uint16_t slots) |
be_bryan | 0:b74591d5ab33 | 46 | { |
be_bryan | 0:b74591d5ab33 | 47 | timer.reset(); |
be_bryan | 0:b74591d5ab33 | 48 | due = slots * UINT32_C(50); |
be_bryan | 0:b74591d5ab33 | 49 | timeout.attach_us(timer_callback, due); |
be_bryan | 0:b74591d5ab33 | 50 | } |
be_bryan | 0:b74591d5ab33 | 51 | |
be_bryan | 0:b74591d5ab33 | 52 | // This is called from inside platform_enter_critical - IRQs can't happen |
be_bryan | 0:b74591d5ab33 | 53 | uint16_t platform_timer_get_remaining_slots(void) |
be_bryan | 0:b74591d5ab33 | 54 | { |
be_bryan | 0:b74591d5ab33 | 55 | uint32_t elapsed = timer.read_us(); |
be_bryan | 0:b74591d5ab33 | 56 | if (elapsed < due) { |
be_bryan | 0:b74591d5ab33 | 57 | return (uint16_t) ((due - elapsed) / 50); |
be_bryan | 0:b74591d5ab33 | 58 | } else { |
be_bryan | 0:b74591d5ab33 | 59 | return 0; |
be_bryan | 0:b74591d5ab33 | 60 | } |
be_bryan | 0:b74591d5ab33 | 61 | } |
be_bryan | 0:b74591d5ab33 | 62 |