一个精确延迟,通过计算每条指令的周期来得到的延时,STM32F107上用示波器测试过,误差应该不会超过
10个周期。
/***************************************************************
根据Cortex-M3的技术参考手册关于的指令周期的说明,
subs r0,r0,#4 这个4就可以了,但是在STM32F107中只有在RAM中运行才是正确的
在FLASH中运行,FLASH取指延迟加大了指令周期,经测试需要减去6对
****************************************************************/
__asm void IDelayLoop(INT32 count)
{
L1 subs r0, r0, #6 ;; 1 周期
bgt L1 ;; 3 周期跳转1周期不跳转
BX lr ;; 3周期
}
void TimeSleepMicroSeconds( UINT32 uSec )
{
uSec *= (SYSTEM_CYCLE_CLOCK_HZ / ONE_MHZ);
int iterations = (int)uSec - 5;
IDelayLoop(iterations);
} |