前几天有人发帖说stm32不能用SysTick库函数定时1us问题原因

[复制链接]
 楼主| lip0201 发表于 2011-6-9 22:14 | 显示全部楼层 |阅读模式
本帖最后由 lip0201 于 2011-6-9 22:17 编辑

SysTick的时钟源频率设为SysTick_CLKSource_HCLK_Div8,即9M,假如定时1ms的话,可以这样设置
if (SysTick_Config((SystemCoreClock /8)/ 1000 ))//重装值为9000-1=8999, 定时1ms
{                              
     /* Capture error */
     while (1);
}
假如想定时1us的话,很多人想到除以1000000,即
if (SysTick_Config((SystemCoreClock /8)/ 1000000 ))//重装值为9-1=8,定时1us
{
/* Capture error */
while (1);
}
当时我也是这么做的,可是这么设置片子根本不工作,除以100000还可以,多加一个0就不行了。仿真了半天才知道其原因,原来重装的值太小,还没等SysTick配置完成,重装值已经减为0(此时没运行到Delay(nms)处),从而跳到了中断函数处,nms的值还没传到 TimingDelay_Decrement(void)函数中,所以程序就死在中断函数里了
所以用这种方法不能将重装值设的太小





}
香水城 发表于 2011-6-13 12:11 | 显示全部楼层
鼓励分析思考。
kakio 发表于 2011-6-13 13:27 | 显示全部楼层
这种氛围真好呀
sulh 发表于 2011-6-13 15:03 | 显示全部楼层
问的人就是我,感谢楼主解惑~!!!!
xwj 发表于 2011-6-13 15:11 | 显示全部楼层
呵呵,赞一个~
就是要这样
无冕之王 发表于 2011-6-13 16:38 | 显示全部楼层
做工程研发就得像楼主那样多思考
hsbjb 发表于 2011-6-13 19:37 | 显示全部楼层
碰到过类似的问题
bsz84 发表于 2011-6-13 22:40 | 显示全部楼层
_____________________________________________________________________________
仿真了半天才知道其原因,原来重装的值太小,还没等SysTick配置完成,重装值已经减为0(此时没运行到Delay(nms)处),从而跳到了中断函数处,nms的值还没传到 TimingDelay_Decrement(void)函数中,所以程序就死在中断函数里了
所以用这种方法不能将重装值设的太小
________________________________________________________________________
我想知道真相,是不是这样的,
 楼主| lip0201 发表于 2011-6-14 10:08 | 显示全部楼层
8# bsz84

我单步运行了好几次,跟踪程序的运行,看到寄存器的值确实在运行到Delay()前已经减为0,跳到了中断函数处,而此时中断函数调用的TimingDelay_Decrement(void)中循环递减的的变量还没有被赋值(因为还没运行到Delay(),这个变量的赋值是在Delay()中赋值的),所以程序就死在了中断里,你可以仿真试一下,打开SysTick的寄存器,一步步运行,就可以看到问题原因了
MicroMMU 发表于 2011-6-14 13:18 | 显示全部楼层
钻牛角尖了,定一个us有什么意义呀,
dfsa 发表于 2011-6-14 16:35 | 显示全部楼层
多分析思考,然后再分享,才能很快进步
Snow-wing 发表于 2014-12-31 13:14 | 显示全部楼层
给楼主赞一个  刚好遇到这个问题  谢谢
zh113214 发表于 2014-12-31 15:32 | 显示全部楼层
赞一个!!!楼主威武啊!!!
xppx1987 发表于 2015-1-6 15:55 | 显示全部楼层
不错!LZ善于思考~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

12

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部