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:
167:e84263d55307
Child:
184:08ed48f1de7f
This updates the lib to the mbed lib v 152

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 167:e84263d55307 1 /* mbed Microcontroller Library
AnnaBridge 167:e84263d55307 2 * Copyright (c) 2015 ARM Limited
AnnaBridge 167:e84263d55307 3 *
AnnaBridge 167:e84263d55307 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 167:e84263d55307 5 * you may not use this file except in compliance with the License.
AnnaBridge 167:e84263d55307 6 * You may obtain a copy of the License at
AnnaBridge 167:e84263d55307 7 *
AnnaBridge 167:e84263d55307 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 167:e84263d55307 9 *
AnnaBridge 167:e84263d55307 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 167:e84263d55307 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 167:e84263d55307 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 167:e84263d55307 13 * See the License for the specific language governing permissions and
AnnaBridge 167:e84263d55307 14 * limitations under the License.
AnnaBridge 167:e84263d55307 15 */
AnnaBridge 167:e84263d55307 16
AnnaBridge 167:e84263d55307 17 /* This file is derivative of us_ticker.c from BEETLE */
AnnaBridge 167:e84263d55307 18
AnnaBridge 167:e84263d55307 19 #include <stddef.h>
AnnaBridge 167:e84263d55307 20 #include "cmsis.h"
AnnaBridge 167:e84263d55307 21 #include "us_ticker_api.h"
AnnaBridge 167:e84263d55307 22 #include "PeripheralNames.h"
AnnaBridge 167:e84263d55307 23
AnnaBridge 167:e84263d55307 24 #define TIMER_MAX_VALUE 0
AnnaBridge 167:e84263d55307 25
AnnaBridge 167:e84263d55307 26 /* Private data */
AnnaBridge 167:e84263d55307 27 struct us_ticker_drv_data_t {
AnnaBridge 167:e84263d55307 28 uint32_t inited; /* us ticker initialized */
AnnaBridge 167:e84263d55307 29 uint32_t overflow_delta; /* us ticker overflow */
AnnaBridge 167:e84263d55307 30 uint32_t overflow_limit; /* us ticker overflow limit */
AnnaBridge 167:e84263d55307 31 };
AnnaBridge 167:e84263d55307 32
AnnaBridge 167:e84263d55307 33 static struct us_ticker_drv_data_t us_ticker_drv_data = {
AnnaBridge 167:e84263d55307 34 .inited = 0,
AnnaBridge 167:e84263d55307 35 .overflow_delta = 0,
AnnaBridge 167:e84263d55307 36 .overflow_limit = 0
AnnaBridge 167:e84263d55307 37 };
AnnaBridge 167:e84263d55307 38
AnnaBridge 167:e84263d55307 39
AnnaBridge 167:e84263d55307 40 void __us_ticker_irq_handler(void)
AnnaBridge 167:e84263d55307 41 {
AnnaBridge 167:e84263d55307 42 Timer_ClearInterrupt(TIMER1);
AnnaBridge 167:e84263d55307 43 /*
AnnaBridge 167:e84263d55307 44 * For each overflow event adds the timer max represented value to
AnnaBridge 167:e84263d55307 45 * the delta. This allows the us_ticker to keep track of the elapsed
AnnaBridge 167:e84263d55307 46 * time:
AnnaBridge 167:e84263d55307 47 * elapsed_time = (num_overflow * overflow_limit) + current_time
AnnaBridge 167:e84263d55307 48 */
AnnaBridge 167:e84263d55307 49 us_ticker_drv_data.overflow_delta += us_ticker_drv_data.overflow_limit;
AnnaBridge 167:e84263d55307 50 }
AnnaBridge 167:e84263d55307 51
AnnaBridge 167:e84263d55307 52 void us_ticker_init(void)
AnnaBridge 167:e84263d55307 53 {
AnnaBridge 167:e84263d55307 54 uint32_t us_ticker_irqn0 = 0;
AnnaBridge 167:e84263d55307 55 uint32_t us_ticker_irqn1 = 0;
AnnaBridge 167:e84263d55307 56
AnnaBridge 167:e84263d55307 57 if (us_ticker_drv_data.inited) {
AnnaBridge 167:e84263d55307 58 return;
AnnaBridge 167:e84263d55307 59 }
AnnaBridge 167:e84263d55307 60
AnnaBridge 167:e84263d55307 61 us_ticker_drv_data.inited = 1;
AnnaBridge 167:e84263d55307 62
AnnaBridge 167:e84263d55307 63 /* Initialize Timer 0 */
AnnaBridge 167:e84263d55307 64 Timer_Initialize(TIMER0, TIMER_MAX_VALUE);
AnnaBridge 167:e84263d55307 65 /* Enable Timer 0 */
AnnaBridge 167:e84263d55307 66 Timer_Enable(TIMER0);
AnnaBridge 167:e84263d55307 67
AnnaBridge 167:e84263d55307 68 /* Initialize Timer 1 */
AnnaBridge 167:e84263d55307 69 Timer_Initialize(TIMER1, TIMER_MAX_VALUE);
AnnaBridge 167:e84263d55307 70 /* Enable Timer 1 */
AnnaBridge 167:e84263d55307 71 Timer_Enable(TIMER1);
AnnaBridge 167:e84263d55307 72
AnnaBridge 167:e84263d55307 73 /* Timer 0 get IRQn */
AnnaBridge 167:e84263d55307 74 us_ticker_irqn0 = Timer_GetIRQn(TIMER0);
AnnaBridge 167:e84263d55307 75 NVIC_SetVector((IRQn_Type)us_ticker_irqn0, (uint32_t)us_ticker_irq_handler);
AnnaBridge 167:e84263d55307 76 NVIC_EnableIRQ((IRQn_Type)us_ticker_irqn0);
AnnaBridge 167:e84263d55307 77
AnnaBridge 167:e84263d55307 78 /* Timer 1 get IRQn */
AnnaBridge 167:e84263d55307 79 us_ticker_irqn1 = Timer_GetIRQn(TIMER1);
AnnaBridge 167:e84263d55307 80 NVIC_SetVector((IRQn_Type)us_ticker_irqn1, (uint32_t)__us_ticker_irq_handler);
AnnaBridge 167:e84263d55307 81 NVIC_EnableIRQ((IRQn_Type)us_ticker_irqn1);
AnnaBridge 167:e84263d55307 82
AnnaBridge 167:e84263d55307 83 /* Timer set interrupt on TIMER1 */
AnnaBridge 167:e84263d55307 84 Timer_SetInterrupt(TIMER1, TIMER_DEFAULT_RELOAD);
AnnaBridge 167:e84263d55307 85
AnnaBridge 167:e84263d55307 86 /*
AnnaBridge 167:e84263d55307 87 * Set us_ticker Overflow limit. The us_ticker overflow limit is required
AnnaBridge 167:e84263d55307 88 * to calculated the return value of the us_ticker read function in us
AnnaBridge 167:e84263d55307 89 * on 32bit.
AnnaBridge 167:e84263d55307 90 * A 32bit us value cannot be represented directly in the Timer Load
AnnaBridge 167:e84263d55307 91 * register if it is greater than (0xFFFFFFFF ticks)/TIMER_DIVIDER_US.
AnnaBridge 167:e84263d55307 92 */
AnnaBridge 167:e84263d55307 93 us_ticker_drv_data.overflow_limit = Timer_GetReloadValue(TIMER1);
AnnaBridge 167:e84263d55307 94 }
AnnaBridge 167:e84263d55307 95
AnnaBridge 167:e84263d55307 96 uint32_t us_ticker_read()
AnnaBridge 167:e84263d55307 97 {
AnnaBridge 167:e84263d55307 98 uint32_t return_value = 0;
AnnaBridge 167:e84263d55307 99
AnnaBridge 167:e84263d55307 100 if (!us_ticker_drv_data.inited) {
AnnaBridge 167:e84263d55307 101 us_ticker_init();
AnnaBridge 167:e84263d55307 102 }
AnnaBridge 167:e84263d55307 103
AnnaBridge 167:e84263d55307 104 return_value = us_ticker_drv_data.overflow_delta + Timer_Read(TIMER1);
AnnaBridge 167:e84263d55307 105
AnnaBridge 167:e84263d55307 106 return return_value;
AnnaBridge 167:e84263d55307 107 }
AnnaBridge 167:e84263d55307 108
AnnaBridge 167:e84263d55307 109 void us_ticker_set_interrupt(timestamp_t timestamp)
AnnaBridge 167:e84263d55307 110 {
AnnaBridge 174:b96e65c34a4d 111 uint32_t delta = 0;
AnnaBridge 167:e84263d55307 112
AnnaBridge 167:e84263d55307 113 if (!us_ticker_drv_data.inited) {
AnnaBridge 167:e84263d55307 114 us_ticker_init();
AnnaBridge 167:e84263d55307 115 }
AnnaBridge 167:e84263d55307 116
AnnaBridge 174:b96e65c34a4d 117 delta = timestamp - us_ticker_read();
AnnaBridge 174:b96e65c34a4d 118
AnnaBridge 174:b96e65c34a4d 119 /* If the event was not in the past enable interrupt */
AnnaBridge 174:b96e65c34a4d 120 Timer_SetInterrupt(TIMER0, delta);
AnnaBridge 167:e84263d55307 121
AnnaBridge 174:b96e65c34a4d 122 }
AnnaBridge 174:b96e65c34a4d 123
AnnaBridge 174:b96e65c34a4d 124 void us_ticker_fire_interrupt(void)
AnnaBridge 174:b96e65c34a4d 125 {
AnnaBridge 174:b96e65c34a4d 126 uint32_t us_ticker_irqn1 = Timer_GetIRQn(TIMER1);
AnnaBridge 174:b96e65c34a4d 127 NVIC_SetPendingIRQ((IRQn_Type)us_ticker_irqn1);
AnnaBridge 167:e84263d55307 128 }
AnnaBridge 167:e84263d55307 129
AnnaBridge 167:e84263d55307 130 void us_ticker_disable_interrupt(void)
AnnaBridge 167:e84263d55307 131 {
AnnaBridge 167:e84263d55307 132 Timer_DisableInterrupt(TIMER0);
AnnaBridge 167:e84263d55307 133 }
AnnaBridge 167:e84263d55307 134
AnnaBridge 167:e84263d55307 135 void us_ticker_clear_interrupt(void)
AnnaBridge 167:e84263d55307 136 {
AnnaBridge 167:e84263d55307 137 Timer_ClearInterrupt(TIMER0);
AnnaBridge 167:e84263d55307 138 }