作者 | strongerHuang
微信公眾號 | 嵌入式專欄
STM32CubeMX中Cortex系統定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?
因為STM32CubeMX會啟動SysTick作為延時(HAL_Delay)函數的時基,而SysTick作為Cortex內核的一部分,就會用到Cortex系統定時器。
那么,問題就來了SysTick時鐘源來自哪里?
1、數據手冊和STM32CubeMX時鐘樹
數據手冊時鐘樹:
STM32CubeMX時鐘樹:
你會發(fā)現:數據手冊中的只有『/8』分頻,而STM32CubeMX除了『/8』分頻,還有『/1』分頻。
2、SysTick時鐘初始化代碼
不管是使用標準外設庫,還是HAL庫,你初始化SysTick,都會調用內核中的SysTick_Config函數。
標準庫常用初始化:
SysTick_Config(SystemCoreClock / 1000);
HAL庫初始化同樣也是調用底層的初始化函數:
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) { return SysTick_Config(TicksNumb); }
初始化調用這段代碼之后,SysTick將會實現1ms中斷一次。
這段代碼實現1ms中斷一次相信大家都能理解,但是這里SysTick初始化和上面說的時鐘『/8』有關系嗎?
3、SysTick時鐘源是來自哪里?
這個問題只要認真看參考手冊都能找到答案。
RCC通過AHB時鐘(HCLK)8分頻后作為Cortex系統定時器(SysTick)的外部時鐘。
通過對SysTick控制與狀態(tài)寄存器的設置,可選擇上述時鐘或Cortex(HCLK)時鐘作為SysTick時鐘。(--來自參考手冊)
也就是說SysTick時鐘源可以來自兩個地方:
AHB時鐘8分頻
HCLK(內核)時鐘
通過SysTick控制與狀態(tài)寄存器的設置進行選擇時鐘源。
具體就是通過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 */ } (在core_cm3.h,或者core_cm4.h等內核源碼中)
你會發(fā)現,其實源碼已經默認使用HCLK(內核)時鐘。
而SysTick_Config函數屬于內核(如core_cm3.h)已經寫好源碼,一般我們不去修改。
所以,到這里,你會明白:SysTick時鐘源其實就是用的HCLK(內核)時鐘。
4、最后
開篇的問題:STM32CubeMX中Cortex系統定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?
難道,STM32CubeMX配置Cortex系統定時器時鐘是有Bug嗎?
來源:嵌入式專欄
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
STM32
+關注
關注
2266文章
10876瀏覽量
354927 -
時鐘源
+關注
關注
0文章
93瀏覽量
15938 -
Systick
+關注
關注
0文章
62瀏覽量
13045
發(fā)布評論請先 登錄
相關推薦
評論