OpenEdv-开源电子网

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

对Systick寄存器理解操作问题

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2011-1-12
在线时间
0 小时
发表于 2011-1-13 00:12:38 | 显示全部楼层 |阅读模式
 

最近看原子的开发板例程时遇到几个问题,


void delay_us(u32 nus)
{
u32 temp;      
SysTick->LOAD=nus*fac_us; //时间加载    
SysTick->VAL=0x00;        //清空计数器
SysTick->CTRL=0x01 ;      //开始倒数  
do
{
temp=SysTick->CTRL;(问题1:从上面红线框的理解,这里对CTRL读不是会把CTRL的第16位给清零掉吗,这样后面do-while循环判断条件!(temp&(1<<16))为真永远都挑不出循环了,怎么理解呢?)                                                                                  
}
while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   问题2:上面已经使能了CTRL的第0位那么temp&0x01是不是一直为1即为真而这一条件是多余的?直接判断条件可以改为while(!(temp&(1<<16)));

SysTick->CTRL=0x00;       //关闭计数器
SysTick->VAL =0X00;       //清空计数器 

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

使用道具 举报

10

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2010-12-20
在线时间
0 小时
发表于 2011-1-13 14:39:27 | 显示全部楼层
问题1,应该第16位是读取之后,硬件自动再清零,并不是读取的瞬间!所以读取到的temp的第16位为1,那么!(temp&(1<<16))为0.
问题2,可能是怕初始化时没有使能,而后面的!(temp&(1<<16))为真,跳不出while.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-1-13 15:05:48 | 显示全部楼层
谢谢  金色的梦想  的解答.
问题1:金色的回答已经很准确了.但楼主存在理解上的错误.这里读取CTRL的16位用于判断是否完成计数.注意这个第16位,是在计数时间到,才被硬件置1的,所以在没到达之前,一直是0.所以在完成之前,无论你读多少次都没关系了.
当计数时间到之后,该位被硬件置1,则肯定可以被读到一次(也只能被读一次).在读到该位为1之后,!(temp&1<<16)就为0了.从而退出do while循环.
所以,不存在你说的死循环.
问题2:这一步其实是防止CTRL的0位被意外的关闭,从而导致的死循环无法退出的问题.你去掉也是可以的.只要能保证CTRL没有被其他程序意外修改就可以.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

3

帖子

0

精华

新手入门

积分
31
金钱
31
注册时间
2011-1-12
在线时间
0 小时
 楼主| 发表于 2011-1-16 01:04:53 | 显示全部楼层

非常感谢楼上二位的细心解答,已经弄明白了。
对问题1:循环体内对temp赋值即是对CTRL的读,读后CTRL的第16位自动被清零,此清零在重新赋值前对temp的第16位无影响。
对问题2:拜读了原子的博客更清楚了

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 14:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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