50us的stm32f103 延时1us常数怎么算的

C语言延时程序:
10ms延时子程序(12MHZ)
void delay10ms(void)
unsigned char i,j,k;
for(i=5;i&0;i--)
for(j=4;j&0;j--)
for(k=248;k&0;k--);
1s延时子程序(12MHZ)
void delay1s(void)
unsigned char h,i,j,k;
for(h=5;h&0;h--)
for(i=4;i&0;i--)
for(j=116;j&0;j--)
for(k=214;k&0;k--);
200ms延时子程序(12MHZ)
void delay200ms(void)
unsigned char i,j,k;
for(i=5;i&0;i--)
for(j=132;j&0;j--)
for(k=150;k&0;k--);
500ms延时子程序程序: (12MHZ)
void delay500ms(void)
unsigned char i,j,k;
for(i=15;i&0;i--)
for(j=202;j&0;j--)
for(k=81;k&0;k--);
在线时间39 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
求大神指点一下。。。
在线时间1398 小时
威望6274分
芯币21422枚
E金币300枚
TA的帖子TA的资源
本帖最后由 huo_hu 于
15:36 编辑
死循环延时不是个好方法有这么几个原因:
2:不同的单片机因为指令周期不同而不同
3:受中断影响,编译器的优化选项也要考虑
一定要的话软仿真能看到,应该是每条汇编时间和,包括函数调用和返回
在线时间611 小时
威望1099分
芯币7936枚
E金币280枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1099, 距离下一级还需 101 积分
纯净的硅(中级), 积分 1099, 距离下一级还需 101 积分
用_nop_() 把 ,它包含在&&intrins.h 里面,放在while或for 循环里面,至于延时多久用仿真看一下
dj的世界一直很好
在线时间1095 小时
威望1292分
芯币4399枚
E金币183枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1292, 距离下一级还需 708 积分
纯净的硅(高级), 积分 1292, 距离下一级还需 708 积分
楼主想问Delay函数实现的延时是怎样计算的是吗,看程序应该是51单片机的延时程序
以10ms延时子程序(12MHz)为例来分析一下(其它的类似)
void delay10ms(void)
unsigned char i,j,k;
for(i=5;i&0;i--)
for(j=4;j&0;j--)
for(k=248;k&0;k--);
这个程序有三层循环,循环的总次数为
Num=5*4*248=4960
每次循环都有一次条件判断(如“k&0”)和一次只减(如“k--”),即每次循环消耗两个机器周期
那么花费的总的机器周期即为
Sum=Num*2=9920
对于51单片机12M晶振的话一个周期是1us,那么延时时间
t=Sum*1us=9 920 us ≈ 10ms
这段程序有可能是精确延时到10ms,这是因为调用这个函数及执行完这个函数分别要压栈和出栈,另外i,j,k也有一个赋初值的过程...所以各种因素叠加到一起延时就是10ms了
其实楼上说的挺好的,如果你想看具体的延时过程可以仿真一下,在keil中对比C语言汇编前后的代码你会理解的更透彻
在线时间1290 小时
威望5386分
芯币7742枚
E金币1745枚
TA的帖子TA的资源
五彩晶圆(中级), 积分 5386, 距离下一级还需 614 积分
五彩晶圆(中级), 积分 5386, 距离下一级还需 614 积分
反汇编计算一下,应该准确一些
在线时间1398 小时
威望6274分
芯币21422枚
E金币300枚
TA的帖子TA的资源
本帖最后由 huo_hu 于
21:57 编辑
不同单片机指令周期参看
无标题.png (29.82 KB, 下载次数: 0)
21:56 上传
我去,出到6.69了,这是免安装版的么&
在线时间611 小时
威望1099分
芯币7936枚
E金币280枚
TA的帖子TA的资源
纯净的硅(中级), 积分 1099, 距离下一级还需 101 积分
纯净的硅(中级), 积分 1099, 距离下一级还需 101 积分
不同单片机指令周期参看
我去,出到6.69了,这是免安装版的么
dj的世界一直很好
论坛测评队员
EEWORLD 官方微信
Powered bystm32中Delay()函数延时的时间是怎么计算的
stm32中Delay()函数延时的时间是怎么计算的
百度知道知科技
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us(&& & & & & & & & & & & & & & & )和毫秒级delay_ms(&& & & & & & & & & & & & & & & )。1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。//粗延时函数,微秒& & & & & & & & & & & & & & & void delay_us(u16 time)& & & & & & & & & & & & & & & { & && & & & & & & & & & & & & & & & &u16 i=0; && & & & & & & & & & & & & & & & &while(time--)& & & & & & & & & & & & & & & & &{& & & & & & & & & & & & & & & & & & i=10; &//自己定义& & & & & & & & & & & & & & & & & & while(i--) ; & && & & & & & & & & & & & & & & & &}& & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & //毫秒级的延时& & & & & & & & & & & & & & & void delay_ms(u16 time)& & & & & & & & & & & & & & & { & && & & & & & & & & & & & & & & & &u16 i=0; && & & & & & & & & & & & & & & & &while(time--)& & & & & & & & & & & & & & & & &{& & & & & & & & & & & & & & & & & & i=12000; &//自己定义& & & & & & & & & & & & & & & & & & while(i--) ; & && & & & & & & & & & & & & & & & &}& & & & & & & & & & & & & & & }2.SysTick 定时器延时CM3 内核的处理器,内部包含了一个SysTick&& & & & & & & & & & & & & & & 定时器,SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD&& & & & & & & & & & & & & & & 寄存器中自动重装载定时初值。只要不把它在SysTick&& & & & & & & & & & & & & & & 控制及状态寄存器中的使能位清除,就永不停息。SysTick 在STM32&& & & & & & & & & & & & & & & 的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。&& & & & & & & & & & & & & & & 这里面也有两种方式实现:a.中断方式&& & & & & & & & & & & & & & & 如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。& & & & & & & & & & & & & & & volatile unsigned long time_ //&& & & & & & & & & & & & & & & 延时时间,注意定义为全局变量& & & & & & & & & & & & & & & //延时n_ms& & & & & & & & & & & & & & & void delay_ms(volatile unsigned long nms)& & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & //SYSTICK分频--1ms的系统时钟中断& & & & & & & & & & & & & & & & & if (SysTick_Config(SystemFrequency/1000))& & & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & & while (1);& & & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & & & time_delay=//读取定时时间& & & & & & & & & & & & & & & & & while(time_delay);& & & & & & & & & & & & & & & & & SysTick-&CTRL=0x00; //关闭计数器& & & & & & & & & & & & & & & & & SysTick-&VAL =0X00; //清空计数器& & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & //延时nus& & & & & & & & & & & & & & & void delay_us(volatile unsigned long nus)& & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & &//SYSTICK分频--1us的系统时钟中断& & & & & & & & & & & & & & & & & if (SysTick_Config(SystemFrequency/1000000))& & & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & & & & & while (1);& & & & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & & & time_delay=//读取定时时间& & & & & & & & & & & & & & & & & while(time_delay);& & & & & & & & & & & & & & & & & SysTick-&CTRL=0x00; //关闭计数器& & & & & & & & & & & & & & & & & SysTick-&VAL =0X00; //清空计数器& & & & & & & & & & & & & & & } & &//在中断中将time_delay递减。实现延时void&& & & & & & & & & & & & & & & SysTick_Handler(void)& & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & if(time_delay)& & & & & & & & & & & & & & & & & & & time_delay--;& & & & & & & & & & & & & & & }b.非中断方式主要仿照原子的《STM32不完全手册》。SYSTICK 的时钟固定为HCLK&& & & & & & & & & & & & & & & 时钟的1/8,在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。SysTick&& & & & & & & & & & & & & & & 主要包含CTRL、LOAD、VAL、CALIB 等4&& & & & & & & & & & & & & & & & 个寄存器,SysTick-&CTRL位段名称类型复位值描述& & & & & & & & & & & & & & & & 16COUNTFLAGR0如果在上次读本寄存器后systick已为0,则该位为1,若&& & & & & & & & & & & & & & & & 读该位自动清零& & & & & & & & & & & & & & & & 2CLKSOURCERW00:外部时钟源 1:内部时钟& & & & & & & & & & & & & & & & 1TICKINTRW00:减到0无动作;1:减到0产生systick异常请求& & & & & & & & & & & & & & & & 0ENABLERW0systick定时器使能位& & & & & & & & & & & & & & & & & && & & & & & & & & & & & & & & SysTick-& LOAD位段名称类型复位值描述& & & & & & & & & & & & & & & & 23:0RELOADRW0减到0时被重新装载的值& & & & & & & & & & & & & & & SysTick-& VAL位段名称类型复位值描述& & & & & & & & & & & & & & & & 23:0CURRENTRW0读取时返回当前倒计数的值,写则清零,同时还会清除在systick控制及状态寄存器中的COUNTFLAG&& & & & & & & & & & & & & & & & 标志& & & & & & & & & & & & & & & SysTick-& CALIB&& & & & & & & & & & & & & & & 不常用,在这里我们也用不到,故不介绍了。程序如下,相当于查询法。//仿原子延时,不进入systic中断& & & & & & & & & & & & & & & void delay_us(u32 nus)& & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & &u32& & & & & & & & & & & & & & & &SysTick-&LOAD = 9*& & & & & & & & & & & & & & & &SysTick-&VAL=0X00;//清空计数器& & & & & & & & & & & & & & & &SysTick-&CTRL=0X01;//使能,减到零是无动作,采用外部时钟源& & & & & & & & & & & & & & & &do& & & & & & & & & & & & & & & &{& & & & & & & & & & & & & & & & temp=SysTick-&CTRL;//读取当前倒计数值& & & & & & & & & & & & & & & &}while((temp&0x01)&&(!(temp&(1&&16))));//等待时间到达& & & & & & & & & & & & & & & & & &SysTick-&CTRL=0x00; //关闭计数器& & & & & & & & & & & & & & & & & SysTick-&VAL =0X00; //清空计数器& & & & & & & & & & & & & & & }& & & & & & & & & & & & & & & void delay_ms(u16 nms)& & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & &u32& & & & & & & & & & & & & & & &SysTick-&LOAD = 9000*& & & & & & & & & & & & & & & &SysTick-&VAL=0X00;//清空计数器& & & & & & & & & & & & & & & &SysTick-&CTRL=0X01;//使能,减到零是无动作,采用外部时钟源& & & & & & & & & & & & & & & &do& & & & & & & & & & & & & & & &{& & & & & & & & & & & & & & & & temp=SysTick-&CTRL;//读取当前倒计数值& & & & & & & & & & & & & & & &}while((temp&0x01)&&(!(temp&(1&&16))));//等待时间到达& & & & & & & & & & & & & & & & & SysTick-&CTRL=0x00; //关闭计数器& & & & & & & & & & & & & & & & & SysTick-&VAL =0X00; //清空计数器& & & & & & & & & & & & & & & }三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。(本文内容由百度知道网友凉念若櫻花妖娆贡献)
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
百度知道知科技
百家号 最近更新:
简介: 科技不神秘,知道君告诉你。
作者最新文章  很多初学者对于程序中ms级延时函数的编写方法比较疑惑,其原理和方式虽然简单,但是却没有相关资料。这里用一个例程详细介绍一下。
  过程参考如下:
  在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,的选择,因为for循环里指令的执行时间和晶振有直接关系,本例中晶振使用11.0592M。
&& & 编写一段关于延时的函数,主要利用for循环,代码如下:void delay_ms(unsigned int ms){& & for(i=0;i&i++)& & {& & & & for(j=0;j&200;j++);& & & & for(j=0;j&102;j++);& & }
& & &其中ms是输入参数,如果输入1,就是要求程序延时1ms。
  j变量是调整程序运行的时间参数。调整j的数值,使1次循环的时间在1ms。
  将此程序编译通过,然后利用软件仿真,调整时间。
两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j参数的值,使延时时间尽量接近1ms。如增大j的值for(j=0;j&105;j++);
  此方法得出延时函数,在晶振不同的情况下,延时时间会不准。另外这种方法不是完全精确的延时,所以不要太深研究误差的问题。软件调试结果,这个程序的延时时间为:1.01779ms,一般的单片机系统中都可以应用。
往下看有更多相关资料
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670& & &&)}

我要回帖

更多关于 c语言延时程序 ms us 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信