打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Cortex M3 - SysTick_Handler()
userphoto

2013.06.17

关注

变量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()函数,而这个函数令变量TimingDelay1

这样,当我们给Delay()函数传递一个50的参数(Delay(50))时,相当于延时50ms

可是,可是,问题还有很多,为什么SysTick_Handler1ms运行一次呢?

看来,得研究一下SysTick究竟是个什么东西,它是怎么运作的了。

三、SysTick

         SysTick被称之为系统嘀嗒定时器。查找STM32F0的数据手册,居然就这么一点点介绍,,,好在,我们还有其他资料。

Cortex-M3权威指南中是这么描述Syteick的:

         难怪,这个SystickCortex-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

248M1000就是48 000,应该是将这个48000这个数放到了某个寄存器中,然后根据这个数来分频。也就是时钟脉冲的频率是48M,然后每隔48000出来一个Systick,这样,这个Systick就是1ms/次了。

讲到这里,似乎把Systick理解了,但其实还有更多的疑问,为什么这个芯片是运行在48M?既然是最高,那肯定还有其他的值,如何设置?好奇是人进步的阶梯,不过要是一直纠缠下去,这一篇就没法结束了。我们先强压住自己的好奇心,暂时到此为止吧。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
STM32入门学习之systick定时器
FreeRTOS一线通
嵌入式系统优先级详解
【华大测评】+华大HC32F460开发板之systick延时函数
Cortex
STM32菜鸟成长记录
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服