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.
TARGET_ARM_CM3DS_MPS2/TOOLCHAIN_IAR/cmsdk_ticker.h@172:65be27845400, 2019-02-20 (annotated)
- 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?
User | Revision | Line number | New contents of line |
---|---|---|---|
AnnaBridge | 165:d1b4690b3f8b | 1 | /* |
AnnaBridge | 165:d1b4690b3f8b | 2 | * Copyright (c) 2018 ARM Limited |
AnnaBridge | 165:d1b4690b3f8b | 3 | * |
AnnaBridge | 165:d1b4690b3f8b | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
AnnaBridge | 165:d1b4690b3f8b | 5 | * you may not use this file except in compliance with the License. |
AnnaBridge | 165:d1b4690b3f8b | 6 | * You may obtain a copy of the License at |
AnnaBridge | 165:d1b4690b3f8b | 7 | * |
AnnaBridge | 165:d1b4690b3f8b | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
AnnaBridge | 165:d1b4690b3f8b | 9 | * |
AnnaBridge | 165:d1b4690b3f8b | 10 | * Unless required by applicable law or agreed to in writing, software |
AnnaBridge | 165:d1b4690b3f8b | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
AnnaBridge | 165:d1b4690b3f8b | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
AnnaBridge | 165:d1b4690b3f8b | 13 | * See the License for the specific language governing permissions and |
AnnaBridge | 165:d1b4690b3f8b | 14 | * limitations under the License. |
AnnaBridge | 165:d1b4690b3f8b | 15 | * |
AnnaBridge | 165:d1b4690b3f8b | 16 | */ |
AnnaBridge | 165:d1b4690b3f8b | 17 | |
AnnaBridge | 165:d1b4690b3f8b | 18 | /** |
AnnaBridge | 165:d1b4690b3f8b | 19 | * \file cmsdk_ticker.h |
AnnaBridge | 165:d1b4690b3f8b | 20 | * CMSDK Ticker implements the functionalities of mbed tickers: |
AnnaBridge | 165:d1b4690b3f8b | 21 | * 1. Elapsed time measurement |
AnnaBridge | 165:d1b4690b3f8b | 22 | * 2. Interval interrupt request |
AnnaBridge | 165:d1b4690b3f8b | 23 | * |
AnnaBridge | 165:d1b4690b3f8b | 24 | * This ticker service is based on CMSDK APB Timers, abstracting |
AnnaBridge | 165:d1b4690b3f8b | 25 | * the HAL logic, the timer driver and interrupt number. |
AnnaBridge | 165:d1b4690b3f8b | 26 | * These parameters should be passed to the functions by |
AnnaBridge | 165:d1b4690b3f8b | 27 | * an initialized \ref tick_drv_data_t pointer. |
AnnaBridge | 165:d1b4690b3f8b | 28 | */ |
AnnaBridge | 165:d1b4690b3f8b | 29 | |
AnnaBridge | 165:d1b4690b3f8b | 30 | #ifndef CMSDK_TICKER_H |
AnnaBridge | 165:d1b4690b3f8b | 31 | #define CMSDK_TICKER_H |
AnnaBridge | 165:d1b4690b3f8b | 32 | |
AnnaBridge | 165:d1b4690b3f8b | 33 | #include <stdbool.h> |
AnnaBridge | 165:d1b4690b3f8b | 34 | |
Anna Bridge |
169:a7c7b631e539 | 35 | #include "CM3DS.h" |
AnnaBridge | 165:d1b4690b3f8b | 36 | #include "timer_cmsdk_drv.h" |
AnnaBridge | 165:d1b4690b3f8b | 37 | |
AnnaBridge | 165:d1b4690b3f8b | 38 | #define SEC_TO_USEC_MULTIPLIER 1000000U |
AnnaBridge | 165:d1b4690b3f8b | 39 | |
AnnaBridge | 165:d1b4690b3f8b | 40 | /** |
AnnaBridge | 165:d1b4690b3f8b | 41 | * brief Encapsulating struct for config data \ref tick_cfg_t and |
AnnaBridge | 165:d1b4690b3f8b | 42 | * the current status \ref tick_data_t. |
AnnaBridge | 165:d1b4690b3f8b | 43 | */ |
AnnaBridge | 165:d1b4690b3f8b | 44 | struct tick_drv_data_t { |
AnnaBridge | 165:d1b4690b3f8b | 45 | const struct tick_cfg_t* const cfg; |
AnnaBridge | 165:d1b4690b3f8b | 46 | struct tick_data_t* const data; |
AnnaBridge | 165:d1b4690b3f8b | 47 | }; |
AnnaBridge | 165:d1b4690b3f8b | 48 | |
AnnaBridge | 165:d1b4690b3f8b | 49 | /** |
AnnaBridge | 165:d1b4690b3f8b | 50 | * brief Configuration data of the CMSDK ticker |
AnnaBridge | 165:d1b4690b3f8b | 51 | */ |
AnnaBridge | 165:d1b4690b3f8b | 52 | struct tick_cfg_t { |
AnnaBridge | 165:d1b4690b3f8b | 53 | /** Pointer to the used CMSDK Timer's device structure */ |
AnnaBridge | 165:d1b4690b3f8b | 54 | struct timer_cmsdk_dev_t* const timer_driver; |
AnnaBridge | 165:d1b4690b3f8b | 55 | /** IRQ number of the used CMSDK Timer */ |
AnnaBridge | 165:d1b4690b3f8b | 56 | const IRQn_Type irq_n; |
AnnaBridge | 165:d1b4690b3f8b | 57 | /** Interval callback of mbed*/ |
AnnaBridge | 165:d1b4690b3f8b | 58 | void (*const interval_callback)(); |
AnnaBridge | 165:d1b4690b3f8b | 59 | /** Function pointers to call for conversions of clock ticks and defined |
AnnaBridge | 165:d1b4690b3f8b | 60 | * time unit. |
AnnaBridge | 165:d1b4690b3f8b | 61 | * These conversions define the unit of the measured time. |
AnnaBridge | 165:d1b4690b3f8b | 62 | */ |
AnnaBridge | 165:d1b4690b3f8b | 63 | uint32_t (*const convert_tick_to_time)(uint32_t tick); |
AnnaBridge | 165:d1b4690b3f8b | 64 | uint32_t (*const convert_time_to_tick)(uint32_t time); |
AnnaBridge | 165:d1b4690b3f8b | 65 | }; |
AnnaBridge | 165:d1b4690b3f8b | 66 | |
AnnaBridge | 165:d1b4690b3f8b | 67 | /** |
AnnaBridge | 165:d1b4690b3f8b | 68 | * brief Current state data of the CMSDK ticker |
AnnaBridge | 165:d1b4690b3f8b | 69 | */ |
AnnaBridge | 165:d1b4690b3f8b | 70 | struct tick_data_t { |
AnnaBridge | 165:d1b4690b3f8b | 71 | /** True if initialized the ticker, false otherwise */ |
AnnaBridge | 165:d1b4690b3f8b | 72 | bool is_initialized; |
AnnaBridge | 165:d1b4690b3f8b | 73 | /** Measured elapsed time in the defined unit by |
AnnaBridge | 165:d1b4690b3f8b | 74 | * \ref convert_tick_to_time and \ref convert_time_to_tick */ |
AnnaBridge | 165:d1b4690b3f8b | 75 | uint32_t cumulated_time; |
AnnaBridge | 165:d1b4690b3f8b | 76 | /** Max interval time possible to set, in the defined unit by |
AnnaBridge | 165:d1b4690b3f8b | 77 | * \ref convert_tick_to_time and \ref convert_time_to_tick */ |
AnnaBridge | 165:d1b4690b3f8b | 78 | uint32_t max_interval_time; |
AnnaBridge | 165:d1b4690b3f8b | 79 | /** Current reload time in the defined unit by |
AnnaBridge | 165:d1b4690b3f8b | 80 | * \ref convert_tick_to_time and \ref convert_time_to_tick */ |
AnnaBridge | 165:d1b4690b3f8b | 81 | uint32_t reload_time; |
AnnaBridge | 165:d1b4690b3f8b | 82 | /** Interval IRQ callback is requested */ |
AnnaBridge | 165:d1b4690b3f8b | 83 | bool interval_callback_enabled; |
AnnaBridge | 165:d1b4690b3f8b | 84 | /** Previous cumulated time calculated for this ticker. Used in the |
AnnaBridge | 165:d1b4690b3f8b | 85 | * cmsdk_ticker_read function to detect that the timer has wrapped. */ |
AnnaBridge | 165:d1b4690b3f8b | 86 | uint32_t previous_cumulated_time; |
AnnaBridge | 165:d1b4690b3f8b | 87 | /** Previous elapsed value for this ticker. Used in the |
AnnaBridge | 165:d1b4690b3f8b | 88 | * cmsdk_ticker_read function to detect that the timer has wrapped. */ |
AnnaBridge | 165:d1b4690b3f8b | 89 | uint32_t previous_elapsed; |
AnnaBridge | 165:d1b4690b3f8b | 90 | }; |
AnnaBridge | 165:d1b4690b3f8b | 91 | |
AnnaBridge | 165:d1b4690b3f8b | 92 | /** |
AnnaBridge | 165:d1b4690b3f8b | 93 | * \brief Init the CMSDK Ticker |
AnnaBridge | 165:d1b4690b3f8b | 94 | * |
AnnaBridge | 165:d1b4690b3f8b | 95 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 96 | */ |
AnnaBridge | 165:d1b4690b3f8b | 97 | void cmsdk_ticker_init(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 98 | |
AnnaBridge | 165:d1b4690b3f8b | 99 | /** |
AnnaBridge | 165:d1b4690b3f8b | 100 | * \brief Read elapsed time by CMSDK Ticker |
AnnaBridge | 165:d1b4690b3f8b | 101 | * |
AnnaBridge | 165:d1b4690b3f8b | 102 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 103 | * |
AnnaBridge | 165:d1b4690b3f8b | 104 | * \return Elapsed time in the unit defined by \ref convert_tick_to_time |
AnnaBridge | 165:d1b4690b3f8b | 105 | */ |
AnnaBridge | 165:d1b4690b3f8b | 106 | |
AnnaBridge | 165:d1b4690b3f8b | 107 | uint32_t cmsdk_ticker_read(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 108 | |
AnnaBridge | 165:d1b4690b3f8b | 109 | /** |
AnnaBridge | 165:d1b4690b3f8b | 110 | * \brief Request interval interrupt by time stamp \ref timestamp_t |
AnnaBridge | 165:d1b4690b3f8b | 111 | * |
AnnaBridge | 165:d1b4690b3f8b | 112 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 113 | * \param[in] timestamp Absolute time \ref timestamp_t value when the interval |
AnnaBridge | 165:d1b4690b3f8b | 114 | * is requested. Unit of the timestamp is defined by |
AnnaBridge | 165:d1b4690b3f8b | 115 | * \ref convert_tick_to_time and \ref convert_time_to_tick |
AnnaBridge | 165:d1b4690b3f8b | 116 | */ |
AnnaBridge | 165:d1b4690b3f8b | 117 | void cmsdk_ticker_set_interrupt(const struct tick_drv_data_t* timer_data, |
AnnaBridge | 165:d1b4690b3f8b | 118 | uint32_t timestamp); |
AnnaBridge | 165:d1b4690b3f8b | 119 | |
AnnaBridge | 165:d1b4690b3f8b | 120 | /** |
AnnaBridge | 165:d1b4690b3f8b | 121 | * \brief Disable interval interrupt |
AnnaBridge | 165:d1b4690b3f8b | 122 | * |
AnnaBridge | 165:d1b4690b3f8b | 123 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 124 | */ |
AnnaBridge | 165:d1b4690b3f8b | 125 | void cmsdk_ticker_disable_interrupt(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 126 | |
AnnaBridge | 165:d1b4690b3f8b | 127 | /** |
AnnaBridge | 165:d1b4690b3f8b | 128 | * \brief Clear interval interrupt |
AnnaBridge | 165:d1b4690b3f8b | 129 | * |
AnnaBridge | 165:d1b4690b3f8b | 130 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 131 | */ |
AnnaBridge | 165:d1b4690b3f8b | 132 | void cmsdk_ticker_clear_interrupt(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 133 | |
AnnaBridge | 165:d1b4690b3f8b | 134 | /** |
AnnaBridge | 165:d1b4690b3f8b | 135 | * \brief Set pending interrupt that should be fired right away. |
AnnaBridge | 165:d1b4690b3f8b | 136 | * |
AnnaBridge | 165:d1b4690b3f8b | 137 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 138 | */ |
AnnaBridge | 165:d1b4690b3f8b | 139 | void cmsdk_ticker_fire_interrupt(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 140 | |
AnnaBridge | 165:d1b4690b3f8b | 141 | /** |
AnnaBridge | 165:d1b4690b3f8b | 142 | * \brief Interrupt handler of the given CMSDK Timer |
AnnaBridge | 165:d1b4690b3f8b | 143 | * |
AnnaBridge | 165:d1b4690b3f8b | 144 | * \warning This function may be called from multiple interrupt handlers, |
AnnaBridge | 165:d1b4690b3f8b | 145 | * so extra care must be taken for re-entrancy! |
AnnaBridge | 165:d1b4690b3f8b | 146 | * |
AnnaBridge | 165:d1b4690b3f8b | 147 | * \param[in] timer_data Pointer to the used CMSDK Timer's device structure |
AnnaBridge | 165:d1b4690b3f8b | 148 | */ |
AnnaBridge | 165:d1b4690b3f8b | 149 | void cmsdk_ticker_irq_handler(const struct tick_drv_data_t* timer_data); |
AnnaBridge | 165:d1b4690b3f8b | 150 | #endif |