OpenEdv-开源电子网

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

求大神帮解答关于SysTick中重装寄存器的问题

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2012-8-21
在线时间
0 小时
发表于 2012-8-21 06:35:20 | 显示全部楼层 |阅读模式
小弟昨晚在研究SysTick底层是如何被使用的时候,遇到了些问题,求各路大哥帮忙解答。
问题是这样,都知道SysTick是CM3里的东西,在STM32F10xxx Cortex-M3编程手册-英文版.pdf里面关于重装寄存器有这样
一段描述:

Bits 31:24 Reserved, must be kept cleared.
Bits 23:0 RELOAD[23:0]: RELOAD value
The LOAD register specifies the start value to load into the VAL register when the counter is
enabled and when it reaches 0.
Calculating the RELOAD value
The RELOAD value can be any value in the range 0x00000001-0x00FFFFFF. A start value of
0 is possible, but has no effect because the SysTick exception request and COUNTFLAG are
activated when counting from 1 to 0.
The RELOAD value is calculated according to its use:
● To generate a multi-shot timer with a period of N processor clock cycles, use a RELOAD
value of N-1. For example, if the SysTick interrupt is required every 100 clock pulses, set
RELOAD to 99.
● To deliver a single SysTick interrupt after a delay of N processor clock cycles, use a
RELOAD of value N. For example, if a SysTick interrupt is required after 400 clock
pulses, set RELOAD to 400.

说这个寄存器有32位,高8位保留不用,0到23位做为重装计数器的值。
当计数器被使能同时计数到达0时从重装寄存器加载指定的初值都当前寄存器(VAL register)。
初值是这样计算的:重装初值在1~FFFFFF数值范围任何一个数取值,用0做为初值也是可以的,但这样做没有效果,是由于当计数器从1计到0的时候,SysTick的异常请求以及
标志位COUNTFLAG会被激活。
重装初值是根据它的用途来计算的:
1、要产生连续的N个时钟周期,就用N-1做为重装初值。例如,如果要SysTick 每100个时钟周期中断一次,就设置初值为99.
2、要在N个时钟周期后传送一个单独的中断的,就可以用N做为初值。例如,如果要在400个时钟周期后产生中断,就以400做为初值。




小弟搞不明白的就是初值这里,第2种情况好理解,假设我要在10个时钟周期后产生SysTick 中断,就以10为重装初值,让它做减一技术,计到0时,正好产生了10个时钟周期,随即产生中断。
而第1种情况,同样假设我要没10个时钟周期产生一次中断,如果我设初值为9,计到0时,只产生了9个时钟周期,但由于计数值计到了0,中断被触发,并没计到10个周期。剩下的一个周期干嘛去了?
难道这个周期是上个计数周期计到0开始至下个计数周期开始计数的这段间隔??根据在哪?
另外,在《cm2权威指南》里有这样一段话:要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂
停运作。我理解为,当SysTick触发中断时,处理器被喊停转而处理中断,这时候SysTick也暂停下来,那这样到下一个技术周期的时间就更长也更不可预知了。


希望小弟表达清楚自己的问题,烦请各位大哥帮忙解答,小弟感激不尽!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-21 09:23:19 | 显示全部楼层
1,连续产生N个周期,则是设置初值为N-1.
2,N个周期之后,单独传送一个中断.则设置为N.
注意第二个的之后,这个次可圈可点,N,和N之后,那就是差一个时钟了,比如,这个炸弹在从现在开始的第三分钟爆炸.和从现在开始的三分钟之后爆炸.那就不一样.
这里他表述的意思也就类似这种情况.

至于内核halt,那就是谁也没法左右的了.你想准确延时,大可以单独搞个专门的延时芯片,或者搞个胁从单片机嘛....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
26
金钱
26
注册时间
2012-8-21
在线时间
0 小时
 楼主| 发表于 2012-8-21 09:49:56 | 显示全部楼层
可小弟不明白的是,
1,要连续产生N个周期,如果把初值设置成N-1的话,在时钟脉冲的驱动下从N-1开始减一计数,直至减到0,也才用了
N-1个周期,换句话说只连续产生了N-1个周期,还少一个呢?


如果想用SysTick做精确延时,可以不开启中断,用查询方式不断检查相应的标志位来实现,这样就不会因为内核halt而产生的干扰了吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2012-8-21 11:56:28 | 显示全部楼层
回复【3楼】Adele:
---------------------------------
1,写个程序测试下吧.看看到底是多少.
2,应该和你开不开中断无关了.内核halt应该是用于JTAG调试的,所以这个在调试的时候,必须所有的时钟都严格受控否则调试就没法得到准确的结果了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 10:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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