变量TimingDelay被赋值了Delay函数传递进来的那个nTime值,也就是50或100。如果变量TimingDelay不等于0,那么它就将一直循环,无法退出Delay函数,只有当TimingDelay变为0了,才能够退出Delay函数。我们正怀疑那个TimingDelay变量怎么会变成0的呢?看:就在这里了。
有个名为TimingDelay_Decrement()的函数在做这个工作,可以这个函数又被什么调用的呢?就是SysTick_Handler函数了。看到这儿,我们已隐隐猜到,这个SysTick_Handler函数应该是个中断函数,每隔一段时间定时运行一次。因为我们找不到有其他函数调用这个函数,所以它只能是被硬件机制调用的。那每隔多长时间呢?这个不难猜,应该是1ms一次。
总结一下:SysTick_Handler()函数每ms运行一次,运行时就调用TimingDelay_Decrement()函数,而这个函数令变量TimingDelay减1。
这样,当我们给Delay()函数传递一个50的参数(Delay(50))时,相当于延时50ms。
可是,可是,问题还有很多,为什么SysTick_Handler会1ms运行一次呢?
看来,得研究一下SysTick究竟是个什么东西,它是怎么运作的了。
SysTick被称之为系统嘀嗒定时器。查找STM32F0的数据手册,居然就这么一点点介绍,,,好在,我们还有其他资料。
在Cortex-M3权威指南中是这么描述Syteick的:
难怪,这个Systick是Cortex-M3内核所提供的,ST自然没必要多讲了。
SysTick定时器:系统滴答定时器是一个非常基本的倒计时定时器,用于在每隔一定的时间产生一个中断,即使是系统在睡眠模式下也能工作。它使得 OS 在各 CM3 器件之间的移植中不必修改系统定时器的代码,移植工作一下子容易多了。
下面还有另外一个问题,Systick究竟多长时间产生一次中断。
看main.c中的代码:
if (SysTick_Config(SystemCoreClock / 1000))
{
/* Capture error */
while (1);
}
我们可以猜测,那个1000就是关键。让我们把1000改成100,重新编译再运行,结果是灯闪烁的速度慢了10倍,也就是Systick变成了10ms中断一次。这样,我们就学会了怎么样来改变这个Systick。可是,总觉得这还有点不够,为什么会是这样呢?让我们把鼠标移到SystemCoreClock上去按下F12吧。
这次跑到了system_stm32f0xx.c文件中去了,这就是User组中的第3个文件。查看一下,原来符号:SystemCoreClock是一个变量,它的值是48000000,也就是48M,这好像是个挺熟悉的数值,是什么呢?
打开STM32F051芯片介绍的资料,原来在这儿,48M是该芯片运行的最高频率。
那么我们可以猜测:
(1)在这个例子中,我们把芯片运行到了它的最高频率,即48M
(2)48M除1000就是48 000,应该是将这个48000这个数放到了某个寄存器中,然后根据这个数来分频。也就是时钟脉冲的频率是48M,然后每隔48000出来一个Systick,这样,这个Systick就是1ms/次了。
讲到这里,似乎把Systick理解了,但其实还有更多的疑问,为什么这个芯片是运行在48M?既然是最高,那肯定还有其他的值,如何设置?好奇是人进步的阶梯,不过要是一直纠缠下去,这一篇就没法结束了。我们先强压住自己的好奇心,暂时到此为止吧。
用户377235 2014-3-30 12:56
teach51_109853927 2013-5-6 11:42
用户377235 2013-5-6 10:48
周教授 哈哈猜不到我谁
teach51_109853927 2013-4-21 21:31
用户377235 2013-4-14 17:07
用户377235 2013-1-17 14:25
不错不错,讲得很详细,其实我是在找那里分频了,既然LZ也没说,我就不去找了,那个用于提供时基我没看到,现在明白了。
jiadongchina_618047972 2013-1-5 16:04