OpenEdv-开源电子网

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

菜鸟求助关于delay_us 函数

[复制链接]

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-5-7
在线时间
5 小时
发表于 2012-5-20 20:01:04 | 显示全部楼层 |阅读模式
昨天板子刚到家,今天看到了延时这里!

delay_us 函数
该函数用来延时指定的 us,其参数 nus 为要延时的微秒数。具体函数如下:
//延时 us                                                                
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;              //清空计数器
}

请问temp=SysTick->CTRL; 这句话有何意义吗
还有while(temp&0x01&&!(temp&(1<<16)));是不是只能执行一次就结束了!



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-20 20:40:00 | 显示全部楼层
回复【楼主位】wgsxsm:
---------------------------------
1,读取CTRL的值.
2,不是.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-5-7
在线时间
5 小时
 楼主| 发表于 2012-5-20 21:27:49 | 显示全部楼层
        do
        {
                temp=SysTick->CTRL;         }
        while(temp&0x01&&!(temp&(1<<16)));

那是不是说上述语句执行完毕,时间刚、刚好到了1us呢?
谢谢原子
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-21 01:05:07 | 显示全部楼层
到达延迟时间就会自动退出的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2012-5-24
在线时间
0 小时
发表于 2012-5-25 08:47:46 | 显示全部楼层
SysTick.CTRL第16位功能是:当SysTick已经到0,读取时,此位为1,&(1<<16)后结果为1。
或者关闭SysTick的使能位,则temp&0x01为0 。
当两个条件满足任意条件,跳出循环
但是有一点我不知道:结构体类型SysTick中所有寄存器意思如果不在例说STM32书上面看到。在哪份资料可以查询这些寄存器的意思以及如何设定,谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-25 09:06:54 | 显示全部楼层
回复【5楼】Dennise:
---------------------------------
<<CM3权威指南>>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

7

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2013-3-1
在线时间
3 小时
发表于 2013-3-1 21:58:31 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
do 
        { 
                temp=SysTick->CTRL;         } 
        while(temp&0x01&&!(temp&(1<<16)));
这个循环执行一遍的时间是不是远小于1us呢?不然感觉延时就不是很准了。。
还有,会不会有这种情况:循环体执行完以后条件判断以前,属于这个程序的时间片用完了,本程序挂起,在这期间systick倒数回0了?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-2 00:18:43 | 显示全部楼层
延时1us的时候,大概是2.多us,延时太小,当然不是很准了.调用函数,执行语句都需要时间的.
不过在一个可以接受的范围内,就没问题.
是的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-24 11:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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