| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- #ifndef _NRF_DELAY_H
- #define _NRF_DELAY_H
- #include "nrf.h"
- /**
- * @brief Function for delaying execution for number of microseconds.
- *
- * @note NRF52 has instruction cache and because of that delay is not precise.
- *
- * @param number_of_ms
- */
- /*lint --e{438, 522} "Variable not used" "Function lacks side-effects" */
- #if defined ( __CC_ARM )
- static __ASM void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
- {
- loop
- SUBS R0, R0, #1
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- #ifdef NRF52
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- #endif
- BNE loop
- BX LR
- }
- #elif defined ( __ICCARM__ )
- static void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
- {
- __ASM (
- "loop:\n\t"
- " SUBS R0, R0, #1\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- #ifdef NRF52
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- " NOP\n\t"
- #endif
- " BNE.n loop\n\t");
- }
- #elif defined ( _WIN32 ) || defined ( __unix ) || defined( __APPLE__ )
- __STATIC_INLINE void nrf_delay_us(uint32_t volatile number_of_us);
- #ifndef CUSTOM_NRF_DELAY_US
- __STATIC_INLINE void nrf_delay_us(uint32_t volatile number_of_us)
- {}
- #endif
- #elif defined ( __GNUC__ )
- static void __INLINE nrf_delay_us(uint32_t volatile number_of_us) __attribute__((always_inline));
- static void __INLINE nrf_delay_us(uint32_t volatile number_of_us)
- {
- register uint32_t delay __ASM ("r0") = number_of_us;
- __ASM volatile (
- #ifdef NRF51
- ".syntax unified\n"
- #endif
- "1:\n"
- " SUBS %0, %0, #1\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- #ifdef NRF52
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- " NOP\n"
- #endif
- " BNE 1b\n"
- #ifdef NRF51
- ".syntax divided\n"
- #endif
- : "+r" (delay));
- }
- #endif
- void nrf_delay_ms(uint32_t volatile number_of_ms);
- #endif
|