时钟源选择
函数:SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
代码:
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
{
SysTick->CTRL |= SysTick_CLKSource_HCLK;
}
else
{
SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
}
}
从代码上看,最终操作的就是SysTick->CTRL寄存器,下面看下他的介绍
CM3 允许为 SysTick(系统滴答计时器) 提供两个时钟源以供选择。 第一个是内核的“自由运行时钟” FCLK。“自由” 表现在它不来自系统时钟 HCLK, 因此在系统时钟停止时 FCLK 也继续运行。 第二个是一个外部的参考时钟。但是使用外部时钟时,因为它在内部是通过 FCLK 来采样的,因此其周期必须至少是 FCLK 的两倍(采样定理)。很多情况下芯片厂商都会忽略此外部参考时钟,因此通常不可用。通过检查校准寄存器的位31,可以判定是否有可用的外部时钟源,而芯片厂商则必须把该引线连接至正确的电平。
参数1:SysTick_CLKSource_HCLK = 0X0000 0004
参数2:SysTick_CLKSource_HCLK_Div8 = 0XFFFF FFFB
选择参数1:将SysTick->CTRL的CLKSOURCE位置1,选择内核始终FCLK
选择参数2:将SysTick->CTRL的CLKSOURCE位置0,选择内核始终STCLK
FCLK:外部时钟源 = HCLK(AHB总线时钟)= SYSCLK = 72M
STCLK:内核时钟 = HCLK(AHB总线时钟)/ 8 = 9M
sysTick_Init,系统滴答定时器初始化函数
#define sysTick_ClockSource SysTick_CLKSource_HCLK_Div8
void sysTick_Init()
{
u32 sysTick_Clock;
SysTick_CLKSourceConfig(sysTick_ClockSource);
if(sysTick_ClockSource == SysTick_CLKSource_HCLK_Div8)
{
sysTick_Clock = SystemCoreClock / 8;
}
else
{
sysTick_Clock = SystemCoreClock;
}
}