test test test

Dependencies:   mbed

Committer:
mohamedmoawya
Date:
Mon May 25 19:06:11 2020 +0000
Revision:
0:e4c5e6ec922e
snake game tteest

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mohamedmoawya 0:e4c5e6ec922e 1
mohamedmoawya 0:e4c5e6ec922e 2 /** \addtogroup hal */
mohamedmoawya 0:e4c5e6ec922e 3 /** @{*/
mohamedmoawya 0:e4c5e6ec922e 4 /* mbed Microcontroller Library
mohamedmoawya 0:e4c5e6ec922e 5 * Copyright (c) 2015 ARM Limited
mohamedmoawya 0:e4c5e6ec922e 6 *
mohamedmoawya 0:e4c5e6ec922e 7 * Licensed under the Apache License, Version 2.0 (the "License");
mohamedmoawya 0:e4c5e6ec922e 8 * you may not use this file except in compliance with the License.
mohamedmoawya 0:e4c5e6ec922e 9 * You may obtain a copy of the License at
mohamedmoawya 0:e4c5e6ec922e 10 *
mohamedmoawya 0:e4c5e6ec922e 11 * http://www.apache.org/licenses/LICENSE-2.0
mohamedmoawya 0:e4c5e6ec922e 12 *
mohamedmoawya 0:e4c5e6ec922e 13 * Unless required by applicable law or agreed to in writing, software
mohamedmoawya 0:e4c5e6ec922e 14 * distributed under the License is distributed on an "AS IS" BASIS,
mohamedmoawya 0:e4c5e6ec922e 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mohamedmoawya 0:e4c5e6ec922e 16 * See the License for the specific language governing permissions and
mohamedmoawya 0:e4c5e6ec922e 17 * limitations under the License.
mohamedmoawya 0:e4c5e6ec922e 18 */
mohamedmoawya 0:e4c5e6ec922e 19 #ifndef MBED_LPTICKER_API_H
mohamedmoawya 0:e4c5e6ec922e 20 #define MBED_LPTICKER_API_H
mohamedmoawya 0:e4c5e6ec922e 21
mohamedmoawya 0:e4c5e6ec922e 22 #include "device.h"
mohamedmoawya 0:e4c5e6ec922e 23
mohamedmoawya 0:e4c5e6ec922e 24 #if DEVICE_LPTICKER
mohamedmoawya 0:e4c5e6ec922e 25
mohamedmoawya 0:e4c5e6ec922e 26 #include "hal/ticker_api.h"
mohamedmoawya 0:e4c5e6ec922e 27
mohamedmoawya 0:e4c5e6ec922e 28 #ifdef __cplusplus
mohamedmoawya 0:e4c5e6ec922e 29 extern "C" {
mohamedmoawya 0:e4c5e6ec922e 30 #endif
mohamedmoawya 0:e4c5e6ec922e 31
mohamedmoawya 0:e4c5e6ec922e 32 /**
mohamedmoawya 0:e4c5e6ec922e 33 * \defgroup hal_lp_ticker Low Power Ticker
mohamedmoawya 0:e4c5e6ec922e 34 * Low level interface to the low power ticker of a target
mohamedmoawya 0:e4c5e6ec922e 35 *
mohamedmoawya 0:e4c5e6ec922e 36 * # Defined behavior
mohamedmoawya 0:e4c5e6ec922e 37 * * Has a reported frequency between 4KHz and 64KHz - verified by ::lp_ticker_info_test
mohamedmoawya 0:e4c5e6ec922e 38 * * Has a counter that is at least 12 bits wide - verified by ::lp_ticker_info_test
mohamedmoawya 0:e4c5e6ec922e 39 * * Continues operating in deep sleep mode - verified by ::lp_ticker_deepsleep_test
mohamedmoawya 0:e4c5e6ec922e 40 * * All behavior defined by the @ref hal_ticker_shared "ticker specification"
mohamedmoawya 0:e4c5e6ec922e 41 *
mohamedmoawya 0:e4c5e6ec922e 42 * # Undefined behavior
mohamedmoawya 0:e4c5e6ec922e 43 * * See the @ref hal_ticker_shared "ticker specification"
mohamedmoawya 0:e4c5e6ec922e 44 * * Calling any function other than lp_ticker_init after calling lp_ticker_free
mohamedmoawya 0:e4c5e6ec922e 45 *
mohamedmoawya 0:e4c5e6ec922e 46 * # Potential bugs
mohamedmoawya 0:e4c5e6ec922e 47 * * Glitches due to ripple counter - Verified by ::lp_ticker_glitch_test
mohamedmoawya 0:e4c5e6ec922e 48 *
mohamedmoawya 0:e4c5e6ec922e 49 * @see hal_lp_ticker_tests
mohamedmoawya 0:e4c5e6ec922e 50 *
mohamedmoawya 0:e4c5e6ec922e 51 * @{
mohamedmoawya 0:e4c5e6ec922e 52 */
mohamedmoawya 0:e4c5e6ec922e 53
mohamedmoawya 0:e4c5e6ec922e 54 /**
mohamedmoawya 0:e4c5e6ec922e 55 * \defgroup hal_lp_ticker_tests Low Power Ticker tests
mohamedmoawya 0:e4c5e6ec922e 56 * Tests to validate the proper implementation of the low power ticker
mohamedmoawya 0:e4c5e6ec922e 57 *
mohamedmoawya 0:e4c5e6ec922e 58 * To run the low power ticker hal tests use the command:
mohamedmoawya 0:e4c5e6ec922e 59 *
mohamedmoawya 0:e4c5e6ec922e 60 * mbed test -t <toolchain> -m <target> -n tests-mbed_hal-common_ticker*,tests-mbed_hal-lp_ticker*
mohamedmoawya 0:e4c5e6ec922e 61 *
mohamedmoawya 0:e4c5e6ec922e 62 */
mohamedmoawya 0:e4c5e6ec922e 63
mohamedmoawya 0:e4c5e6ec922e 64 typedef void (*ticker_irq_handler_type)(const ticker_data_t *const);
mohamedmoawya 0:e4c5e6ec922e 65
mohamedmoawya 0:e4c5e6ec922e 66 /** Set low power ticker IRQ handler
mohamedmoawya 0:e4c5e6ec922e 67 *
mohamedmoawya 0:e4c5e6ec922e 68 * @param ticker_irq_handler IRQ handler to be connected
mohamedmoawya 0:e4c5e6ec922e 69 *
mohamedmoawya 0:e4c5e6ec922e 70 * @return previous ticker IRQ handler
mohamedmoawya 0:e4c5e6ec922e 71 *
mohamedmoawya 0:e4c5e6ec922e 72 * @note by default IRQ handler is set to ::ticker_irq_handler
mohamedmoawya 0:e4c5e6ec922e 73 * @note this function is primarily for testing purposes and it's not required part of HAL implementation
mohamedmoawya 0:e4c5e6ec922e 74 *
mohamedmoawya 0:e4c5e6ec922e 75 */
mohamedmoawya 0:e4c5e6ec922e 76 ticker_irq_handler_type set_lp_ticker_irq_handler(ticker_irq_handler_type ticker_irq_handler);
mohamedmoawya 0:e4c5e6ec922e 77
mohamedmoawya 0:e4c5e6ec922e 78 /** Get low power ticker's data
mohamedmoawya 0:e4c5e6ec922e 79 *
mohamedmoawya 0:e4c5e6ec922e 80 * @return The low power ticker data
mohamedmoawya 0:e4c5e6ec922e 81 */
mohamedmoawya 0:e4c5e6ec922e 82 const ticker_data_t *get_lp_ticker_data(void);
mohamedmoawya 0:e4c5e6ec922e 83
mohamedmoawya 0:e4c5e6ec922e 84 /** The wrapper for ticker_irq_handler, to pass lp ticker's data
mohamedmoawya 0:e4c5e6ec922e 85 *
mohamedmoawya 0:e4c5e6ec922e 86 */
mohamedmoawya 0:e4c5e6ec922e 87 void lp_ticker_irq_handler(void);
mohamedmoawya 0:e4c5e6ec922e 88
mohamedmoawya 0:e4c5e6ec922e 89 /* HAL lp ticker */
mohamedmoawya 0:e4c5e6ec922e 90
mohamedmoawya 0:e4c5e6ec922e 91 /** Initialize the low power ticker
mohamedmoawya 0:e4c5e6ec922e 92 *
mohamedmoawya 0:e4c5e6ec922e 93 * Initialize or re-initialize the ticker. This resets all the
mohamedmoawya 0:e4c5e6ec922e 94 * clocking and prescaler registers, along with disabling
mohamedmoawya 0:e4c5e6ec922e 95 * the compare interrupt.
mohamedmoawya 0:e4c5e6ec922e 96 *
mohamedmoawya 0:e4c5e6ec922e 97 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 98 * @code
mohamedmoawya 0:e4c5e6ec922e 99 * void lp_ticker_init()
mohamedmoawya 0:e4c5e6ec922e 100 * {
mohamedmoawya 0:e4c5e6ec922e 101 * // Enable clock gate so processor can read LPTMR registers
mohamedmoawya 0:e4c5e6ec922e 102 * POWER_CTRL |= POWER_CTRL_LPTMR_Msk;
mohamedmoawya 0:e4c5e6ec922e 103 *
mohamedmoawya 0:e4c5e6ec922e 104 * // Disable the timer and ensure it is powered down
mohamedmoawya 0:e4c5e6ec922e 105 * LPTMR_CTRL &= ~(LPTMR_CTRL_ENABLE_Msk | LPTMR_CTRL_COMPARE_ENABLE_Msk);
mohamedmoawya 0:e4c5e6ec922e 106 *
mohamedmoawya 0:e4c5e6ec922e 107 * // Configure divisors - no division necessary
mohamedmoawya 0:e4c5e6ec922e 108 * LPTMR_PRESCALE = 0;
mohamedmoawya 0:e4c5e6ec922e 109 * LPTMR_CTRL |= LPTMR_CTRL_ENABLE_Msk;
mohamedmoawya 0:e4c5e6ec922e 110 *
mohamedmoawya 0:e4c5e6ec922e 111 * // Install the interrupt handler
mohamedmoawya 0:e4c5e6ec922e 112 * NVIC_SetVector(LPTMR_IRQn, (uint32_t)lp_ticker_irq_handler);
mohamedmoawya 0:e4c5e6ec922e 113 * NVIC_EnableIRQ(LPTMR_IRQn);
mohamedmoawya 0:e4c5e6ec922e 114 * }
mohamedmoawya 0:e4c5e6ec922e 115 * @endcode
mohamedmoawya 0:e4c5e6ec922e 116 */
mohamedmoawya 0:e4c5e6ec922e 117 void lp_ticker_init(void);
mohamedmoawya 0:e4c5e6ec922e 118
mohamedmoawya 0:e4c5e6ec922e 119 /** Deinitialize the lower power ticker
mohamedmoawya 0:e4c5e6ec922e 120 *
mohamedmoawya 0:e4c5e6ec922e 121 * Powerdown the lp ticker in preparation for sleep, powerdown, or reset.
mohamedmoawya 0:e4c5e6ec922e 122 *
mohamedmoawya 0:e4c5e6ec922e 123 * After calling this function no other ticker functions should be called except
mohamedmoawya 0:e4c5e6ec922e 124 * lp_ticker_init(). Calling any function other than init after freeing is
mohamedmoawya 0:e4c5e6ec922e 125 * undefined.
mohamedmoawya 0:e4c5e6ec922e 126 *
mohamedmoawya 0:e4c5e6ec922e 127 * @note This function stops the ticker from counting.
mohamedmoawya 0:e4c5e6ec922e 128 */
mohamedmoawya 0:e4c5e6ec922e 129 void lp_ticker_free(void);
mohamedmoawya 0:e4c5e6ec922e 130
mohamedmoawya 0:e4c5e6ec922e 131 /** Read the current tick
mohamedmoawya 0:e4c5e6ec922e 132 *
mohamedmoawya 0:e4c5e6ec922e 133 * If no rollover has occurred, the seconds passed since lp_ticker_init()
mohamedmoawya 0:e4c5e6ec922e 134 * was called can be found by dividing the ticks returned by this function
mohamedmoawya 0:e4c5e6ec922e 135 * by the frequency returned by ::lp_ticker_get_info.
mohamedmoawya 0:e4c5e6ec922e 136 *
mohamedmoawya 0:e4c5e6ec922e 137 * @return The current timer's counter value in ticks
mohamedmoawya 0:e4c5e6ec922e 138 *
mohamedmoawya 0:e4c5e6ec922e 139 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 140 * @code
mohamedmoawya 0:e4c5e6ec922e 141 * uint32_t lp_ticker_read()
mohamedmoawya 0:e4c5e6ec922e 142 * {
mohamedmoawya 0:e4c5e6ec922e 143 * uint16_t count;
mohamedmoawya 0:e4c5e6ec922e 144 * uint16_t last_count;
mohamedmoawya 0:e4c5e6ec922e 145 *
mohamedmoawya 0:e4c5e6ec922e 146 * // Loop until the same tick is read twice since this
mohamedmoawya 0:e4c5e6ec922e 147 * // is ripple counter on a different clock domain.
mohamedmoawya 0:e4c5e6ec922e 148 * count = LPTMR_COUNT;
mohamedmoawya 0:e4c5e6ec922e 149 * do {
mohamedmoawya 0:e4c5e6ec922e 150 * last_count = count;
mohamedmoawya 0:e4c5e6ec922e 151 * count = LPTMR_COUNT;
mohamedmoawya 0:e4c5e6ec922e 152 * } while (last_count != count);
mohamedmoawya 0:e4c5e6ec922e 153 *
mohamedmoawya 0:e4c5e6ec922e 154 * return count;
mohamedmoawya 0:e4c5e6ec922e 155 * }
mohamedmoawya 0:e4c5e6ec922e 156 * @endcode
mohamedmoawya 0:e4c5e6ec922e 157 */
mohamedmoawya 0:e4c5e6ec922e 158 uint32_t lp_ticker_read(void);
mohamedmoawya 0:e4c5e6ec922e 159
mohamedmoawya 0:e4c5e6ec922e 160 /** Set interrupt for specified timestamp
mohamedmoawya 0:e4c5e6ec922e 161 *
mohamedmoawya 0:e4c5e6ec922e 162 * @param timestamp The time in ticks to be set
mohamedmoawya 0:e4c5e6ec922e 163 *
mohamedmoawya 0:e4c5e6ec922e 164 * @note no special handling needs to be done for times in the past
mohamedmoawya 0:e4c5e6ec922e 165 * as the common timer code will detect this and call
mohamedmoawya 0:e4c5e6ec922e 166 * lp_ticker_fire_interrupt() if this is the case
mohamedmoawya 0:e4c5e6ec922e 167 *
mohamedmoawya 0:e4c5e6ec922e 168 * @note calling this function with timestamp of more than the supported
mohamedmoawya 0:e4c5e6ec922e 169 * number of bits returned by ::lp_ticker_get_info results in undefined
mohamedmoawya 0:e4c5e6ec922e 170 * behavior.
mohamedmoawya 0:e4c5e6ec922e 171 *
mohamedmoawya 0:e4c5e6ec922e 172 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 173 * @code
mohamedmoawya 0:e4c5e6ec922e 174 * void lp_ticker_set_interrupt(timestamp_t timestamp)
mohamedmoawya 0:e4c5e6ec922e 175 * {
mohamedmoawya 0:e4c5e6ec922e 176 * LPTMR_COMPARE = timestamp;
mohamedmoawya 0:e4c5e6ec922e 177 * LPTMR_CTRL |= LPTMR_CTRL_COMPARE_ENABLE_Msk;
mohamedmoawya 0:e4c5e6ec922e 178 * }
mohamedmoawya 0:e4c5e6ec922e 179 * @endcode
mohamedmoawya 0:e4c5e6ec922e 180 */
mohamedmoawya 0:e4c5e6ec922e 181 void lp_ticker_set_interrupt(timestamp_t timestamp);
mohamedmoawya 0:e4c5e6ec922e 182
mohamedmoawya 0:e4c5e6ec922e 183 /** Disable low power ticker interrupt
mohamedmoawya 0:e4c5e6ec922e 184 *
mohamedmoawya 0:e4c5e6ec922e 185 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 186 * @code
mohamedmoawya 0:e4c5e6ec922e 187 * void lp_ticker_disable_interrupt(void)
mohamedmoawya 0:e4c5e6ec922e 188 * {
mohamedmoawya 0:e4c5e6ec922e 189 * // Disable the compare interrupt
mohamedmoawya 0:e4c5e6ec922e 190 * LPTMR_CTRL &= ~LPTMR_CTRL_COMPARE_ENABLE_Msk;
mohamedmoawya 0:e4c5e6ec922e 191 * }
mohamedmoawya 0:e4c5e6ec922e 192 * @endcode
mohamedmoawya 0:e4c5e6ec922e 193 */
mohamedmoawya 0:e4c5e6ec922e 194 void lp_ticker_disable_interrupt(void);
mohamedmoawya 0:e4c5e6ec922e 195
mohamedmoawya 0:e4c5e6ec922e 196 /** Clear the low power ticker interrupt
mohamedmoawya 0:e4c5e6ec922e 197 *
mohamedmoawya 0:e4c5e6ec922e 198 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 199 * @code
mohamedmoawya 0:e4c5e6ec922e 200 * void lp_ticker_clear_interrupt(void)
mohamedmoawya 0:e4c5e6ec922e 201 * {
mohamedmoawya 0:e4c5e6ec922e 202 * // Write to the ICR (interrupt clear register) of the LPTMR
mohamedmoawya 0:e4c5e6ec922e 203 * LPTMR_ICR = LPTMR_ICR_COMPARE_Msk;
mohamedmoawya 0:e4c5e6ec922e 204 * }
mohamedmoawya 0:e4c5e6ec922e 205 * @endcode
mohamedmoawya 0:e4c5e6ec922e 206 */
mohamedmoawya 0:e4c5e6ec922e 207 void lp_ticker_clear_interrupt(void);
mohamedmoawya 0:e4c5e6ec922e 208
mohamedmoawya 0:e4c5e6ec922e 209 /** Set pending interrupt that should be fired right away.
mohamedmoawya 0:e4c5e6ec922e 210 *
mohamedmoawya 0:e4c5e6ec922e 211 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 212 * @code
mohamedmoawya 0:e4c5e6ec922e 213 * void lp_ticker_fire_interrupt(void)
mohamedmoawya 0:e4c5e6ec922e 214 * {
mohamedmoawya 0:e4c5e6ec922e 215 * NVIC_SetPendingIRQ(LPTMR_IRQn);
mohamedmoawya 0:e4c5e6ec922e 216 * }
mohamedmoawya 0:e4c5e6ec922e 217 * @endcode
mohamedmoawya 0:e4c5e6ec922e 218 */
mohamedmoawya 0:e4c5e6ec922e 219 void lp_ticker_fire_interrupt(void);
mohamedmoawya 0:e4c5e6ec922e 220
mohamedmoawya 0:e4c5e6ec922e 221 /** Get frequency and counter bits of this ticker.
mohamedmoawya 0:e4c5e6ec922e 222 *
mohamedmoawya 0:e4c5e6ec922e 223 * Pseudo Code:
mohamedmoawya 0:e4c5e6ec922e 224 * @code
mohamedmoawya 0:e4c5e6ec922e 225 * const ticker_info_t* lp_ticker_get_info()
mohamedmoawya 0:e4c5e6ec922e 226 * {
mohamedmoawya 0:e4c5e6ec922e 227 * static const ticker_info_t info = {
mohamedmoawya 0:e4c5e6ec922e 228 * 32768, // 32KHz
mohamedmoawya 0:e4c5e6ec922e 229 * 16 // 16 bit counter
mohamedmoawya 0:e4c5e6ec922e 230 * };
mohamedmoawya 0:e4c5e6ec922e 231 * return &info;
mohamedmoawya 0:e4c5e6ec922e 232 * }
mohamedmoawya 0:e4c5e6ec922e 233 * @endcode
mohamedmoawya 0:e4c5e6ec922e 234 */
mohamedmoawya 0:e4c5e6ec922e 235 const ticker_info_t *lp_ticker_get_info(void);
mohamedmoawya 0:e4c5e6ec922e 236
mohamedmoawya 0:e4c5e6ec922e 237 /**@}*/
mohamedmoawya 0:e4c5e6ec922e 238
mohamedmoawya 0:e4c5e6ec922e 239 #ifdef __cplusplus
mohamedmoawya 0:e4c5e6ec922e 240 }
mohamedmoawya 0:e4c5e6ec922e 241 #endif
mohamedmoawya 0:e4c5e6ec922e 242
mohamedmoawya 0:e4c5e6ec922e 243 #endif
mohamedmoawya 0:e4c5e6ec922e 244
mohamedmoawya 0:e4c5e6ec922e 245 #endif
mohamedmoawya 0:e4c5e6ec922e 246
mohamedmoawya 0:e4c5e6ec922e 247 /** @}*/