有位朋友在后臺大概問了這樣一個問題:STM32的SysTick時鐘源是來自Cortex系統定時器嗎?
引伸:
為什么STM32CubeMX中Cortex系統定時器可選擇1分頻(和8分頻)?
1寫在前面
看到這個問題,我在想,這位朋友可能沒有認真看手冊,同時也存在一個誤區。
我順便也搜索了一下,網上很多文章都說到:SysTick時鐘源是來自Cortex系統定時器,就是那個有8分頻的時鐘

但是,我們實際應用中,SysTick時鐘源真的是來自這個Cortex系統定時器嗎?
2
SysTick時鐘初始化代碼
不管是使用標準外設庫,還是HAL庫,你初始化SysTick,都會調用內核中的SysTick_Config函數。
比如:
SysTick_Config(SystemCoreClock / 1000);
初始化調用這段代碼之后,SysTick將會實現1ms中斷一次。
這段代碼實現1ms中斷一次相信大家都能理解,但是這里SysTick初始化和上面說的時鐘『/8』有關系嗎?
3
SysTick時鐘源是來自哪里?
這個問題只要認真看參考手冊都能找到答案。
RCC通過AHB時鐘(HCLK)8分頻后作為Cortex系統定時器(SysTick)的外部時鐘。
通過對SysTick控制與狀態寄存器的設置,可選擇上述時鐘或Cortex(HCLK)時鐘作為SysTick時鐘。
--來自參考手冊
也就是說SysTick時鐘源可以來自兩個地方:
AHB時鐘8分頻
HCLK(內核)時鐘
通過SysTick控制與狀態寄存器的設置進行選擇時鐘源。
具體就是通過CLKSOURCE(時鐘源)這一Bit位來選擇:

再次看SysTick_Config函數源碼:
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks){ if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) { return (1UL); /* Reload value impossible */ } SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ return (0UL); /* Function successful */}
你會發現,其實源碼已經默認使用HCLK(內核)時鐘。
而SysTick_Config函數屬于內核(如core_cm3.h)已經寫好源碼,一般我們不去修改。
所以,到這里,你會明白:SysTick時鐘源其實就是用的HCLK(內核)時鐘。
4
STM32CubeMX...可選擇1分頻
分析上面問題的時候,我突然發現一個問題:為什么STM32CubeMX中Cortex系統定時器可選擇1分頻(和8分頻)?

(使用STM32CubeMX V5.1.0)
我通過配置1分頻和8分頻,各自生成代碼,進行對比,發現生成的代碼完全一樣。
然后,我又查看手冊,RCC時鐘樹中的這個位置是固定『/8』,也沒有看到可『/1』的說明。

-
STM32
+關注
關注
2309文章
11162瀏覽量
373415 -
時鐘
+關注
關注
11文章
1971瀏覽量
134987 -
Cortex
+關注
關注
2文章
220瀏覽量
48778 -
Systick
+關注
關注
0文章
67瀏覽量
13968
發布評論請先 登錄
SG-210STF有源晶振在5G基站數據中心中的應用_高精度時鐘源
systick來做內部時鐘信號源
CW32系統滴答SysTick定時器詳解
LAT1215+如何讓 STM32WB 在沒有 LSE 時運行 BLE 應用程序
芯源MCU低功耗應用
使用系統定時器SysTick來實現精確延時微秒和毫秒函數
PWM、定時器、SysTick 區別及應用場景
systick時鐘基地址無法找到怎么解決?
Proteus中配置STM32外部時鐘HSE如何配置
SysTick系統滴答定時器簡介
瑞薩RA系列FSP庫開發實戰指南(29)CGC(時鐘生成電路)時鐘控制
STM32中的SysTick時鐘源來自哪里?
評論