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 188:bcfe06ba3d64 1 /* mbed Microcontroller Library
AnnaBridge 188:bcfe06ba3d64 2 * Copyright (c) 2015-2016 Nuvoton
AnnaBridge 188:bcfe06ba3d64 3 *
AnnaBridge 188:bcfe06ba3d64 4 * Licensed under the Apache License, Version 2.0 (the "License");
AnnaBridge 188:bcfe06ba3d64 5 * you may not use this file except in compliance with the License.
AnnaBridge 188:bcfe06ba3d64 6 * You may obtain a copy of the License at
AnnaBridge 188:bcfe06ba3d64 7 *
AnnaBridge 188:bcfe06ba3d64 8 * http://www.apache.org/licenses/LICENSE-2.0
AnnaBridge 188:bcfe06ba3d64 9 *
AnnaBridge 188:bcfe06ba3d64 10 * Unless required by applicable law or agreed to in writing, software
AnnaBridge 188:bcfe06ba3d64 11 * distributed under the License is distributed on an "AS IS" BASIS,
AnnaBridge 188:bcfe06ba3d64 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
AnnaBridge 188:bcfe06ba3d64 13 * See the License for the specific language governing permissions and
AnnaBridge 188:bcfe06ba3d64 14 * limitations under the License.
AnnaBridge 188:bcfe06ba3d64 15 */
AnnaBridge 188:bcfe06ba3d64 16
AnnaBridge 188:bcfe06ba3d64 17 #include "nu_timer.h"
AnnaBridge 188:bcfe06ba3d64 18 #include "mbed_power_mgmt.h"
AnnaBridge 188:bcfe06ba3d64 19 #include "mbed_critical.h"
AnnaBridge 188:bcfe06ba3d64 20 #include "us_ticker_api.h"
AnnaBridge 188:bcfe06ba3d64 21 #include "mbed_assert.h"
AnnaBridge 188:bcfe06ba3d64 22
AnnaBridge 188:bcfe06ba3d64 23 void nu_countdown_init(struct nu_countdown_ctx_s *ctx, us_timestamp_t interval_us)
AnnaBridge 188:bcfe06ba3d64 24 {
AnnaBridge 188:bcfe06ba3d64 25 core_util_critical_section_enter();
AnnaBridge 188:bcfe06ba3d64 26 sleep_manager_lock_deep_sleep();
AnnaBridge 188:bcfe06ba3d64 27 ctx->_ticker_data = get_us_ticker_data();
AnnaBridge 188:bcfe06ba3d64 28 ctx->_interval_end_us = ticker_read_us(ctx->_ticker_data) + interval_us;
AnnaBridge 188:bcfe06ba3d64 29 ctx->_expired = false;
AnnaBridge 188:bcfe06ba3d64 30 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 31 }
AnnaBridge 188:bcfe06ba3d64 32
AnnaBridge 188:bcfe06ba3d64 33 bool nu_countdown_expired(struct nu_countdown_ctx_s *ctx)
AnnaBridge 188:bcfe06ba3d64 34 {
AnnaBridge 188:bcfe06ba3d64 35 core_util_critical_section_enter();
AnnaBridge 188:bcfe06ba3d64 36 if (! ctx->_expired) {
AnnaBridge 188:bcfe06ba3d64 37 ctx->_expired = ticker_read_us(ctx->_ticker_data) >= ctx->_interval_end_us;
AnnaBridge 188:bcfe06ba3d64 38 }
AnnaBridge 188:bcfe06ba3d64 39 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 40
AnnaBridge 188:bcfe06ba3d64 41 return ctx->_expired;
AnnaBridge 188:bcfe06ba3d64 42 }
AnnaBridge 188:bcfe06ba3d64 43
AnnaBridge 188:bcfe06ba3d64 44 void nu_countdown_free(struct nu_countdown_ctx_s *ctx)
AnnaBridge 188:bcfe06ba3d64 45 {
AnnaBridge 188:bcfe06ba3d64 46 core_util_critical_section_enter();
AnnaBridge 188:bcfe06ba3d64 47 sleep_manager_unlock_deep_sleep();
AnnaBridge 188:bcfe06ba3d64 48 core_util_critical_section_exit();
AnnaBridge 188:bcfe06ba3d64 49 }
AnnaBridge 188:bcfe06ba3d64 50
AnnaBridge 188:bcfe06ba3d64 51
AnnaBridge 188:bcfe06ba3d64 52 void nu_busy_wait_us(uint32_t us)
AnnaBridge 188:bcfe06ba3d64 53 {
AnnaBridge 188:bcfe06ba3d64 54 const uint32_t bits = us_ticker_get_info()->bits;
AnnaBridge 188:bcfe06ba3d64 55 const uint32_t mask = (1 << bits) - 1;
AnnaBridge 188:bcfe06ba3d64 56 MBED_ASSERT(us_ticker_get_info()->frequency == 1000000);
AnnaBridge 188:bcfe06ba3d64 57 uint32_t prev = us_ticker_read();
AnnaBridge 188:bcfe06ba3d64 58 while (1) {
AnnaBridge 188:bcfe06ba3d64 59 const uint32_t cur = us_ticker_read();
AnnaBridge 188:bcfe06ba3d64 60 const uint32_t elapsed = (cur - prev) & mask;
AnnaBridge 188:bcfe06ba3d64 61 if (elapsed > us) {
AnnaBridge 188:bcfe06ba3d64 62 break;
AnnaBridge 188:bcfe06ba3d64 63 }
AnnaBridge 188:bcfe06ba3d64 64 us -= elapsed;
AnnaBridge 188:bcfe06ba3d64 65 prev = cur;
AnnaBridge 188:bcfe06ba3d64 66 }
AnnaBridge 188:bcfe06ba3d64 67 }
AnnaBridge 188:bcfe06ba3d64 68
AnnaBridge 188:bcfe06ba3d64 69 /* Delay 4 cycles per round by hand-counting instruction cycles
AnnaBridge 188:bcfe06ba3d64 70 *
AnnaBridge 188:bcfe06ba3d64 71 * The delay function here is implemented by just hand-counting instruction cycles rather than preferred
AnnaBridge 188:bcfe06ba3d64 72 * H/W timer since it is to use in cases where H/W timer is not available. Usually, it can delay at least
AnnaBridge 188:bcfe06ba3d64 73 * 4-cycles per round.
AnnaBridge 188:bcfe06ba3d64 74 *
AnnaBridge 188:bcfe06ba3d64 75 * In modern pipeline core, plus flash performance and other factors, we cannot rely accurately on hand-
AnnaBridge 188:bcfe06ba3d64 76 * counting instruction cycles for expected delay cycles.
AnnaBridge 188:bcfe06ba3d64 77 */
AnnaBridge 188:bcfe06ba3d64 78 #if defined(__CC_ARM)
AnnaBridge 188:bcfe06ba3d64 79 MBED_NOINLINE
AnnaBridge 188:bcfe06ba3d64 80 __asm void nu_delay_cycle_x4(uint32_t rounds)
AnnaBridge 188:bcfe06ba3d64 81 {
AnnaBridge 188:bcfe06ba3d64 82 // AStyle should not format inline assembly
AnnaBridge 188:bcfe06ba3d64 83 // *INDENT-OFF*
AnnaBridge 188:bcfe06ba3d64 84 1
AnnaBridge 188:bcfe06ba3d64 85 #if !defined(__CORTEX_M0)
AnnaBridge 188:bcfe06ba3d64 86 NOP // 1 cycle
AnnaBridge 188:bcfe06ba3d64 87 #endif
AnnaBridge 188:bcfe06ba3d64 88 SUBS a1, a1, #1 // 1 cycle
AnnaBridge 188:bcfe06ba3d64 89 BCS %BT1 // 3 cycles(M0)/2 cycles(non-M0)
AnnaBridge 188:bcfe06ba3d64 90 BX lr
AnnaBridge 188:bcfe06ba3d64 91 // *INDENT-ON*
AnnaBridge 188:bcfe06ba3d64 92 }
AnnaBridge 188:bcfe06ba3d64 93 #elif defined (__ICCARM__)
AnnaBridge 188:bcfe06ba3d64 94 MBED_NOINLINE
AnnaBridge 188:bcfe06ba3d64 95 void nu_delay_cycle_x4(uint32_t rounds)
AnnaBridge 188:bcfe06ba3d64 96 {
AnnaBridge 188:bcfe06ba3d64 97 __asm volatile(
AnnaBridge 188:bcfe06ba3d64 98 "loop: \n"
AnnaBridge 188:bcfe06ba3d64 99 #if !defined(__CORTEX_M0)
AnnaBridge 188:bcfe06ba3d64 100 " NOP \n" // 1 cycle
AnnaBridge 188:bcfe06ba3d64 101 #endif
AnnaBridge 188:bcfe06ba3d64 102 " SUBS %0, %0, #1 \n" // 1 cycle
AnnaBridge 188:bcfe06ba3d64 103 " BCS.n loop\n" // 3 cycles(M0)/2 cycles(non-M0)
AnnaBridge 188:bcfe06ba3d64 104 : "+r"(rounds)
AnnaBridge 188:bcfe06ba3d64 105 :
AnnaBridge 188:bcfe06ba3d64 106 : "cc"
AnnaBridge 188:bcfe06ba3d64 107 );
AnnaBridge 188:bcfe06ba3d64 108 }
AnnaBridge 188:bcfe06ba3d64 109 #elif defined ( __GNUC__ ) || (defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))
AnnaBridge 188:bcfe06ba3d64 110 MBED_NOINLINE
AnnaBridge 188:bcfe06ba3d64 111 void nu_delay_cycle_x4(uint32_t rounds)
AnnaBridge 188:bcfe06ba3d64 112 {
AnnaBridge 188:bcfe06ba3d64 113 __asm__ volatile(
AnnaBridge 188:bcfe06ba3d64 114 "%=:\n\t"
AnnaBridge 188:bcfe06ba3d64 115 #if !defined(__CORTEX_M0)
AnnaBridge 188:bcfe06ba3d64 116 "NOP\n\t" // 1 cycle
AnnaBridge 188:bcfe06ba3d64 117 #endif
AnnaBridge 188:bcfe06ba3d64 118 #if defined(__thumb__) && !defined(__thumb2__) && !defined(__ARMCC_VERSION)
AnnaBridge 188:bcfe06ba3d64 119 "SUB %0, #1\n\t" // 1 cycle
AnnaBridge 188:bcfe06ba3d64 120 #else
AnnaBridge 188:bcfe06ba3d64 121 "SUBS %0, %0, #1\n\t" // 1 cycle
AnnaBridge 188:bcfe06ba3d64 122 #endif
AnnaBridge 188:bcfe06ba3d64 123 "BCS %=b\n\t" // 3 cycles(M0)/2 cycles(non-M0)
AnnaBridge 188:bcfe06ba3d64 124 : "+l"(rounds)
AnnaBridge 188:bcfe06ba3d64 125 :
AnnaBridge 188:bcfe06ba3d64 126 : "cc"
AnnaBridge 188:bcfe06ba3d64 127 );
AnnaBridge 188:bcfe06ba3d64 128 }
AnnaBridge 188:bcfe06ba3d64 129 #endif