mbed library sources. Supersedes mbed-src.

Dependents:   Nucleo_Hello_Encoder BLE_iBeaconScan AM1805_DEMO DISCO-F429ZI_ExportTemplate1 ... more

Committer:
AnnaBridge
Date:
Mon Oct 02 15:33:19 2017 +0100
Revision:
174:b96e65c34a4d
Parent:
150:02e0a0aed4ec
Child:
186:707f6e361f3e
This updates the lib to the mbed lib v 152

Who changed what in which revision?

UserRevisionLine numberNew contents of line
<> 144:ef7eb2e8f9f7 1 /*
<> 144:ef7eb2e8f9f7 2 * PackageLicenseDeclared: Apache-2.0
<> 144:ef7eb2e8f9f7 3 * Copyright (c) 2015 ARM Limited
<> 144:ef7eb2e8f9f7 4 *
<> 144:ef7eb2e8f9f7 5 * Licensed under the Apache License, Version 2.0 (the "License");
<> 144:ef7eb2e8f9f7 6 * you may not use this file except in compliance with the License.
<> 144:ef7eb2e8f9f7 7 * You may obtain a copy of the License at
<> 144:ef7eb2e8f9f7 8 *
<> 144:ef7eb2e8f9f7 9 * http://www.apache.org/licenses/LICENSE-2.0
<> 144:ef7eb2e8f9f7 10 *
<> 144:ef7eb2e8f9f7 11 * Unless required by applicable law or agreed to in writing, software
<> 144:ef7eb2e8f9f7 12 * distributed under the License is distributed on an "AS IS" BASIS,
<> 144:ef7eb2e8f9f7 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
<> 144:ef7eb2e8f9f7 14 * See the License for the specific language governing permissions and
<> 144:ef7eb2e8f9f7 15 * limitations under the License.
<> 144:ef7eb2e8f9f7 16 */
<> 144:ef7eb2e8f9f7 17
<> 144:ef7eb2e8f9f7 18 #include "cmsis.h"
<> 144:ef7eb2e8f9f7 19 #include "device.h"
<> 144:ef7eb2e8f9f7 20 #include "objects.h"
<> 144:ef7eb2e8f9f7 21 #include "lp_ticker_api.h"
<> 144:ef7eb2e8f9f7 22
<> 144:ef7eb2e8f9f7 23 /* Private lp_ticker data */
<> 144:ef7eb2e8f9f7 24 /* lp_ticker initialize */
<> 144:ef7eb2e8f9f7 25 static uint32_t lp_ticker_initialized = 0;
<> 144:ef7eb2e8f9f7 26 /* lp_ticker reload value */
<> 144:ef7eb2e8f9f7 27 static uint32_t lp_ticker_reload = 0x0; /* Max Value */
<> 144:ef7eb2e8f9f7 28 /* Store Overflow Delta */
<> 144:ef7eb2e8f9f7 29 static uint32_t lp_ticker_overflows_delta = 0;
<> 144:ef7eb2e8f9f7 30 /* lp_ticker Overflow limit */
<> 144:ef7eb2e8f9f7 31 static uint32_t lp_ticker_overflow_limit = 0;
<> 144:ef7eb2e8f9f7 32
<> 144:ef7eb2e8f9f7 33 #if DEVICE_LOWPOWERTIMER
<> 144:ef7eb2e8f9f7 34 /**
<> 144:ef7eb2e8f9f7 35 * Interrupt Handler
<> 144:ef7eb2e8f9f7 36 */
<> 144:ef7eb2e8f9f7 37 void __lp_ticker_irq_handler(void)
<> 144:ef7eb2e8f9f7 38 {
<> 144:ef7eb2e8f9f7 39 if (DualTimer_GetIRQInfo(DUALTIMER0) == SINGLETIMER2) {
<> 144:ef7eb2e8f9f7 40 DualTimer_ClearInterrupt(DUALTIMER0);
<> 144:ef7eb2e8f9f7 41 /*
<> 144:ef7eb2e8f9f7 42 * For each overflow event adds the timer max represented value to
<> 144:ef7eb2e8f9f7 43 * the delta. This allows the lp_ticker to keep track of the elapsed
<> 144:ef7eb2e8f9f7 44 * time:
<> 144:ef7eb2e8f9f7 45 * elapsed_time = (num_overflow * overflow_limit) + current_time
<> 144:ef7eb2e8f9f7 46 */
<> 144:ef7eb2e8f9f7 47 lp_ticker_overflows_delta += lp_ticker_overflow_limit;
<> 144:ef7eb2e8f9f7 48 } else {
<> 144:ef7eb2e8f9f7 49 lp_ticker_irq_handler();
<> 144:ef7eb2e8f9f7 50 }
<> 144:ef7eb2e8f9f7 51 }
<> 144:ef7eb2e8f9f7 52
<> 144:ef7eb2e8f9f7 53 /**
<> 144:ef7eb2e8f9f7 54 * Initialize the low power ticker
<> 144:ef7eb2e8f9f7 55 */
<> 144:ef7eb2e8f9f7 56 void lp_ticker_init(void)
<> 144:ef7eb2e8f9f7 57 {
<> 144:ef7eb2e8f9f7 58 uint32_t lp_ticker_irqn = 0;
<> 144:ef7eb2e8f9f7 59 /* Verify if lp_ticker has been already Initialized */
<> 144:ef7eb2e8f9f7 60 if (lp_ticker_initialized == 1)
<> 144:ef7eb2e8f9f7 61 {
<> 144:ef7eb2e8f9f7 62 return;
<> 144:ef7eb2e8f9f7 63 }
<> 144:ef7eb2e8f9f7 64 lp_ticker_initialized = 1;
<> 144:ef7eb2e8f9f7 65
<> 144:ef7eb2e8f9f7 66 /* Dualtimer Initialize */
<> 144:ef7eb2e8f9f7 67 DualTimer_Initialize(DUALTIMER0, lp_ticker_reload);
<> 144:ef7eb2e8f9f7 68 /* Dualtimer Enable */
<> 144:ef7eb2e8f9f7 69 DualTimer_Enable(DUALTIMER0, DUALTIMER_COUNT_32
<> 144:ef7eb2e8f9f7 70 //| DUALTIMER_PERIODIC
<> 144:ef7eb2e8f9f7 71 );
<> 144:ef7eb2e8f9f7 72 /* DualTimer get IRQn */
<> 144:ef7eb2e8f9f7 73 lp_ticker_irqn = DualTimer_GetIRQn(DUALTIMER0);
<> 144:ef7eb2e8f9f7 74 /* Enable lp_ticker IRQ */
<> 144:ef7eb2e8f9f7 75 NVIC_SetVector((IRQn_Type)lp_ticker_irqn,
<> 144:ef7eb2e8f9f7 76 (uint32_t)__lp_ticker_irq_handler);
<> 144:ef7eb2e8f9f7 77 NVIC_EnableIRQ((IRQn_Type)lp_ticker_irqn);
<> 144:ef7eb2e8f9f7 78
<> 144:ef7eb2e8f9f7 79 /* DualTimer set interrupt on SINGLETIMER2 */
<> 144:ef7eb2e8f9f7 80 DualTimer_SetInterrupt_2(DUALTIMER0, DUALTIMER_DEFAULT_RELOAD,
<> 144:ef7eb2e8f9f7 81 DUALTIMER_COUNT_32 | DUALTIMER_PERIODIC);
<> 144:ef7eb2e8f9f7 82
<> 144:ef7eb2e8f9f7 83 /*
<> 144:ef7eb2e8f9f7 84 * Set lp_ticker Overflow limit. The lp_ticker overflow limit is required
<> 144:ef7eb2e8f9f7 85 * to calculated the return value of the lp_ticker read function in us
<> 144:ef7eb2e8f9f7 86 * on 32bit.
<> 144:ef7eb2e8f9f7 87 * A 32bit us value cannot be represented directly in the Dual Timer Load
<> 144:ef7eb2e8f9f7 88 * register if it is greater than (0xFFFFFFFF ticks)/DUALTIMER_DIVIDER_US.
<> 144:ef7eb2e8f9f7 89 */
<> 144:ef7eb2e8f9f7 90 lp_ticker_overflow_limit = DualTimer_GetReloadValue(DUALTIMER0,
<> 144:ef7eb2e8f9f7 91 SINGLETIMER2);
<> 144:ef7eb2e8f9f7 92 }
<> 144:ef7eb2e8f9f7 93
<> 144:ef7eb2e8f9f7 94 /**
<> 144:ef7eb2e8f9f7 95 * Read the current counter
<> 144:ef7eb2e8f9f7 96 * @return: The current timer's counter value in microseconds
<> 144:ef7eb2e8f9f7 97 */
<> 144:ef7eb2e8f9f7 98 uint32_t lp_ticker_read(void)
<> 144:ef7eb2e8f9f7 99 {
<> 144:ef7eb2e8f9f7 100 uint32_t microseconds = 0;
<> 144:ef7eb2e8f9f7 101
<> 144:ef7eb2e8f9f7 102 /* Verify if lp_ticker has not been Initialized */
<> 144:ef7eb2e8f9f7 103 if (lp_ticker_initialized == 0)
<> 144:ef7eb2e8f9f7 104 lp_ticker_init();
<> 144:ef7eb2e8f9f7 105
<> 144:ef7eb2e8f9f7 106 /* Read Timer Value */
<> 144:ef7eb2e8f9f7 107 microseconds = lp_ticker_overflows_delta + DualTimer_Read_2(DUALTIMER0);
<> 144:ef7eb2e8f9f7 108
<> 144:ef7eb2e8f9f7 109 return microseconds;
<> 144:ef7eb2e8f9f7 110 }
<> 144:ef7eb2e8f9f7 111
<> 144:ef7eb2e8f9f7 112 /**
<> 144:ef7eb2e8f9f7 113 * Set interrupt for specified timestamp
<> 144:ef7eb2e8f9f7 114 * timestamp: The time in microseconds to be set
<> 144:ef7eb2e8f9f7 115 */
<> 144:ef7eb2e8f9f7 116 void lp_ticker_set_interrupt(timestamp_t timestamp)
<> 144:ef7eb2e8f9f7 117 {
<> 144:ef7eb2e8f9f7 118 /* Verify if lp_ticker has been not Initialized */
<> 144:ef7eb2e8f9f7 119 if (lp_ticker_initialized == 0)
<> 144:ef7eb2e8f9f7 120 lp_ticker_init();
<> 144:ef7eb2e8f9f7 121
<> 144:ef7eb2e8f9f7 122 /* Calculate the delta */
AnnaBridge 174:b96e65c34a4d 123 uint32_t delta = timestamp - lp_ticker_read();
<> 144:ef7eb2e8f9f7 124
<> 144:ef7eb2e8f9f7 125 /* Enable interrupt on SingleTimer1 */
<> 144:ef7eb2e8f9f7 126 DualTimer_SetInterrupt_1(DUALTIMER0, delta,
<> 144:ef7eb2e8f9f7 127 DUALTIMER_COUNT_32 | DUALTIMER_ONESHOT);
<> 144:ef7eb2e8f9f7 128 }
<> 144:ef7eb2e8f9f7 129
AnnaBridge 174:b96e65c34a4d 130 void lp_ticker_fire_interrupt(void)
AnnaBridge 174:b96e65c34a4d 131 {
AnnaBridge 174:b96e65c34a4d 132 uint32_t lp_ticker_irqn = DualTimer_GetIRQn(DUALTIMER0);
AnnaBridge 174:b96e65c34a4d 133 NVIC_SetPendingIRQ((IRQn_Type)lp_ticker_irqn);
AnnaBridge 174:b96e65c34a4d 134 }
AnnaBridge 174:b96e65c34a4d 135
<> 144:ef7eb2e8f9f7 136 /**
<> 144:ef7eb2e8f9f7 137 * Disable low power ticker interrupt
<> 144:ef7eb2e8f9f7 138 */
<> 144:ef7eb2e8f9f7 139 void lp_ticker_disable_interrupt(void)
<> 144:ef7eb2e8f9f7 140 {
<> 144:ef7eb2e8f9f7 141 /* Disable Interrupt */
<> 150:02e0a0aed4ec 142 DualTimer_DisableInterrupt(DUALTIMER0,
<> 150:02e0a0aed4ec 143 SINGLETIMER1);
<> 144:ef7eb2e8f9f7 144 }
<> 144:ef7eb2e8f9f7 145
<> 144:ef7eb2e8f9f7 146 /**
<> 144:ef7eb2e8f9f7 147 * Clear the low power ticker interrupt
<> 144:ef7eb2e8f9f7 148 */
<> 144:ef7eb2e8f9f7 149 void lp_ticker_clear_interrupt(void)
<> 144:ef7eb2e8f9f7 150 {
<> 144:ef7eb2e8f9f7 151 /* Clear Interrupt */
<> 144:ef7eb2e8f9f7 152 DualTimer_ClearInterrupt(DUALTIMER0);
<> 144:ef7eb2e8f9f7 153 }
<> 144:ef7eb2e8f9f7 154
<> 144:ef7eb2e8f9f7 155 #endif