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:
Wed Feb 20 20:53:29 2019 +0000
Revision:
172:65be27845400
Parent:
171:3a7713b1edbc
mbed library release version 165

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