stm32ram等待时间
从现象上来说,确实是阻塞了CPU,
延时的目的就是让CPU停住一段时间。
systick嘀嗒定时器在延时的时候,一直判断标志位,用while语句,这样cpu就一直停在这里了,知道标志位置位,再跳出等待,这样就实现精准延时了。
void delayus(u32 x)
{
u32 i,j;
for(i=0;ix;i++)
for(j=0;j10;j++);
}
印象里这样大约是1us(没中断的情况下)。你可以采用定时器来测量函数大致的延时时间。
设置并,清计数器
开启定时器
进入函数
出函数后关闭定时器,读取计数器。观察用时。
__ASM("NOP");为1个机器周期,1/72M
T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK
定时器就可以完成了 T=(1+1)*(17+1)/72 = 0.5us
在与传感器或者模块的总线进行通信的时候,常常需要使用到精确延时,一般我们会封装几个常用延时函数。
SysTick是一个24位的倒计数定时器,当计到0时,将从RELOAD寄存器中自动重装载定时初值并继续计数,且同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。
在刚进入delay_us函数的时候,先计算好这段延时需要等待的SysTick计数次数,这里为50*9(假设系统时钟为72MHz,因为systick的频率为系统时钟频率的1/8,那么systick每增加1,就是1/9us),然后我们就一直读取SysTick-CTRL寄存器,当该寄存器bit16的值为1时,说明倒计时了50*9个SysTick,即说明延时50us时间到了。
stm32可以使用systick定时器来实现延时的功能,不需要这么写,具体可以看一下正点原子开发板的例程或者野火的。
如果非要这么写,也没关系。使用MDK软件设定好当前MCU的时钟频率,使用软件仿真,单独执行自己写的for循环延时,会在左边的寄存器窗口出现具体使用了多少时间,你可以根据这个情况修改for循环里的变量参数。
祝你成功
本文标签:stm32软件精准延时