作者 | strongerHuang
微信公眾號 | 嵌入式專欄
STM32CubeMX中Cortex系統(tǒng)定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?

因為STM32CubeMX會啟動SysTick作為延時(HAL_Delay)函數(shù)的時基,而SysTick作為Cortex內(nèi)核的一部分,就會用到Cortex系統(tǒng)定時器。
那么,問題就來了SysTick時鐘源來自哪里?
1、數(shù)據(jù)手冊和STM32CubeMX時鐘樹
數(shù)據(jù)手冊時鐘樹:

STM32CubeMX時鐘樹:

你會發(fā)現(xiàn):數(shù)據(jù)手冊中的只有『/8』分頻,而STM32CubeMX除了『/8』分頻,還有『/1』分頻。
2、SysTick時鐘初始化代碼
不管是使用標準外設(shè)庫,還是HAL庫,你初始化SysTick,都會調(diào)用內(nèi)核中的SysTick_Config函數(shù)。
標準庫常用初始化:
SysTick_Config(SystemCoreClock / 1000);
HAL庫初始化同樣也是調(diào)用底層的初始化函數(shù):
uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb) { return SysTick_Config(TicksNumb); }
初始化調(diào)用這段代碼之后,SysTick將會實現(xiàn)1ms中斷一次。
這段代碼實現(xiàn)1ms中斷一次相信大家都能理解,但是這里SysTick初始化和上面說的時鐘『/8』有關(guān)系嗎?
3、SysTick時鐘源是來自哪里?
這個問題只要認真看參考手冊都能找到答案。
RCC通過AHB時鐘(HCLK)8分頻后作為Cortex系統(tǒng)定時器(SysTick)的外部時鐘。
通過對SysTick控制與狀態(tài)寄存器的設(shè)置,可選擇上述時鐘或Cortex(HCLK)時鐘作為SysTick時鐘。(--來自參考手冊)
也就是說SysTick時鐘源可以來自兩個地方:
AHB時鐘8分頻
HCLK(內(nèi)核)時鐘
通過SysTick控制與狀態(tài)寄存器的設(shè)置進行選擇時鐘源。
具體就是通過CLKSOURCE(時鐘源)這一Bit位來選擇:

再次看SysTick_Config函數(shù)源碼:
__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等內(nèi)核源碼中)
你會發(fā)現(xiàn),其實源碼已經(jīng)默認使用HCLK(內(nèi)核)時鐘。
而SysTick_Config函數(shù)屬于內(nèi)核(如core_cm3.h)已經(jīng)寫好源碼,一般我們不去修改。
所以,到這里,你會明白:SysTick時鐘源其實就是用的HCLK(內(nèi)核)時鐘。
4、最后
開篇的問題:STM32CubeMX中Cortex系統(tǒng)定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?

難道,STM32CubeMX配置Cortex系統(tǒng)定時器時鐘是有Bug嗎?
來源:嵌入式專欄
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問題,請聯(lián)系小編進行處理
審核編輯 黃宇
-
STM32
+關(guān)注
關(guān)注
2313文章
11195瀏覽量
374749 -
時鐘源
+關(guān)注
關(guān)注
0文章
113瀏覽量
16825 -
Systick
+關(guān)注
關(guān)注
0文章
67瀏覽量
14025
發(fā)布評論請先 登錄
ADuCM360 SysTick的時鐘源怎么使能?
使用FreeRTOS時Systick時鐘的配置分享
STM32的SysTick時鐘源是來自Cortex系統(tǒng)定時器嗎
STM32的SysTick時鐘源是來自Cortex系統(tǒng)定時器嗎
STM32的SysTick時鐘源是來自Cortex系統(tǒng)定時器嗎?
什么是SysTick定時器?實現(xiàn)STM32時鐘系統(tǒng)的詳細資料說明
STM32學(xué)習(xí)筆記:系統(tǒng)滴答時鐘SysTick
STM32—關(guān)于SYSTICK系統(tǒng)時鐘的詳解及學(xué)習(xí)筆記
STM32F103:精準延時delay——SysTick使用
17、STM32——SysTick詳解
初學(xué)stm32-Systick滴答時鐘定時
一文詳解STM32的嘀嗒時鐘(SysTick)
STM32的SysTick時鐘源來自哪里?
評論