nrf_delay.h 3.9 KB

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