查看: 899|回复: 0
打印 上一主题 下一主题

关于STM32 滴答时钟

[复制链接]
跳转到指定楼层
沙发
发表于 2015-9-27 23:29:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于STM32 滴答时钟
相信不论是初学者还是高手,都会被STM32的滴答时钟所吸引。STM32有很多计数器,也有很多计数器中断。当别人还在用计数器做定时扫描的时候,我们就默默的开始了滴答时钟做扫描了。让他们去任意的浪费资源吧,我们节约资源,把计数器发挥更大的作用。
Systick定时器属于cortex内核部件,在芯片介绍的datasheet中没有提到过,可以参考
《CortexM3权威指南》或《STM32xxx-Cortex编程手册》。
    首先来看Systick的时钟来源,如图一。可以看出在STM32中Systick以HCLK(AHB时钟)或HCLK/8作为运行时钟。


另外要注意Systick是一个24位的定时器,即一次最多可以计数224个时钟脉冲,这个脉冲计数值被保存到当前计数值寄存器STK_VAL中,这个计数器只能向下计数,每接收到一个时钟脉冲STK_VAL的值就向下减1,直至0,当STK_VAL的值被减至0时,由硬件自动把重载寄存器STK_LOAD中保存的数据加载到STK_VAL,意思就是它会自动重装。当STK_VAL的值被倒计至0时,触发中断,就可以在中断服务函数中处理定时事件了。
要让Systick正常工作,必须要对Systick进行配置。它的配置很简单,只有三个控制位和一个标志位,都位于寄存器STK_CRL中,见

ENABLE:
   为Systick timer的使能位,此位为1的时候开始计数,为0则关闭Systick timer。
TICKINT:
    为中断触发使能位,此位为1的时候并且STK_VAL倒计至0的时候会触发Systick
    中断,此位为0的时候不触发中断。
CLKSOURCE:
    为Systick的时钟选择位,此位为1的时候Systick的时钟为AHB时钟,此位为0
    的时候Systick的时钟为AHB/8(AHB的8分频)。
COUNTFLAG:
    为Systick的标志位,当STK_VAL倒计至0,此标志位会被置1。
现在我们不会再为滴答时钟而感到迷惑了吧!
下面将详细描述如何去设置计数器,我们在很多地方看到这样一个函数:
SysTick_Config(SystemCoreClock / 1000)       配置为1ms中断一次
SysTick_Config(SystemCoreClock / 100000)       配置为10us中断一次
SysTick_Config(SystemCoreClock / 1000000)       配置为10us中断一次
我们将细说一下,SystemCoreClock/100000 为什么是10us
我们从图1时钟数可以看出Systick的时钟和AHB有关,从图2中了解到滴答时钟可设置,结合两处就能看明白。若不去设置,系统默认为AHB时钟,即72MHz。
系统文件中可查找出以下描述:
/*******************************************************************************
*  Clock Definitions
*******************************************************************************/
#ifdef SYSCLK_FREQ_HSE
  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_24MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_36MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_36MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_48MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_56MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /*!< System Clock Frequency (Core Clock) */
#elif defined SYSCLK_FREQ_72MHz
  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /*!< System Clock Frequency (Core Clock) */
#else /*!< HSI Selected as System Clock source */
  uint32_t SystemCoreClock         = HSI_VALUE;        /*!< System Clock Frequency (Core Clock) */
#endif
可以看出SystemCoreClock的的值是多少,如何得出的。
我们要把SystemCoreClock/100000当做成算次数,在72M的时钟下,我们需要多少次震荡。
Systick的时钟为72M,系统也设置成72M,那么
1ms=1/72M(Systick时钟)*(72M(SystemCoreClock)/ 1000)
然后剩下的就明白了,知道如何计算了吧,其实我们在设置中,只要知道了Systick和SystemCoreClock是多少就能轻松设置了。
还有的地方提及了滴答时钟的校准,大多数都可以不必使用,在此也没有提及,有兴趣的朋友可以深入研究。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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