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
Anna Bridge 186:707f6e361f3e 1 /*
Anna Bridge 186:707f6e361f3e 2 * Copyright (c) 2013 Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 3 * All rights reserved.
Anna Bridge 186:707f6e361f3e 4 *
Anna Bridge 186:707f6e361f3e 5 * Redistribution and use in source and binary forms, with or without modification,
Anna Bridge 186:707f6e361f3e 6 * are permitted provided that the following conditions are met:
Anna Bridge 186:707f6e361f3e 7 *
Anna Bridge 186:707f6e361f3e 8 * 1. Redistributions of source code must retain the above copyright notice, this list
Anna Bridge 186:707f6e361f3e 9 * of conditions and the following disclaimer.
Anna Bridge 186:707f6e361f3e 10 *
Anna Bridge 186:707f6e361f3e 11 * 2. Redistributions in binary form, except as embedded into a Nordic Semiconductor ASA
Anna Bridge 186:707f6e361f3e 12 * integrated circuit in a product or a software update for such product, must reproduce
Anna Bridge 186:707f6e361f3e 13 * the above copyright notice, this list of conditions and the following disclaimer in
Anna Bridge 186:707f6e361f3e 14 * the documentation and/or other materials provided with the distribution.
Anna Bridge 186:707f6e361f3e 15 *
Anna Bridge 186:707f6e361f3e 16 * 3. Neither the name of Nordic Semiconductor ASA nor the names of its contributors may be
Anna Bridge 186:707f6e361f3e 17 * used to endorse or promote products derived from this software without specific prior
Anna Bridge 186:707f6e361f3e 18 * written permission.
Anna Bridge 186:707f6e361f3e 19 *
Anna Bridge 186:707f6e361f3e 20 * 4. This software, with or without modification, must only be used with a
Anna Bridge 186:707f6e361f3e 21 * Nordic Semiconductor ASA integrated circuit.
Anna Bridge 186:707f6e361f3e 22 *
Anna Bridge 186:707f6e361f3e 23 * 5. Any software provided in binary or object form under this license must not be reverse
Anna Bridge 186:707f6e361f3e 24 * engineered, decompiled, modified and/or disassembled.
Anna Bridge 186:707f6e361f3e 25 *
Anna Bridge 186:707f6e361f3e 26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
Anna Bridge 186:707f6e361f3e 27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
Anna Bridge 186:707f6e361f3e 28 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Anna Bridge 186:707f6e361f3e 29 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
Anna Bridge 186:707f6e361f3e 30 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
Anna Bridge 186:707f6e361f3e 31 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
Anna Bridge 186:707f6e361f3e 32 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
Anna Bridge 186:707f6e361f3e 33 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Anna Bridge 186:707f6e361f3e 34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
Anna Bridge 186:707f6e361f3e 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Anna Bridge 186:707f6e361f3e 36 *
Anna Bridge 186:707f6e361f3e 37 */
Anna Bridge 186:707f6e361f3e 38
Anna Bridge 186:707f6e361f3e 39 #include "us_ticker_api.h"
Anna Bridge 186:707f6e361f3e 40 #include "common_rtc.h"
Anna Bridge 186:707f6e361f3e 41 #include "app_util.h"
Anna Bridge 186:707f6e361f3e 42 #include "nrf_drv_common.h"
Anna Bridge 186:707f6e361f3e 43 #include "lp_ticker_api.h"
Anna Bridge 186:707f6e361f3e 44 #include "mbed_critical.h"
Anna Bridge 186:707f6e361f3e 45
Anna Bridge 186:707f6e361f3e 46 #if defined(NRF52_PAN_20)
Anna Bridge 186:707f6e361f3e 47 /* Macro for testing if the SoftDevice is active, regardless of whether the
Anna Bridge 186:707f6e361f3e 48 * application is build with the SoftDevice or not.
Anna Bridge 186:707f6e361f3e 49 */
Anna Bridge 186:707f6e361f3e 50 #if defined(SOFTDEVICE_PRESENT)
Anna Bridge 186:707f6e361f3e 51 #include "nrf_sdh.h"
Anna Bridge 186:707f6e361f3e 52 #define NRF_HAL_SD_IS_ENABLED() nrf_sdh_is_enabled()
Anna Bridge 186:707f6e361f3e 53 #else
Anna Bridge 186:707f6e361f3e 54 #define NRF_HAL_SD_IS_ENABLED() 0
Anna Bridge 186:707f6e361f3e 55 #endif
Anna Bridge 186:707f6e361f3e 56 #endif
Anna Bridge 186:707f6e361f3e 57
Anna Bridge 186:707f6e361f3e 58
Anna Bridge 186:707f6e361f3e 59 //------------------------------------------------------------------------------
Anna Bridge 186:707f6e361f3e 60 // Common stuff used also by lp_ticker and rtc_api (see "common_rtc.h").
Anna Bridge 186:707f6e361f3e 61 //
Anna Bridge 186:707f6e361f3e 62 #include "app_util_platform.h"
Anna Bridge 186:707f6e361f3e 63
Anna Bridge 186:707f6e361f3e 64 bool m_common_rtc_enabled = false;
Anna Bridge 186:707f6e361f3e 65 uint32_t volatile m_common_rtc_overflows = 0;
Anna Bridge 186:707f6e361f3e 66 bool volatile lp_ticker_interrupt_fire = false;
Anna Bridge 186:707f6e361f3e 67
Anna Bridge 186:707f6e361f3e 68 __STATIC_INLINE void rtc_ovf_event_check(void)
Anna Bridge 186:707f6e361f3e 69 {
Anna Bridge 186:707f6e361f3e 70 if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW)) {
Anna Bridge 186:707f6e361f3e 71 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW);
Anna Bridge 186:707f6e361f3e 72 /* Don't disable this event. It shall occur periodically.
Anna Bridge 186:707f6e361f3e 73 * It is needed for RTC. */
Anna Bridge 186:707f6e361f3e 74
Anna Bridge 186:707f6e361f3e 75 ++m_common_rtc_overflows;
Anna Bridge 186:707f6e361f3e 76 }
Anna Bridge 186:707f6e361f3e 77 }
Anna Bridge 186:707f6e361f3e 78
Anna Bridge 186:707f6e361f3e 79 #if defined(TARGET_MCU_NRF51822)
Anna Bridge 186:707f6e361f3e 80 void common_rtc_irq_handler(void)
Anna Bridge 186:707f6e361f3e 81 #else
Anna Bridge 186:707f6e361f3e 82 void COMMON_RTC_IRQ_HANDLER(void)
Anna Bridge 186:707f6e361f3e 83 #endif
Anna Bridge 186:707f6e361f3e 84 {
Anna Bridge 186:707f6e361f3e 85 rtc_ovf_event_check();
Anna Bridge 186:707f6e361f3e 86
Anna Bridge 186:707f6e361f3e 87 #if DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 88 if (nrf_rtc_event_pending(COMMON_RTC_INSTANCE, LP_TICKER_EVENT) ||
Anna Bridge 186:707f6e361f3e 89 lp_ticker_interrupt_fire) {
Anna Bridge 186:707f6e361f3e 90
Anna Bridge 186:707f6e361f3e 91 if (lp_ticker_interrupt_fire) {
Anna Bridge 186:707f6e361f3e 92 lp_ticker_interrupt_fire = false;
Anna Bridge 186:707f6e361f3e 93 }
Anna Bridge 186:707f6e361f3e 94
Anna Bridge 186:707f6e361f3e 95 lp_ticker_irq_handler();
Anna Bridge 186:707f6e361f3e 96 }
Anna Bridge 186:707f6e361f3e 97 #endif
Anna Bridge 186:707f6e361f3e 98 }
Anna Bridge 186:707f6e361f3e 99
Anna Bridge 186:707f6e361f3e 100 /* Function for fix errata 20: RTC Register values are invalid. */
Anna Bridge 186:707f6e361f3e 101 __STATIC_INLINE void errata_20(void)
Anna Bridge 186:707f6e361f3e 102 {
Anna Bridge 186:707f6e361f3e 103 #if defined(NRF52_PAN_20)
Anna Bridge 186:707f6e361f3e 104 if (!NRF_HAL_SD_IS_ENABLED())
Anna Bridge 186:707f6e361f3e 105 {
Anna Bridge 186:707f6e361f3e 106 NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
Anna Bridge 186:707f6e361f3e 107 NRF_CLOCK->TASKS_LFCLKSTART = 1;
Anna Bridge 186:707f6e361f3e 108
Anna Bridge 186:707f6e361f3e 109 while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0)
Anna Bridge 186:707f6e361f3e 110 {
Anna Bridge 186:707f6e361f3e 111 }
Anna Bridge 186:707f6e361f3e 112 }
Anna Bridge 186:707f6e361f3e 113 NRF_RTC1->TASKS_STOP = 0;
Anna Bridge 186:707f6e361f3e 114 #endif
Anna Bridge 186:707f6e361f3e 115 }
Anna Bridge 186:707f6e361f3e 116
Anna Bridge 186:707f6e361f3e 117 void RTC1_IRQHandler(void);
Anna Bridge 186:707f6e361f3e 118
Anna Bridge 186:707f6e361f3e 119 void common_rtc_init(void)
Anna Bridge 186:707f6e361f3e 120 {
Anna Bridge 186:707f6e361f3e 121 if (m_common_rtc_enabled) {
Anna Bridge 186:707f6e361f3e 122 #if DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 123 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT);
Anna Bridge 186:707f6e361f3e 124 nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
Anna Bridge 186:707f6e361f3e 125 #endif
Anna Bridge 186:707f6e361f3e 126 return;
Anna Bridge 186:707f6e361f3e 127 }
Anna Bridge 186:707f6e361f3e 128
Anna Bridge 186:707f6e361f3e 129 errata_20();
Anna Bridge 186:707f6e361f3e 130
Anna Bridge 186:707f6e361f3e 131 nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_STOP);
Anna Bridge 186:707f6e361f3e 132
Anna Bridge 186:707f6e361f3e 133 NVIC_SetVector(RTC1_IRQn, (uint32_t)RTC1_IRQHandler);
Anna Bridge 186:707f6e361f3e 134
Anna Bridge 186:707f6e361f3e 135 /* RTC is driven by the low frequency (32.768 kHz) clock, a proper request
Anna Bridge 186:707f6e361f3e 136 * must be made to have it running.
Anna Bridge 186:707f6e361f3e 137 * Currently this clock is started in 'SystemInit' (see "system_nrf51.c"
Anna Bridge 186:707f6e361f3e 138 * or "system_nrf52.c", respectively).
Anna Bridge 186:707f6e361f3e 139 */
Anna Bridge 186:707f6e361f3e 140
Anna Bridge 186:707f6e361f3e 141 nrf_rtc_prescaler_set(COMMON_RTC_INSTANCE, 0);
Anna Bridge 186:707f6e361f3e 142
Anna Bridge 186:707f6e361f3e 143 /* Clear all RTC events. */
Anna Bridge 186:707f6e361f3e 144 #if defined(TARGET_MCU_NRF51822)
Anna Bridge 186:707f6e361f3e 145 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, OS_TICK_EVENT);
Anna Bridge 186:707f6e361f3e 146 #endif
Anna Bridge 186:707f6e361f3e 147 #if DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 148 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT);
Anna Bridge 186:707f6e361f3e 149 #endif
Anna Bridge 186:707f6e361f3e 150 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, NRF_RTC_EVENT_OVERFLOW);
Anna Bridge 186:707f6e361f3e 151
Anna Bridge 186:707f6e361f3e 152 /* Disable all RTC events (According to NRF_51 Reference Manual
Anna Bridge 186:707f6e361f3e 153 * RTC events can not be used to control RTC interrupts).
Anna Bridge 186:707f6e361f3e 154 * IRQ signal to NVIC is provided if interrupt is enabled.
Anna Bridge 186:707f6e361f3e 155 */
Anna Bridge 186:707f6e361f3e 156
Anna Bridge 186:707f6e361f3e 157 nrf_rtc_event_disable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK
Anna Bridge 186:707f6e361f3e 158 #if defined(TARGET_MCU_NRF51822)
Anna Bridge 186:707f6e361f3e 159 | OS_TICK_INT_MASK
Anna Bridge 186:707f6e361f3e 160 #endif
Anna Bridge 186:707f6e361f3e 161 #if DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 162 | LP_TICKER_INT_MASK
Anna Bridge 186:707f6e361f3e 163 #endif
Anna Bridge 186:707f6e361f3e 164 );
Anna Bridge 186:707f6e361f3e 165
Anna Bridge 186:707f6e361f3e 166 /* This interrupt is enabled permanently, since overflow indications are needed
Anna Bridge 186:707f6e361f3e 167 * continuously.
Anna Bridge 186:707f6e361f3e 168 */
Anna Bridge 186:707f6e361f3e 169 nrf_rtc_int_enable(COMMON_RTC_INSTANCE, NRF_RTC_INT_OVERFLOW_MASK);
Anna Bridge 186:707f6e361f3e 170
Anna Bridge 186:707f6e361f3e 171 /* Disable LP ticker interrupt for now. */
Anna Bridge 186:707f6e361f3e 172 #if DEVICE_LPTICKER
Anna Bridge 186:707f6e361f3e 173 nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
Anna Bridge 186:707f6e361f3e 174 #endif
Anna Bridge 186:707f6e361f3e 175
AnnaBridge 187:0387e8f68319 176 nrf_drv_common_irq_enable(nrf_drv_get_IRQn(COMMON_RTC_INSTANCE), APP_IRQ_PRIORITY_HIGH);
Anna Bridge 186:707f6e361f3e 177
Anna Bridge 186:707f6e361f3e 178 nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_START);
Anna Bridge 186:707f6e361f3e 179
Anna Bridge 186:707f6e361f3e 180 m_common_rtc_enabled = true;
Anna Bridge 186:707f6e361f3e 181 }
Anna Bridge 186:707f6e361f3e 182
AnnaBridge 188:bcfe06ba3d64 183 void common_rtc_free()
AnnaBridge 188:bcfe06ba3d64 184 {
AnnaBridge 188:bcfe06ba3d64 185 nrf_rtc_task_trigger(COMMON_RTC_INSTANCE, NRF_RTC_TASK_STOP);
AnnaBridge 188:bcfe06ba3d64 186 nrf_rtc_int_disable(COMMON_RTC_INSTANCE, LP_TICKER_INT_MASK);
AnnaBridge 188:bcfe06ba3d64 187 NVIC_DisableIRQ(nrf_drv_get_IRQn(COMMON_RTC_INSTANCE));
AnnaBridge 188:bcfe06ba3d64 188
AnnaBridge 188:bcfe06ba3d64 189 m_common_rtc_enabled = false;
AnnaBridge 188:bcfe06ba3d64 190 }
AnnaBridge 188:bcfe06ba3d64 191
Anna Bridge 186:707f6e361f3e 192 void common_rtc_set_interrupt(uint32_t ticks_count, uint32_t cc_channel,
Anna Bridge 186:707f6e361f3e 193 uint32_t int_mask)
Anna Bridge 186:707f6e361f3e 194 {
Anna Bridge 186:707f6e361f3e 195 /* Set ticks value when interrupt should be fired.
Anna Bridge 186:707f6e361f3e 196 * Interrupt scheduling is performed in upper layers. */
Anna Bridge 186:707f6e361f3e 197
Anna Bridge 186:707f6e361f3e 198 core_util_critical_section_enter();
Anna Bridge 186:707f6e361f3e 199
AnnaBridge 187:0387e8f68319 200 /* Wrap ticks_count before comparisons. */
AnnaBridge 187:0387e8f68319 201 ticks_count = RTC_WRAP(ticks_count);
AnnaBridge 187:0387e8f68319 202
Anna Bridge 186:707f6e361f3e 203 /* COMPARE occurs when a CC register is N and the COUNTER value transitions from N-1 to N.
Anna Bridge 186:707f6e361f3e 204 * If the COUNTER is N, writing N+2 to a CC register is guaranteed to trigger a
Anna Bridge 186:707f6e361f3e 205 * COMPARE event at N+2.
Anna Bridge 186:707f6e361f3e 206 */
Anna Bridge 186:707f6e361f3e 207 const uint32_t now = nrf_rtc_counter_get(COMMON_RTC_INSTANCE);
Anna Bridge 186:707f6e361f3e 208
Anna Bridge 186:707f6e361f3e 209 if (now == ticks_count ||
Anna Bridge 186:707f6e361f3e 210 RTC_WRAP(now + 1) == ticks_count) {
AnnaBridge 187:0387e8f68319 211 ticks_count = RTC_WRAP(ticks_count + 2);
Anna Bridge 186:707f6e361f3e 212 }
Anna Bridge 186:707f6e361f3e 213
AnnaBridge 187:0387e8f68319 214 nrf_rtc_cc_set(COMMON_RTC_INSTANCE, cc_channel, ticks_count);
Anna Bridge 186:707f6e361f3e 215
Anna Bridge 186:707f6e361f3e 216 if (!nrf_rtc_int_is_enabled(COMMON_RTC_INSTANCE, int_mask)) {
Anna Bridge 186:707f6e361f3e 217 nrf_rtc_event_clear(COMMON_RTC_INSTANCE, LP_TICKER_EVENT);
Anna Bridge 186:707f6e361f3e 218 nrf_rtc_int_enable(COMMON_RTC_INSTANCE, int_mask);
Anna Bridge 186:707f6e361f3e 219 }
Anna Bridge 186:707f6e361f3e 220
Anna Bridge 186:707f6e361f3e 221 core_util_critical_section_exit();
Anna Bridge 186:707f6e361f3e 222 }
Anna Bridge 186:707f6e361f3e 223
Anna Bridge 186:707f6e361f3e 224 /* Since there is no SysTick on NRF51, the RTC1 channel 0 is used as an
Anna Bridge 186:707f6e361f3e 225 * alternative source of RTOS ticks.
Anna Bridge 186:707f6e361f3e 226 */
Anna Bridge 186:707f6e361f3e 227 #if defined(TARGET_MCU_NRF51822)
Anna Bridge 186:707f6e361f3e 228
Anna Bridge 186:707f6e361f3e 229 #include "mbed_toolchain.h"
Anna Bridge 186:707f6e361f3e 230
Anna Bridge 186:707f6e361f3e 231
Anna Bridge 186:707f6e361f3e 232 #define MAX_RTC_COUNTER_VAL ((1uL << RTC_COUNTER_BITS) - 1)
Anna Bridge 186:707f6e361f3e 233
Anna Bridge 186:707f6e361f3e 234 #ifndef RTC1_CONFIG_FREQUENCY
Anna Bridge 186:707f6e361f3e 235 #define RTC1_CONFIG_FREQUENCY 32678 // [Hz]
Anna Bridge 186:707f6e361f3e 236 #endif
Anna Bridge 186:707f6e361f3e 237
Anna Bridge 186:707f6e361f3e 238
Anna Bridge 186:707f6e361f3e 239
Anna Bridge 186:707f6e361f3e 240 void COMMON_RTC_IRQ_HANDLER(void)
Anna Bridge 186:707f6e361f3e 241 {
Anna Bridge 186:707f6e361f3e 242 if(!nrf_rtc_event_pending(COMMON_RTC_INSTANCE, OS_TICK_EVENT)) {
Anna Bridge 186:707f6e361f3e 243 common_rtc_irq_handler();
Anna Bridge 186:707f6e361f3e 244 }
Anna Bridge 186:707f6e361f3e 245 }
Anna Bridge 186:707f6e361f3e 246
Anna Bridge 186:707f6e361f3e 247 IRQn_Type mbed_get_m0_tick_irqn()
Anna Bridge 186:707f6e361f3e 248 {
Anna Bridge 186:707f6e361f3e 249 return SWI3_IRQn;
Anna Bridge 186:707f6e361f3e 250 }
Anna Bridge 186:707f6e361f3e 251
Anna Bridge 186:707f6e361f3e 252
Anna Bridge 186:707f6e361f3e 253 #endif // defined(TARGET_MCU_NRF51822)