239 lines
4.0 KiB
C
239 lines
4.0 KiB
C
#ifndef _NRF_DELAY_H
|
|
#define _NRF_DELAY_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__ )
|
|
|
|
inline static void nrf_delay_us(uint32_t volatile number_of_us) __attribute__((always_inline));
|
|
inline static void 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
|
|
|
|
#endif
|