STM32delay函数单片机delay延时函数如何计算

STM32延时函数_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32延时函数
&&STM32延时函数。
阅读已结束,下载本文需要
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢单片机delay函数精确延时计算 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
单片机delay函数精确延时计算
19:22:35  
14931&查看
还在delay函数初始值大小设置而延时多少时间烦恼吗?该小软件帮你忙!
经本人用keil c 软件仿真测试过,该程序计算时间准确。
之所以做这个软件是看了鸿哥的DS18B20的程序,由于很多芯片像DS18B20那样需要比较精确的延时,比如DS18B20复位时低电平好像要持续大约480us~960us,然后切换,读字节和写字节也要精确延时,所以如果不知道delay()函数延时多久,可能会对调试和项目的完成时间会有所延长。
所以我做了这个小软件,方便大家。如果软件打不开,请安装.net framework 3.5。
函数格式请严格如下
void delay()
& & unsigned char x,y,z;
& & for(x = ? x & 0 ; x--)
& && &&&for(y = ? y & 0 ; y--)
& && && && &for(z = ? z & 0 ; z--);
如果软件有什么bug或不对的地方请大家提出,本人会及时修正。
本软件为测试版本,更多功能会在以后加上去的。
这是本人的处女主题,如果大家觉得有用,顶顶吧,呵呵。
19:13 上传
点击文件名下载附件
下载积分: 积分 -1 分
6.63 KB, 下载次数: 551, 下载积分: 积分 -1 分
23:56:07  
···自己顶下,刚翻的贴就不知道沉到哪里去了
23:57:21  
这个不太实用,不同的单片机,执行每条语句的时间不一样,这个不是很实用,不过对于发资料的哥们,支持,顶!加油!
00:26:49  
这个不太实用,不同的单片机,执行每条语句的时间不一样,这个不是很实用,不过对于发资料的哥们,支持,顶 ...
不同的单片机可以得出不同值的啊,所以你要1Ms的延时,对于12M的51单片机,x,y,z的值是46,152,70
你可以选其他类型的单片机,其他的晶振值,比如我选4M的8位Pic, 那只要2 ,99 ,1 也可以1ms的延时啊,针对不同的单片机,也就这几个值不同的
程序都可以算出对于不同类型的单片机,代入这几个值后的延时是多少
08:53:40  
不同的单片机可以得出不同值的啊,所以你要1Ms的延时,对于12M的51单片机,x,y,z的值是46,152,70
那挺不错的,不过我在KEIL里搞FOR延时,时间有点误差,可能是自己能力不足,有些细节没有考虑到,支持楼主,顶!
高级工程师
09:48:05  
谢谢楼主分享好资料,先收藏了。 学习交流
19:15:12  
谢谢支持,你们的支持是我前进的动力
11:12:01  
谢谢分享了,本人刚开始学,问题很多,望大家帮助
20:36:04  
为毛不行啊。。。。。浪费一分
13:05:40  
唐辉电子,深耕晶振行业15年,非常专业,行业公认!
唐辉电子 官网上,有很多晶振使用、搭配、常见故障分析等方面的技术文档,欢迎分享。
真诚地希望和各位研发工程师长期互动、交友、携手进步。
32.768KHZ晶振,直插,贴片各种型号的,8M的,11.0592M,我司手里有现货,
少许样品,可免费给您。
(4.5 KB, 下载次数: 12)
13:05 上传
(4.67 KB, 下载次数: 7)
13:05 上传
(4.2 KB, 下载次数: 11)
13:05 上传
(72.06 KB, 下载次数: 11)
13:05 上传
(123.81 KB, 下载次数: 11)
13:05 上传
(45.27 KB, 下载次数: 12)
13:05 上传
(83.99 KB, 下载次数: 6)
13:05 上传
12:07:31  
& && && && && && && &太好了,谢谢了
09:05:21  
谢谢!!!!!!!!!!!!!!!!
14:12:30  
感谢楼主的大力分享
19:23:50  
& & 太好了,谢谢了
23:14:10  
精确延时用定时器中断靠谱
15:24:17  
感谢楼主,楼主辛苦!
助理工程师
17:49:47  
单片机delay函数精确延时计算
09:35:58  
10:11:08  
感谢楼主的分享!
10:11:12  
感谢楼主的分享!
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司stm32中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_msvoid 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; //清空计数器}//延时nusvoid 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递减。实现延时voidSysTick_Handler(void){if(time_delay)time_delay--;
采纳率:95%
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 3518|回复: 8
分享一种实现高精度软件延时的方法,任何单片机通用
帖子主题金币
本帖最后由 飞鸿踏雪 于
13:56 编辑
这里不讨论软件延时的优缺点,有时候程序里面总会用到,这里介绍一种如何实现高精度延时的方法。
1,先实现一个简单的延时程序,代码如下:
[C] 纯文本查看 复制代码void delay_us(uint32_t N)
volatile int cycleCount = N*1.0;
while(cycleCount--);
2,分析这段代码,调用它延时的时间主要由循环N次所花时间和调用该函数本身所花时间组成,比如循环一次需要花费时间K,调用一次需要花费时间B,那么调用该函数延时的时间为:
T = K*N + B
3,有2步的公式可知,只要我们知道了K和B,那么就能通过传入的N精确的计算出延时时间T,上面是一个一元一次方程,只要我们能有两组等式即可算出K和B。
4,有两种办法可得出等式,一是软件仿真法,另外一种是实测法,比如程序里面调用delay_us(50),delay_us(100)可以分别得出调用两个函数所花具体时间,比如为T1,T2,当然还可以通过控制单片机引脚翻转的方式来测量出两个延时的具体时间,不过这种方式会有一点误差,也就是控制单片机引脚翻转所花时间,一般来说这个时间很短,可以忽略,若不能忽略,那么最终我们也可以通过B参数进行修正。
5,得出T1和T2后,我们得出如下一个方程组:
T1 = 50*K + B
T2 = 100*K + B
解方程组可得:
K = (T2-T1)/50
B = 2*T1 - T2
在我的单片机上,T1 = 3.05,T2 = 4.55,所以算出 K = 0.03,B = 1.55
那么我调用这个延时函数所花的时间即为(N为该函数传入的参数):
T = K*N + B = 0.03*N + 1.55
但是我现在想传入的参数为时间参数,比如是多少微妙,这里就需要换算下:
N = (T-1.55)/0.03 = (100*T - 155)/3
之前的那个延时函数就变成了:
[C] 纯文本查看 复制代码void delay_us(uint32_t usec)
volatile int cycleCount = (100*usec-155)/3;
while(cycleCount--);
这个就是我们最终得出的延时函数,前面提到,有可能会因为测量的方式导致有些误差,这里就可以对误差进行修正,也就是对B进行修正,比如上面函数的参数155,我实际使用情况下就调整到了160,主要是因为我是通过引脚翻转的方式来测量时间的,而调用引脚翻转的函数消耗的部分时间,所以我这里做了一些修正。
用此方法实现的延时函数精度非常高,而且线性度非常好,实际测试效果非常不错;
为了减少因为中断函数导致的延时不准的问题,可以在调用延时函数的时候把中断关闭,如此延时就更加准确了!
gongluyanshisheying_5166726.jpg (122.67 KB, 下载次数: 0)
13:56 上传
人生到处知何似,应似飞鸿踏雪泥。
帖子主题金币
volatile int cycleCount = N*1.0;
volatile int cycleCount = (100*usec-155)/3;
计算这两个初始值所化 ...
一个是算时间前的,一个是根据具体的时间算出来的具体参数,所以不一样,为防止编译器优化,尽量保留volatile
人生到处知何似,应似飞鸿踏雪泥。
帖子主题金币
最近在进一步测试,发现单片机的主频较高的时候精度还可以,主频低的时候精度就不行了,所以建议在能使用定时器的时候尽量使用定时器...
人生到处知何似,应似飞鸿踏雪泥。
帖子主题金币
注册会员, 积分 65, 距离下一级还需 135 积分
注册会员, 积分 65, 距离下一级还需 135 积分
要求精度不高的时候,还是可以用的。
帖子主题金币
新手上路, 积分 24, 距离下一级还需 26 积分
新手上路, 积分 24, 距离下一级还需 26 积分
看看了。。。
帖子主题金币
注册会员, 积分 75, 距离下一级还需 125 积分
注册会员, 积分 75, 距离下一级还需 125 积分
还是耐心开完了
帖子主题金币
中级会员, 积分 213, 距离下一级还需 287 积分
中级会员, 积分 213, 距离下一级还需 287 积分
帖子主题金币
注册会员, 积分 121, 距离下一级还需 79 积分
注册会员, 积分 121, 距离下一级还需 79 积分
需要学习一下。。。。。。。
Powered bySTM32延时函数的三种方法——最好掌握第三种
单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时和毫秒级。
普通延时法
这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。下面的代码是在网上搜到的,经测试延时比较精准。
粗延时函数,微秒自己定义毫秒级的延时自己定义
定时器延时
内核的处理器,内部包含了一个定时器,是一个位的倒计数定时器,当计到时,将从寄存器中自动重装载定时初值。只要不把它在
控制及状态寄存器中的使能位清除,就永不停息。在的参考手册里面介绍的很简单,其详细介绍,请参阅《权威指南》。
这里面也有两种方式实现:
如下,定义延时时间,定义中断时间段,在中断中递减,从而实现延时。
延时时间,注意定义为全局变量延时分频的系统时钟中断读取定时时间关闭计数器清空计数器延时分频的系统时钟中断读取定时时间关闭计数器清空计数器
在中断中将递减。实现延时
非中断方式
主要仿照原子的《不完全手册》。的时钟固定为时钟的,在这里我们选用内部时钟源,所以的时钟为,即定时器以的频率递减。主要包含、、、等个寄存器,
如果在上次读本寄存器后已为,则该位为,若读该位自动清零
:外部时钟源:内部时钟
:减到无动作;:减到产生异常请求
定时器使能位
减到时被重新装载的值
读取时返回当前倒计数的值,写则清零,同时还会清除在控制及状态寄存器中的标志
不常用,在这里我们也用不到,故不介绍了。
程序如下,相当于查询法。
仿原子延时,不进入中断清空计数器使能,减到零是无动作,采用外部时钟源读取当前倒计数值等待时间到达关闭计数器清空计数器清空计数器使能,减到零是无动作,采用外部时钟源读取当前倒计数值等待时间到达关闭计数器清空计数器
三种方式各有利弊,第一种方式容易理解,但不太精准。第二种方式采用库函数,编写简单,由于中断的存在,不利于在其他中断中调用此延时函数。第三种方式直接操作寄存器,看起来比较繁琐,其实也不难,同时克服了以上两种方式的缺点,个人感觉比较好用。
没有更多推荐了,

我要回帖

更多关于 单片机delay延时函数 的文章

 

随机推荐