時鐘源選擇
函數: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;
}
}