The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Dependents:   hello SerialTestv11 SerialTestv12 Sierpinski ... more

mbed 2

This is the mbed 2 library. If you'd like to learn about Mbed OS please see the mbed-os docs.

Committer:
AnnaBridge
Date:
Thu Nov 08 11:45:42 2018 +0000
Revision:
171:3a7713b1edbc
Child:
172:65be27845400
mbed library. Release version 164

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 171:3a7713b1edbc 1
AnnaBridge 171:3a7713b1edbc 2 /** \addtogroup hal */
AnnaBridge 171:3a7713b1edbc 3 /** @{*/
AnnaBridge 171:3a7713b1edbc 4 /* mbed Microcontroller Library
AnnaBridge 171:3a7713b1edbc 5 * Copyright (c) 2018 ARM Limited
AnnaBridge 171:3a7713b1edbc 6 *
AnnaBridge 171:3a7713b1edbc 7 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 171:3a7713b1edbc 8 * you may not use this file except in compliance with the License.
AnnaBridge 171:3a7713b1edbc 9 * You may obtain a copy of the License at
AnnaBridge 171:3a7713b1edbc 10 *
AnnaBridge 171:3a7713b1edbc 11 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 171:3a7713b1edbc 12 *
AnnaBridge 171:3a7713b1edbc 13 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 171:3a7713b1edbc 14 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 171:3a7713b1edbc 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 171:3a7713b1edbc 16 * See the License for the specific language governing permissions and
AnnaBridge 171:3a7713b1edbc 17 * limitations under the License.
AnnaBridge 171:3a7713b1edbc 18 */
AnnaBridge 171:3a7713b1edbc 19 #ifndef MBED_LOW_POWER_TICKER_WRAPPER_H
AnnaBridge 171:3a7713b1edbc 20 #define MBED_LOW_POWER_TICKER_WRAPPER_H
AnnaBridge 171:3a7713b1edbc 21
AnnaBridge 171:3a7713b1edbc 22 #include "device.h"
AnnaBridge 171:3a7713b1edbc 23
AnnaBridge 171:3a7713b1edbc 24 #include "hal/ticker_api.h"
AnnaBridge 171:3a7713b1edbc 25 #include "hal/us_ticker_api.h"
AnnaBridge 171:3a7713b1edbc 26 #include "drivers/Timeout.h"
AnnaBridge 171:3a7713b1edbc 27
AnnaBridge 171:3a7713b1edbc 28
AnnaBridge 171:3a7713b1edbc 29 class LowPowerTickerWrapper {
AnnaBridge 171:3a7713b1edbc 30 public:
AnnaBridge 171:3a7713b1edbc 31
AnnaBridge 171:3a7713b1edbc 32
AnnaBridge 171:3a7713b1edbc 33 /**
AnnaBridge 171:3a7713b1edbc 34 * Create a new wrapped low power ticker object
AnnaBridge 171:3a7713b1edbc 35 *
AnnaBridge 171:3a7713b1edbc 36 * @param data Low power ticker data to wrap
AnnaBridge 171:3a7713b1edbc 37 * @param interface new ticker interface functions
AnnaBridge 171:3a7713b1edbc 38 * @param min_cycles_between_writes The number of whole low power clock periods
AnnaBridge 171:3a7713b1edbc 39 * which must complete before subsequent calls to set_interrupt
AnnaBridge 171:3a7713b1edbc 40 * @param min_cycles_until_match The minimum number of whole low power clock periods
AnnaBridge 171:3a7713b1edbc 41 * from the current time for which the match timestamp passed to set_interrupt is
AnnaBridge 171:3a7713b1edbc 42 * guaranteed to fire.
AnnaBridge 171:3a7713b1edbc 43 *
AnnaBridge 171:3a7713b1edbc 44 * N = min_cycles_between_writes
AnnaBridge 171:3a7713b1edbc 45 *
AnnaBridge 171:3a7713b1edbc 46 * 0 1 N - 1 N N + 1 N + 2 N + 3
AnnaBridge 171:3a7713b1edbc 47 * |-------|------...------|-------|-------|-------|-------|
AnnaBridge 171:3a7713b1edbc 48 * ^ ^
AnnaBridge 171:3a7713b1edbc 49 * | |
AnnaBridge 171:3a7713b1edbc 50 * set_interrupt Next set_interrupt allowed
AnnaBridge 171:3a7713b1edbc 51 *
AnnaBridge 171:3a7713b1edbc 52 * N = min_cycles_until_match
AnnaBridge 171:3a7713b1edbc 53 *
AnnaBridge 171:3a7713b1edbc 54 * 0 1 N - 1 N N + 1 N + 2 N + 3
AnnaBridge 171:3a7713b1edbc 55 * |-------|------...------|-------|-------|-------|-------|
AnnaBridge 171:3a7713b1edbc 56 * ^ ^
AnnaBridge 171:3a7713b1edbc 57 * | |
AnnaBridge 171:3a7713b1edbc 58 * set_interrupt Earliest match timestamp allowed
AnnaBridge 171:3a7713b1edbc 59 *
AnnaBridge 171:3a7713b1edbc 60 *
AnnaBridge 171:3a7713b1edbc 61 */
AnnaBridge 171:3a7713b1edbc 62
AnnaBridge 171:3a7713b1edbc 63 LowPowerTickerWrapper(const ticker_data_t *data, const ticker_interface_t *interface, uint32_t min_cycles_between_writes, uint32_t min_cycles_until_match);
AnnaBridge 171:3a7713b1edbc 64
AnnaBridge 171:3a7713b1edbc 65 /**
AnnaBridge 171:3a7713b1edbc 66 * Interrupt handler called by the underlying driver/hardware
AnnaBridge 171:3a7713b1edbc 67 *
AnnaBridge 171:3a7713b1edbc 68 * @param handler The callback which would normally be called by the underlying driver/hardware
AnnaBridge 171:3a7713b1edbc 69 */
AnnaBridge 171:3a7713b1edbc 70 void irq_handler(ticker_irq_handler_type handler);
AnnaBridge 171:3a7713b1edbc 71
AnnaBridge 171:3a7713b1edbc 72 /**
AnnaBridge 171:3a7713b1edbc 73 * Suspend wrapper operation and pass through interrupts.
AnnaBridge 171:3a7713b1edbc 74 *
AnnaBridge 171:3a7713b1edbc 75 * This stops to wrapper layer from using the microsecond ticker.
AnnaBridge 171:3a7713b1edbc 76 * This should be called before using the low power ticker APIs directly.
AnnaBridge 171:3a7713b1edbc 77 *
AnnaBridge 171:3a7713b1edbc 78 * @warning: Make sure to suspend the LP ticker first (call ticker_suspend()),
AnnaBridge 171:3a7713b1edbc 79 * otherwise the behavior is undefined.
AnnaBridge 171:3a7713b1edbc 80 */
AnnaBridge 171:3a7713b1edbc 81 void suspend();
AnnaBridge 171:3a7713b1edbc 82
AnnaBridge 171:3a7713b1edbc 83 /**
AnnaBridge 171:3a7713b1edbc 84 * Resume wrapper operation and filter interrupts normally
AnnaBridge 171:3a7713b1edbc 85 */
AnnaBridge 171:3a7713b1edbc 86 void resume();
AnnaBridge 171:3a7713b1edbc 87
AnnaBridge 171:3a7713b1edbc 88 /**
AnnaBridge 171:3a7713b1edbc 89 * Check if a Timeout object is being used
AnnaBridge 171:3a7713b1edbc 90 *
AnnaBridge 171:3a7713b1edbc 91 * @return true if Timeout is used for scheduling false otherwise
AnnaBridge 171:3a7713b1edbc 92 */
AnnaBridge 171:3a7713b1edbc 93 bool timeout_pending();
AnnaBridge 171:3a7713b1edbc 94
AnnaBridge 171:3a7713b1edbc 95 /*
AnnaBridge 171:3a7713b1edbc 96 * Implementation of ticker_init
AnnaBridge 171:3a7713b1edbc 97 */
AnnaBridge 171:3a7713b1edbc 98 void init();
AnnaBridge 171:3a7713b1edbc 99
AnnaBridge 171:3a7713b1edbc 100 /*
AnnaBridge 171:3a7713b1edbc 101 * Implementation of free
AnnaBridge 171:3a7713b1edbc 102 */
AnnaBridge 171:3a7713b1edbc 103 void free();
AnnaBridge 171:3a7713b1edbc 104
AnnaBridge 171:3a7713b1edbc 105 /*
AnnaBridge 171:3a7713b1edbc 106 * Implementation of read
AnnaBridge 171:3a7713b1edbc 107 */
AnnaBridge 171:3a7713b1edbc 108 uint32_t read();
AnnaBridge 171:3a7713b1edbc 109
AnnaBridge 171:3a7713b1edbc 110 /*
AnnaBridge 171:3a7713b1edbc 111 * Implementation of set_interrupt
AnnaBridge 171:3a7713b1edbc 112 */
AnnaBridge 171:3a7713b1edbc 113 void set_interrupt(timestamp_t timestamp);
AnnaBridge 171:3a7713b1edbc 114
AnnaBridge 171:3a7713b1edbc 115 /*
AnnaBridge 171:3a7713b1edbc 116 * Implementation of disable_interrupt
AnnaBridge 171:3a7713b1edbc 117 */
AnnaBridge 171:3a7713b1edbc 118 void disable_interrupt();
AnnaBridge 171:3a7713b1edbc 119
AnnaBridge 171:3a7713b1edbc 120 /*
AnnaBridge 171:3a7713b1edbc 121 * Implementation of clear_interrupt
AnnaBridge 171:3a7713b1edbc 122 */
AnnaBridge 171:3a7713b1edbc 123 void clear_interrupt();
AnnaBridge 171:3a7713b1edbc 124
AnnaBridge 171:3a7713b1edbc 125 /*
AnnaBridge 171:3a7713b1edbc 126 * Implementation of fire_interrupt
AnnaBridge 171:3a7713b1edbc 127 */
AnnaBridge 171:3a7713b1edbc 128 void fire_interrupt();
AnnaBridge 171:3a7713b1edbc 129
AnnaBridge 171:3a7713b1edbc 130 /*
AnnaBridge 171:3a7713b1edbc 131 * Implementation of get_info
AnnaBridge 171:3a7713b1edbc 132 */
AnnaBridge 171:3a7713b1edbc 133 const ticker_info_t *get_info();
AnnaBridge 171:3a7713b1edbc 134
AnnaBridge 171:3a7713b1edbc 135 ticker_data_t data;
AnnaBridge 171:3a7713b1edbc 136
AnnaBridge 171:3a7713b1edbc 137 private:
AnnaBridge 171:3a7713b1edbc 138 mbed::Timeout _timeout;
AnnaBridge 171:3a7713b1edbc 139 const ticker_interface_t *const _intf;
AnnaBridge 171:3a7713b1edbc 140
AnnaBridge 171:3a7713b1edbc 141 /*
AnnaBridge 171:3a7713b1edbc 142 * The number of low power clock cycles which must pass between subsequent
AnnaBridge 171:3a7713b1edbc 143 * calls to intf->set_interrupt
AnnaBridge 171:3a7713b1edbc 144 */
AnnaBridge 171:3a7713b1edbc 145 const uint32_t _min_count_between_writes;
AnnaBridge 171:3a7713b1edbc 146
AnnaBridge 171:3a7713b1edbc 147 /*
AnnaBridge 171:3a7713b1edbc 148 * The minimum number of low power clock cycles in the future that
AnnaBridge 171:3a7713b1edbc 149 * a match value can be set to and still fire
AnnaBridge 171:3a7713b1edbc 150 */
AnnaBridge 171:3a7713b1edbc 151 const uint32_t _min_count_until_match;
AnnaBridge 171:3a7713b1edbc 152
AnnaBridge 171:3a7713b1edbc 153 /*
AnnaBridge 171:3a7713b1edbc 154 * Flag to indicate if the timer is suspended
AnnaBridge 171:3a7713b1edbc 155 */
AnnaBridge 171:3a7713b1edbc 156 bool _suspended;
AnnaBridge 171:3a7713b1edbc 157
AnnaBridge 171:3a7713b1edbc 158 /*
AnnaBridge 171:3a7713b1edbc 159 * _cur_match_time is valid and Timeout is scheduled to fire
AnnaBridge 171:3a7713b1edbc 160 */
AnnaBridge 171:3a7713b1edbc 161 bool _pending_timeout;
AnnaBridge 171:3a7713b1edbc 162
AnnaBridge 171:3a7713b1edbc 163 /*
AnnaBridge 171:3a7713b1edbc 164 * set_interrupt has been called and _cur_match_time is valid
AnnaBridge 171:3a7713b1edbc 165 */
AnnaBridge 171:3a7713b1edbc 166 bool _pending_match;
AnnaBridge 171:3a7713b1edbc 167
AnnaBridge 171:3a7713b1edbc 168 /*
AnnaBridge 171:3a7713b1edbc 169 * The function LowPowerTickerWrapper::fire_interrupt has been called
AnnaBridge 171:3a7713b1edbc 170 * and an interrupt is expected.
AnnaBridge 171:3a7713b1edbc 171 */
AnnaBridge 171:3a7713b1edbc 172 bool _pending_fire_now;
AnnaBridge 171:3a7713b1edbc 173
AnnaBridge 171:3a7713b1edbc 174 /*
AnnaBridge 171:3a7713b1edbc 175 * It is safe to call intf->set_interrupt
AnnaBridge 171:3a7713b1edbc 176 */
AnnaBridge 171:3a7713b1edbc 177 bool _set_interrupt_allowed;
AnnaBridge 171:3a7713b1edbc 178
AnnaBridge 171:3a7713b1edbc 179 /*
AnnaBridge 171:3a7713b1edbc 180 * Last value written by LowPowerTickerWrapper::set_interrupt
AnnaBridge 171:3a7713b1edbc 181 */
AnnaBridge 171:3a7713b1edbc 182 timestamp_t _cur_match_time;
AnnaBridge 171:3a7713b1edbc 183
AnnaBridge 171:3a7713b1edbc 184 /*
AnnaBridge 171:3a7713b1edbc 185 * Time of last call to LowPowerTickerWrapper::set_interrupt
AnnaBridge 171:3a7713b1edbc 186 */
AnnaBridge 171:3a7713b1edbc 187 uint32_t _last_set_interrupt;
AnnaBridge 171:3a7713b1edbc 188
AnnaBridge 171:3a7713b1edbc 189 /*
AnnaBridge 171:3a7713b1edbc 190 * Time of last call to intf->set_interrupt
AnnaBridge 171:3a7713b1edbc 191 */
AnnaBridge 171:3a7713b1edbc 192 uint32_t _last_actual_set_interrupt;
AnnaBridge 171:3a7713b1edbc 193
AnnaBridge 171:3a7713b1edbc 194 /*
AnnaBridge 171:3a7713b1edbc 195 * Mask of valid bits from intf->read()
AnnaBridge 171:3a7713b1edbc 196 */
AnnaBridge 171:3a7713b1edbc 197 uint32_t _mask;
AnnaBridge 171:3a7713b1edbc 198
AnnaBridge 171:3a7713b1edbc 199 /*
AnnaBridge 171:3a7713b1edbc 200 * Microsecond per low power tick (rounded up)
AnnaBridge 171:3a7713b1edbc 201 */
AnnaBridge 171:3a7713b1edbc 202 uint32_t _us_per_tick;
AnnaBridge 171:3a7713b1edbc 203
AnnaBridge 171:3a7713b1edbc 204
AnnaBridge 171:3a7713b1edbc 205 void _reset();
AnnaBridge 171:3a7713b1edbc 206
AnnaBridge 171:3a7713b1edbc 207 /**
AnnaBridge 171:3a7713b1edbc 208 * Set the low power ticker match time when hardware is ready
AnnaBridge 171:3a7713b1edbc 209 *
AnnaBridge 171:3a7713b1edbc 210 * This event is scheduled to set the lp timer after the previous write
AnnaBridge 171:3a7713b1edbc 211 * has taken effect and it is safe to write a new value without blocking.
AnnaBridge 171:3a7713b1edbc 212 * If the time has already passed then this function fires and interrupt
AnnaBridge 171:3a7713b1edbc 213 * immediately.
AnnaBridge 171:3a7713b1edbc 214 */
AnnaBridge 171:3a7713b1edbc 215 void _timeout_handler();
AnnaBridge 171:3a7713b1edbc 216
AnnaBridge 171:3a7713b1edbc 217 /*
AnnaBridge 171:3a7713b1edbc 218 * Check match time has passed
AnnaBridge 171:3a7713b1edbc 219 */
AnnaBridge 171:3a7713b1edbc 220 bool _match_check(timestamp_t current);
AnnaBridge 171:3a7713b1edbc 221
AnnaBridge 171:3a7713b1edbc 222 /*
AnnaBridge 171:3a7713b1edbc 223 * Convert low power ticks to approximate microseconds
AnnaBridge 171:3a7713b1edbc 224 *
AnnaBridge 171:3a7713b1edbc 225 * This value is always larger or equal to exact value.
AnnaBridge 171:3a7713b1edbc 226 */
AnnaBridge 171:3a7713b1edbc 227 uint32_t _lp_ticks_to_us(uint32_t);
AnnaBridge 171:3a7713b1edbc 228
AnnaBridge 171:3a7713b1edbc 229 /*
AnnaBridge 171:3a7713b1edbc 230 * Schedule a match interrupt to fire at the correct time
AnnaBridge 171:3a7713b1edbc 231 *
AnnaBridge 171:3a7713b1edbc 232 * @param current The current low power ticker time
AnnaBridge 171:3a7713b1edbc 233 */
AnnaBridge 171:3a7713b1edbc 234 void _schedule_match(timestamp_t current);
AnnaBridge 171:3a7713b1edbc 235
AnnaBridge 171:3a7713b1edbc 236 };
AnnaBridge 171:3a7713b1edbc 237
AnnaBridge 171:3a7713b1edbc 238 #endif
AnnaBridge 171:3a7713b1edbc 239
AnnaBridge 171:3a7713b1edbc 240 /** @}*/
AnnaBridge 171:3a7713b1edbc 241
AnnaBridge 171:3a7713b1edbc 242