mbed library sources. Supersedes mbed-src.

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

Committer:
AnnaBridge
Date:
Wed Feb 20 22:31:08 2019 +0000
Revision:
189:f392fc9709a3
Parent:
188:bcfe06ba3d64
mbed library release version 165

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 187:0387e8f68319 1 /*
AnnaBridge 187:0387e8f68319 2 * Copyright (c) 2013 Nordic Semiconductor ASA
AnnaBridge 187:0387e8f68319 3 * All rights reserved.
AnnaBridge 187:0387e8f68319 4 *
AnnaBridge 187:0387e8f68319 5 * Redistribution and use in source and binary forms, with or without modification,
AnnaBridge 187:0387e8f68319 6 * are permitted provided that the following conditions are met:
AnnaBridge 187:0387e8f68319 7 *
AnnaBridge 187:0387e8f68319 8 * 1. Redistributions of source code must retain the above copyright notice, this list
AnnaBridge 187:0387e8f68319 9 * of conditions and the following disclaimer.
AnnaBridge 187:0387e8f68319 10 *
AnnaBridge 187:0387e8f68319 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
AnnaBridge 187:0387e8f68319 12 * integrated circuit in a product or a software update for such product, must reproduce
AnnaBridge 187:0387e8f68319 13 * the above copyright notice, this list of conditions and the following disclaimer in
AnnaBridge 187:0387e8f68319 14 * the documentation and/or other materials provided with the distribution.
AnnaBridge 187:0387e8f68319 15 *
AnnaBridge 187:0387e8f68319 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
AnnaBridge 187:0387e8f68319 17 * used to endorse or promote products derived from this software without specific prior
AnnaBridge 187:0387e8f68319 18 * written permission.
AnnaBridge 187:0387e8f68319 19 *
AnnaBridge 187:0387e8f68319 20 * 4. This software, with or without modification, must only be used with a
AnnaBridge 187:0387e8f68319 21 * Nordic Semiconductor ASA integrated circuit.
AnnaBridge 187:0387e8f68319 22 *
AnnaBridge 187:0387e8f68319 23 * 5. Any software provided in binary or object form under this license must not be reverse
AnnaBridge 187:0387e8f68319 24 * engineered, decompiled, modified and/or disassembled.
AnnaBridge 187:0387e8f68319 25 *
AnnaBridge 187:0387e8f68319 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
AnnaBridge 187:0387e8f68319 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
AnnaBridge 187:0387e8f68319 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
AnnaBridge 187:0387e8f68319 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
AnnaBridge 187:0387e8f68319 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
AnnaBridge 187:0387e8f68319 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
AnnaBridge 187:0387e8f68319 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
AnnaBridge 187:0387e8f68319 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
AnnaBridge 187:0387e8f68319 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
AnnaBridge 187:0387e8f68319 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
AnnaBridge 187:0387e8f68319 36 *
AnnaBridge 187:0387e8f68319 37 */
AnnaBridge 187:0387e8f68319 38
AnnaBridge 187:0387e8f68319 39 #include "us_ticker.h"
AnnaBridge 187:0387e8f68319 40
AnnaBridge 187:0387e8f68319 41 #include "us_ticker_api.h"
AnnaBridge 187:0387e8f68319 42 #include "nrf_timer.h"
AnnaBridge 187:0387e8f68319 43 #include "app_util_platform.h"
AnnaBridge 187:0387e8f68319 44 #include "nrf_drv_common.h"
AnnaBridge 187:0387e8f68319 45 #include "mbed_critical.h"
AnnaBridge 187:0387e8f68319 46
AnnaBridge 187:0387e8f68319 47 bool us_ticker_initialized = false;
AnnaBridge 187:0387e8f68319 48
AnnaBridge 187:0387e8f68319 49 /* us ticker is driven by 1MHz clock and counter length is 16 bits. */
AnnaBridge 187:0387e8f68319 50 const ticker_info_t* us_ticker_get_info()
AnnaBridge 187:0387e8f68319 51 {
AnnaBridge 187:0387e8f68319 52 static const ticker_info_t info = {
AnnaBridge 187:0387e8f68319 53 US_TICKER_FREQ,
AnnaBridge 187:0387e8f68319 54 US_TICKER_COUNTER_BITS
AnnaBridge 187:0387e8f68319 55 };
AnnaBridge 187:0387e8f68319 56 return &info;
AnnaBridge 187:0387e8f68319 57 }
AnnaBridge 187:0387e8f68319 58
AnnaBridge 187:0387e8f68319 59 void us_ticker_init(void)
AnnaBridge 187:0387e8f68319 60 {
AnnaBridge 187:0387e8f68319 61 if (us_ticker_initialized) {
AnnaBridge 187:0387e8f68319 62 nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0);
AnnaBridge 187:0387e8f68319 63 nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
AnnaBridge 187:0387e8f68319 64 return;
AnnaBridge 187:0387e8f68319 65 }
AnnaBridge 187:0387e8f68319 66
AnnaBridge 187:0387e8f68319 67 nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_STOP);
AnnaBridge 187:0387e8f68319 68
AnnaBridge 187:0387e8f68319 69 nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
AnnaBridge 187:0387e8f68319 70
AnnaBridge 187:0387e8f68319 71 /* Configure timer as follows:
AnnaBridge 187:0387e8f68319 72 * - timer mode,
AnnaBridge 187:0387e8f68319 73 * - timer width 16 bits for NRF51 and 32 bits for NRF52,
AnnaBridge 187:0387e8f68319 74 * - timer freq 1 MHz.
AnnaBridge 187:0387e8f68319 75 */
AnnaBridge 187:0387e8f68319 76 nrf_timer_mode_set(NRF_TIMER1, NRF_TIMER_MODE_TIMER);
AnnaBridge 187:0387e8f68319 77
AnnaBridge 187:0387e8f68319 78 nrf_timer_frequency_set(NRF_TIMER1, NRF_TIMER_FREQ_1MHz);
AnnaBridge 187:0387e8f68319 79
AnnaBridge 187:0387e8f68319 80 #ifdef TARGET_NRF52
AnnaBridge 187:0387e8f68319 81 nrf_timer_bit_width_set(NRF_TIMER1, NRF_TIMER_BIT_WIDTH_32);
AnnaBridge 187:0387e8f68319 82 #else
AnnaBridge 187:0387e8f68319 83 nrf_timer_bit_width_set(NRF_TIMER1, NRF_TIMER_BIT_WIDTH_16);
AnnaBridge 187:0387e8f68319 84 #endif
AnnaBridge 187:0387e8f68319 85
AnnaBridge 187:0387e8f68319 86 nrf_timer_cc_write(NRF_TIMER1, NRF_TIMER_CC_CHANNEL0, 0);
AnnaBridge 187:0387e8f68319 87
AnnaBridge 187:0387e8f68319 88 nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0);
AnnaBridge 187:0387e8f68319 89
AnnaBridge 187:0387e8f68319 90 NVIC_SetVector(TIMER1_IRQn, (uint32_t)us_ticker_irq_handler);
AnnaBridge 187:0387e8f68319 91
AnnaBridge 187:0387e8f68319 92 nrf_drv_common_irq_enable(TIMER1_IRQn, APP_IRQ_PRIORITY_HIGH);
AnnaBridge 187:0387e8f68319 93
AnnaBridge 187:0387e8f68319 94 nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_START);
AnnaBridge 187:0387e8f68319 95
AnnaBridge 187:0387e8f68319 96 /* Bug fix. First value can't be trusted. */
AnnaBridge 187:0387e8f68319 97 nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_CAPTURE1);
AnnaBridge 187:0387e8f68319 98
AnnaBridge 187:0387e8f68319 99 us_ticker_initialized = true;
AnnaBridge 187:0387e8f68319 100 }
AnnaBridge 187:0387e8f68319 101
AnnaBridge 187:0387e8f68319 102 uint32_t us_ticker_read()
AnnaBridge 187:0387e8f68319 103 {
AnnaBridge 187:0387e8f68319 104 nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_CAPTURE1);
AnnaBridge 187:0387e8f68319 105
AnnaBridge 187:0387e8f68319 106 return nrf_timer_cc_read(NRF_TIMER1, NRF_TIMER_CC_CHANNEL1);
AnnaBridge 187:0387e8f68319 107 }
AnnaBridge 187:0387e8f68319 108
AnnaBridge 187:0387e8f68319 109 void us_ticker_set_interrupt(timestamp_t timestamp)
AnnaBridge 187:0387e8f68319 110 {
AnnaBridge 187:0387e8f68319 111 core_util_critical_section_enter();
AnnaBridge 187:0387e8f68319 112
AnnaBridge 187:0387e8f68319 113 const uint32_t counter_mask = ((1ULL << US_TICKER_COUNTER_BITS) - 1);
AnnaBridge 187:0387e8f68319 114
AnnaBridge 187:0387e8f68319 115 nrf_timer_cc_write(NRF_TIMER1, NRF_TIMER_CC_CHANNEL0, timestamp & counter_mask);
AnnaBridge 187:0387e8f68319 116
AnnaBridge 187:0387e8f68319 117 if (!nrf_timer_int_enable_check(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0))) {
AnnaBridge 187:0387e8f68319 118 nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0);
AnnaBridge 187:0387e8f68319 119 nrf_timer_int_enable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
AnnaBridge 187:0387e8f68319 120 }
AnnaBridge 187:0387e8f68319 121
AnnaBridge 187:0387e8f68319 122 core_util_critical_section_exit();
AnnaBridge 187:0387e8f68319 123 }
AnnaBridge 187:0387e8f68319 124
AnnaBridge 187:0387e8f68319 125 void us_ticker_fire_interrupt(void)
AnnaBridge 187:0387e8f68319 126 {
AnnaBridge 187:0387e8f68319 127 NVIC_SetPendingIRQ(TIMER1_IRQn);
AnnaBridge 187:0387e8f68319 128 }
AnnaBridge 187:0387e8f68319 129
AnnaBridge 187:0387e8f68319 130 void us_ticker_disable_interrupt(void)
AnnaBridge 187:0387e8f68319 131 {
AnnaBridge 187:0387e8f68319 132 nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
AnnaBridge 187:0387e8f68319 133 }
AnnaBridge 187:0387e8f68319 134
AnnaBridge 187:0387e8f68319 135 void us_ticker_clear_interrupt(void)
AnnaBridge 187:0387e8f68319 136 {
AnnaBridge 187:0387e8f68319 137 nrf_timer_event_clear(NRF_TIMER1, NRF_TIMER_EVENT_COMPARE0);
AnnaBridge 187:0387e8f68319 138 }
AnnaBridge 187:0387e8f68319 139
AnnaBridge 187:0387e8f68319 140 void us_ticker_free(void)
AnnaBridge 187:0387e8f68319 141 {
AnnaBridge 187:0387e8f68319 142 nrf_timer_task_trigger(NRF_TIMER1, NRF_TIMER_TASK_STOP);
AnnaBridge 187:0387e8f68319 143 nrf_timer_int_disable(NRF_TIMER1, nrf_timer_compare_int_get(NRF_TIMER_CC_CHANNEL0));
AnnaBridge 188:bcfe06ba3d64 144 NVIC_DisableIRQ(TIMER1_IRQn);
AnnaBridge 187:0387e8f68319 145 us_ticker_initialized = false;
AnnaBridge 187:0387e8f68319 146 }