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 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