Nordic nrf51 sdk sources. Mirrored from https://github.com/ARMmbed/nrf51-sdk.

Dependents:   nRF51822 nRF51822

Committer:
vcoubard
Date:
Thu Apr 07 17:37:56 2016 +0100
Revision:
28:041dac1366b2
Child:
29:286940b7ee5a
Synchronized with git rev 012b8118
Author: Liyou Zhou
Pull in files from sdk 10.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vcoubard 28:041dac1366b2 1 #ifndef _NRF_DELAY_H
vcoubard 28:041dac1366b2 2 #define _NRF_DELAY_H
vcoubard 28:041dac1366b2 3
vcoubard 28:041dac1366b2 4 #include "nrf.h"
vcoubard 28:041dac1366b2 5
vcoubard 28:041dac1366b2 6 /**
vcoubard 28:041dac1366b2 7 * @brief Function for delaying execution for number of microseconds.
vcoubard 28:041dac1366b2 8 *
vcoubard 28:041dac1366b2 9 * @note NRF52 has instruction cache and because of that delay is not precise.
vcoubard 28:041dac1366b2 10 *
vcoubard 28:041dac1366b2 11 * @param number_of_ms
vcoubard 28:041dac1366b2 12 */
vcoubard 28:041dac1366b2 13 /*lint --e{438, 522} "Variable not used" "Function lacks side-effects" */
vcoubard 28:041dac1366b2 14 #if defined ( __CC_ARM )
vcoubard 28:041dac1366b2 15
vcoubard 28:041dac1366b2 16 static __ASM void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
vcoubard 28:041dac1366b2 17 {
vcoubard 28:041dac1366b2 18 loop
vcoubard 28:041dac1366b2 19 SUBS R0, R0, #1
vcoubard 28:041dac1366b2 20 NOP
vcoubard 28:041dac1366b2 21 NOP
vcoubard 28:041dac1366b2 22 NOP
vcoubard 28:041dac1366b2 23 NOP
vcoubard 28:041dac1366b2 24 NOP
vcoubard 28:041dac1366b2 25 NOP
vcoubard 28:041dac1366b2 26 NOP
vcoubard 28:041dac1366b2 27 NOP
vcoubard 28:041dac1366b2 28 NOP
vcoubard 28:041dac1366b2 29 NOP
vcoubard 28:041dac1366b2 30 NOP
vcoubard 28:041dac1366b2 31 NOP
vcoubard 28:041dac1366b2 32 #ifdef NRF52
vcoubard 28:041dac1366b2 33 NOP
vcoubard 28:041dac1366b2 34 NOP
vcoubard 28:041dac1366b2 35 NOP
vcoubard 28:041dac1366b2 36 NOP
vcoubard 28:041dac1366b2 37 NOP
vcoubard 28:041dac1366b2 38 NOP
vcoubard 28:041dac1366b2 39 NOP
vcoubard 28:041dac1366b2 40 NOP
vcoubard 28:041dac1366b2 41 NOP
vcoubard 28:041dac1366b2 42 NOP
vcoubard 28:041dac1366b2 43 NOP
vcoubard 28:041dac1366b2 44 NOP
vcoubard 28:041dac1366b2 45 NOP
vcoubard 28:041dac1366b2 46 NOP
vcoubard 28:041dac1366b2 47 NOP
vcoubard 28:041dac1366b2 48 NOP
vcoubard 28:041dac1366b2 49 NOP
vcoubard 28:041dac1366b2 50 NOP
vcoubard 28:041dac1366b2 51 NOP
vcoubard 28:041dac1366b2 52 NOP
vcoubard 28:041dac1366b2 53 NOP
vcoubard 28:041dac1366b2 54 NOP
vcoubard 28:041dac1366b2 55 NOP
vcoubard 28:041dac1366b2 56 NOP
vcoubard 28:041dac1366b2 57 NOP
vcoubard 28:041dac1366b2 58 NOP
vcoubard 28:041dac1366b2 59 NOP
vcoubard 28:041dac1366b2 60 NOP
vcoubard 28:041dac1366b2 61 NOP
vcoubard 28:041dac1366b2 62 NOP
vcoubard 28:041dac1366b2 63 NOP
vcoubard 28:041dac1366b2 64 NOP
vcoubard 28:041dac1366b2 65 NOP
vcoubard 28:041dac1366b2 66 NOP
vcoubard 28:041dac1366b2 67 NOP
vcoubard 28:041dac1366b2 68 NOP
vcoubard 28:041dac1366b2 69 NOP
vcoubard 28:041dac1366b2 70 NOP
vcoubard 28:041dac1366b2 71 NOP
vcoubard 28:041dac1366b2 72 NOP
vcoubard 28:041dac1366b2 73 NOP
vcoubard 28:041dac1366b2 74 NOP
vcoubard 28:041dac1366b2 75 NOP
vcoubard 28:041dac1366b2 76 NOP
vcoubard 28:041dac1366b2 77 #endif
vcoubard 28:041dac1366b2 78 BNE loop
vcoubard 28:041dac1366b2 79 BX LR
vcoubard 28:041dac1366b2 80 }
vcoubard 28:041dac1366b2 81
vcoubard 28:041dac1366b2 82 #elif defined ( __ICCARM__ )
vcoubard 28:041dac1366b2 83
vcoubard 28:041dac1366b2 84 static void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
vcoubard 28:041dac1366b2 85 {
vcoubard 28:041dac1366b2 86 __ASM (
vcoubard 28:041dac1366b2 87 "loop:\n\t"
vcoubard 28:041dac1366b2 88 " SUBS R0, R0, #1\n\t"
vcoubard 28:041dac1366b2 89 " NOP\n\t"
vcoubard 28:041dac1366b2 90 " NOP\n\t"
vcoubard 28:041dac1366b2 91 " NOP\n\t"
vcoubard 28:041dac1366b2 92 " NOP\n\t"
vcoubard 28:041dac1366b2 93 " NOP\n\t"
vcoubard 28:041dac1366b2 94 " NOP\n\t"
vcoubard 28:041dac1366b2 95 " NOP\n\t"
vcoubard 28:041dac1366b2 96 " NOP\n\t"
vcoubard 28:041dac1366b2 97 " NOP\n\t"
vcoubard 28:041dac1366b2 98 " NOP\n\t"
vcoubard 28:041dac1366b2 99 " NOP\n\t"
vcoubard 28:041dac1366b2 100 " NOP\n\t"
vcoubard 28:041dac1366b2 101 #ifdef NRF52
vcoubard 28:041dac1366b2 102 " NOP\n\t"
vcoubard 28:041dac1366b2 103 " NOP\n\t"
vcoubard 28:041dac1366b2 104 " NOP\n\t"
vcoubard 28:041dac1366b2 105 " NOP\n\t"
vcoubard 28:041dac1366b2 106 " NOP\n\t"
vcoubard 28:041dac1366b2 107 " NOP\n\t"
vcoubard 28:041dac1366b2 108 " NOP\n\t"
vcoubard 28:041dac1366b2 109 " NOP\n\t"
vcoubard 28:041dac1366b2 110 " NOP\n\t"
vcoubard 28:041dac1366b2 111 " NOP\n\t"
vcoubard 28:041dac1366b2 112 " NOP\n\t"
vcoubard 28:041dac1366b2 113 " NOP\n\t"
vcoubard 28:041dac1366b2 114 " NOP\n\t"
vcoubard 28:041dac1366b2 115 " NOP\n\t"
vcoubard 28:041dac1366b2 116 " NOP\n\t"
vcoubard 28:041dac1366b2 117 " NOP\n\t"
vcoubard 28:041dac1366b2 118 " NOP\n\t"
vcoubard 28:041dac1366b2 119 " NOP\n\t"
vcoubard 28:041dac1366b2 120 " NOP\n\t"
vcoubard 28:041dac1366b2 121 " NOP\n\t"
vcoubard 28:041dac1366b2 122 " NOP\n\t"
vcoubard 28:041dac1366b2 123 " NOP\n\t"
vcoubard 28:041dac1366b2 124 " NOP\n\t"
vcoubard 28:041dac1366b2 125 " NOP\n\t"
vcoubard 28:041dac1366b2 126 " NOP\n\t"
vcoubard 28:041dac1366b2 127 " NOP\n\t"
vcoubard 28:041dac1366b2 128 " NOP\n\t"
vcoubard 28:041dac1366b2 129 " NOP\n\t"
vcoubard 28:041dac1366b2 130 " NOP\n\t"
vcoubard 28:041dac1366b2 131 " NOP\n\t"
vcoubard 28:041dac1366b2 132 " NOP\n\t"
vcoubard 28:041dac1366b2 133 " NOP\n\t"
vcoubard 28:041dac1366b2 134 " NOP\n\t"
vcoubard 28:041dac1366b2 135 " NOP\n\t"
vcoubard 28:041dac1366b2 136 " NOP\n\t"
vcoubard 28:041dac1366b2 137 " NOP\n\t"
vcoubard 28:041dac1366b2 138 " NOP\n\t"
vcoubard 28:041dac1366b2 139 " NOP\n\t"
vcoubard 28:041dac1366b2 140 " NOP\n\t"
vcoubard 28:041dac1366b2 141 " NOP\n\t"
vcoubard 28:041dac1366b2 142 " NOP\n\t"
vcoubard 28:041dac1366b2 143 " NOP\n\t"
vcoubard 28:041dac1366b2 144 " NOP\n\t"
vcoubard 28:041dac1366b2 145 " NOP\n\t"
vcoubard 28:041dac1366b2 146 " NOP\n\t"
vcoubard 28:041dac1366b2 147 #endif
vcoubard 28:041dac1366b2 148 " BNE.n loop\n\t");
vcoubard 28:041dac1366b2 149 }
vcoubard 28:041dac1366b2 150
vcoubard 28:041dac1366b2 151 #elif defined ( _WIN32 ) || defined ( __unix ) || defined( __APPLE__ )
vcoubard 28:041dac1366b2 152
vcoubard 28:041dac1366b2 153 __STATIC_INLINE void nrf_delay_us(uint32_t volatile number_of_us);
vcoubard 28:041dac1366b2 154
vcoubard 28:041dac1366b2 155 #ifndef CUSTOM_NRF_DELAY_US
vcoubard 28:041dac1366b2 156 __STATIC_INLINE void nrf_delay_us(uint32_t volatile number_of_us)
vcoubard 28:041dac1366b2 157 {}
vcoubard 28:041dac1366b2 158 #endif
vcoubard 28:041dac1366b2 159
vcoubard 28:041dac1366b2 160 #elif defined ( __GNUC__ )
vcoubard 28:041dac1366b2 161
vcoubard 28:041dac1366b2 162 static void __INLINE nrf_delay_us(uint32_t volatile number_of_us) __attribute__((always_inline));
vcoubard 28:041dac1366b2 163 static void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
vcoubard 28:041dac1366b2 164 {
vcoubard 28:041dac1366b2 165 register uint32_t delay __ASM ("r0") = number_of_us;
vcoubard 28:041dac1366b2 166 __ASM volatile (
vcoubard 28:041dac1366b2 167 #ifdef NRF51
vcoubard 28:041dac1366b2 168 ".syntax unified\n"
vcoubard 28:041dac1366b2 169 #endif
vcoubard 28:041dac1366b2 170 "1:\n"
vcoubard 28:041dac1366b2 171 " SUBS %0, %0, #1\n"
vcoubard 28:041dac1366b2 172 " NOP\n"
vcoubard 28:041dac1366b2 173 " NOP\n"
vcoubard 28:041dac1366b2 174 " NOP\n"
vcoubard 28:041dac1366b2 175 " NOP\n"
vcoubard 28:041dac1366b2 176 " NOP\n"
vcoubard 28:041dac1366b2 177 " NOP\n"
vcoubard 28:041dac1366b2 178 " NOP\n"
vcoubard 28:041dac1366b2 179 " NOP\n"
vcoubard 28:041dac1366b2 180 " NOP\n"
vcoubard 28:041dac1366b2 181 " NOP\n"
vcoubard 28:041dac1366b2 182 " NOP\n"
vcoubard 28:041dac1366b2 183 " NOP\n"
vcoubard 28:041dac1366b2 184 #ifdef NRF52
vcoubard 28:041dac1366b2 185 " NOP\n"
vcoubard 28:041dac1366b2 186 " NOP\n"
vcoubard 28:041dac1366b2 187 " NOP\n"
vcoubard 28:041dac1366b2 188 " NOP\n"
vcoubard 28:041dac1366b2 189 " NOP\n"
vcoubard 28:041dac1366b2 190 " NOP\n"
vcoubard 28:041dac1366b2 191 " NOP\n"
vcoubard 28:041dac1366b2 192 " NOP\n"
vcoubard 28:041dac1366b2 193 " NOP\n"
vcoubard 28:041dac1366b2 194 " NOP\n"
vcoubard 28:041dac1366b2 195 " NOP\n"
vcoubard 28:041dac1366b2 196 " NOP\n"
vcoubard 28:041dac1366b2 197 " NOP\n"
vcoubard 28:041dac1366b2 198 " NOP\n"
vcoubard 28:041dac1366b2 199 " NOP\n"
vcoubard 28:041dac1366b2 200 " NOP\n"
vcoubard 28:041dac1366b2 201 " NOP\n"
vcoubard 28:041dac1366b2 202 " NOP\n"
vcoubard 28:041dac1366b2 203 " NOP\n"
vcoubard 28:041dac1366b2 204 " NOP\n"
vcoubard 28:041dac1366b2 205 " NOP\n"
vcoubard 28:041dac1366b2 206 " NOP\n"
vcoubard 28:041dac1366b2 207 " NOP\n"
vcoubard 28:041dac1366b2 208 " NOP\n"
vcoubard 28:041dac1366b2 209 " NOP\n"
vcoubard 28:041dac1366b2 210 " NOP\n"
vcoubard 28:041dac1366b2 211 " NOP\n"
vcoubard 28:041dac1366b2 212 " NOP\n"
vcoubard 28:041dac1366b2 213 " NOP\n"
vcoubard 28:041dac1366b2 214 " NOP\n"
vcoubard 28:041dac1366b2 215 " NOP\n"
vcoubard 28:041dac1366b2 216 " NOP\n"
vcoubard 28:041dac1366b2 217 " NOP\n"
vcoubard 28:041dac1366b2 218 " NOP\n"
vcoubard 28:041dac1366b2 219 " NOP\n"
vcoubard 28:041dac1366b2 220 " NOP\n"
vcoubard 28:041dac1366b2 221 " NOP\n"
vcoubard 28:041dac1366b2 222 " NOP\n"
vcoubard 28:041dac1366b2 223 " NOP\n"
vcoubard 28:041dac1366b2 224 " NOP\n"
vcoubard 28:041dac1366b2 225 " NOP\n"
vcoubard 28:041dac1366b2 226 " NOP\n"
vcoubard 28:041dac1366b2 227 " NOP\n"
vcoubard 28:041dac1366b2 228 " NOP\n"
vcoubard 28:041dac1366b2 229 " NOP\n"
vcoubard 28:041dac1366b2 230 " NOP\n"
vcoubard 28:041dac1366b2 231 #endif
vcoubard 28:041dac1366b2 232 " BNE 1b\n"
vcoubard 28:041dac1366b2 233 #ifdef NRF51
vcoubard 28:041dac1366b2 234 ".syntax divided\n"
vcoubard 28:041dac1366b2 235 #endif
vcoubard 28:041dac1366b2 236 : "+r" (delay));
vcoubard 28:041dac1366b2 237 }
vcoubard 28:041dac1366b2 238 #endif
vcoubard 28:041dac1366b2 239
vcoubard 28:041dac1366b2 240 void nrf_delay_ms(uint32_t volatile number_of_ms);
vcoubard 28:041dac1366b2 241
vcoubard 28:041dac1366b2 242 #endif