stm32中的Void delay_us();中的 。

stm32中的Void delay_us();中的 。,第1张

解17-11是DO——while循环,先执行 循环体一次 再判断停止条件。11行中temp&0x01是满足SysTick->CTRL为0X01,即开始倒数;&& 是与指令,就是前后两个条件要同时满足时,才为1;!(temp&(1<<16))这个是SysTick->CTRL的16位,当SysTick已经数到0时,则该位为1,当该位为1时,!(temp&(1<<16))就变为0,此时(temp&0x01)&&!(temp&(1<<16))为0,就退出循环体,去执行SysTick->CTRL=0x00; //关闭计数器
解2。SysTick都是24位的。只是只用到0,1,2,16位,
解3这个是TICK本身的自减,也就是倒数,不用我们再用像减一这样的指令去实现。
解4放在LOAD里面啊
解5,16位解释在解1里就有了。

延迟要用汇编来算,不能用C源代码来算……而且实际消耗的时间取决于编译结果。

例如在我的机器上这个内循环编译为

每次循环需要5个指令周期,重复12000次就是大约60000个指令周期。

也就是说对于我的平台和编译环境而言,这个软延时的初值应当是14400而不是12000。

你指的计时和定时应该是要用在从一个标志开始计时到另一个标志停止计时,或者从现在开始定时一个精确时间t,以执行某个动作?
如果是这样,只能用硬件定时器来实现, *** 作系统里用在延时的计时都是根据自己的节拍为参考的,你可以用tick count来获取两次时刻的节拍数差来获取时间,但是这样的话到达某一时间并不能促使你的动作发生,需要你自己不停去检测。

systick定时器有两个可选的时钟源,一个是外部时钟源(STCLK,等于HCLK/8),另一个是内核时钟(FCLK,等于HCLK)。假若你选择内核时钟,并将HCLK频率设置为72MHz的话,系统时钟周期为1/(72M);systick有一个24位的递减计数器,每个系统时钟周期计数器值减一,那么当计数器减到零时,时间经过了:系统时钟周期计数器初值。当你将计数器初值设为72000时(有些例程里面设为71999,其实没什么影响,误差极小),当计数器值减到0时经过了1/(72M)72000=0001s,即1ms。你可以看一下芯达STM32的入门教程和《ARM Cortex-M3权威指南》的相关章节,里面关于systick编程的一章说的比较详细,但是也有个别地方说的比较模糊,总之多看些例程就明白了,刚开始总是很纠结的~

void Delay(__IO u32 nCount)
是一个带形参的函数,使用的时候如void Delay(5000),就是5000自减,减到0为止。for(; nCount != 0; nCount--);
也就是for(nCount=0; nCount != 0; nCount--);

stm32的时钟频率,如果是103这个级别的,大概最高就是时钟为72Mhz,那么就是一个时钟周期为 1/72 000 000 约为 13ns,,那么要实现10ns准确延时,理论上


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13364576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-22
下一篇 2023-07-22

发表评论

登录后才能评论

评论列表(0条)

保存