OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3085|回复: 2

问一个关于延时函数的问题

[复制链接]

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-8-2
在线时间
0 小时
发表于 2015-8-2 10:46:49 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void delay_us(u32 nus) { u32 temp; SysTick->LOAD=nus*fac_us; //时间加载 SysTick->VAL=0x00; //清空计数器 SysTick->CTRL=0x01 ; //开始倒数 do { temp=SysTick->CTRL; } while(temp&0x01&&!(temp&(1<<16)));//等待时间到达 SysTick->CTRL=0x00; //关闭计数器 SysTick->VAL =0X00; //清空计数器 }[/mw_shl_code]

我注意到,读取SysTick->VAL这个寄存器可以得到当前倒计数的值,于是我把上面的程序中的
do
{
temp=SysTick->CTRL;
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达


改成了
while (SysTick->VAL != 0);


然后烧入跑马灯的程序,结果出现了每次延时时间长短不一的延时,请问这样修改程序为何不对?

最佳答案

查看完整内容[请看2#楼]

我翻了翻M3权威指南这本书,对照了一下寄存器。 temp&0x01是TICKINT ,用于判断SysTick数到0时产生的异常请求 temp&(1<<16) 是COUNTFLAG,如果上次读取本寄存器后,SysTick已经计数到0,则该位为1,如果读取该位,清0. 这样写,能够在大范围里的时间也能判断是否已经到时间了,就算它到0了,已经过去了一两下,也能判断。 而你那种写法是要刚好判断时要达到0,可判断时间范围只有那个0的瞬间。 于是乎,你的那个判断 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2014-8-3
在线时间
0 小时
发表于 2015-8-2 10:46:50 | 显示全部楼层
我翻了翻M3权威指南这本书,对照了一下寄存器。
temp&0x01是TICKINT ,用于判断SysTick数到0时产生的异常请求
temp&(1<<16) 是COUNTFLAG,如果上次读取本寄存器后,SysTick已经计数到0,则该位为1,如果读取该位,清0.

这样写,能够在大范围里的时间也能判断是否已经到时间了,就算它到0了,已经过去了一两下,也能判断。
而你那种写法是要刚好判断时要达到0,可判断时间范围只有那个0的瞬间。
于是乎,你的那个判断,能否延时,就要看心情是否好到能见到抓到0,心情这东西,本来就不准.

以上皆是个人猜测,仅供参考~
电子技能就是我行走江湖时手中的利剑。
回复

使用道具 举报

8

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2015-8-2
在线时间
0 小时
 楼主| 发表于 2015-8-3 09:57:18 | 显示全部楼层
回复【2楼】腾飞:
---------------------------------
谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-18 22:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表