STM32滴答时钟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于STM32 滴答时钟
相信不论是初学者还是高手,都会被STM32的滴答时钟所吸引。STM32有很多计数器,也有很多计数器中断。当别人还在用计数器做定时扫描的时候,我们就默默的开始了滴答时钟做扫描了。让他们去任意的浪费资源吧,我们节约资源,把计数器发挥更大的作用。
Systick定时器属于cortex内核部件,在芯片介绍的datasheet中没有提到过,可以参考
《CortexM3权威指南》或《STM32xxx-Cortex编程手册》。
首先来看Systick的时钟来源,如图一。可以看出在STM32中Systick以HCLK(AHB 时钟)或HCLK/8作为运行时钟。
图1
另外要注意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是多少就能轻松设置了。
还有的地方提及了滴答时钟的校准,大多数都可以不必使用,在此也没有提及,有兴趣的朋友可以深入研究。