作者 | strongerHuang
微信公眾號 | 嵌入式專欄
STM32CubeMX中Cortex系統定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?
因為STM32CubeMX會啟動SysTick作為延時(HAL_Delay)函數的時基,而SysTick作為Cortex內核的一部分,就會用到Cortex系統定時器。
那么,問題就來了SysTick時鐘源來自哪里?
1、數據手冊和STM32CubeMX時鐘樹
數據手冊時鐘樹:
STM32CubeMX時鐘樹:
你會發現:數據手冊中的只有『/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控制與狀態寄存器的設置,可選擇上述時鐘或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 */ } (在core_cm3.h,或者core_cm4.h等內核源碼中)
你會發現,其實源碼已經默認使用HCLK(內核)時鐘。
而SysTick_Config函數屬于內核(如core_cm3.h)已經寫好源碼,一般我們不去修改。
所以,到這里,你會明白:SysTick時鐘源其實就是用的HCLK(內核)時鐘。
4、最后
開篇的問題:STM32CubeMX中Cortex系統定時器(System Timer)選擇1分頻和8分頻,為啥生成代碼一樣?
難道,STM32CubeMX配置Cortex系統定時器時鐘是有Bug嗎?
來源:嵌入式專欄
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
STM32
+關注
關注
2272文章
10924瀏覽量
357585 -
時鐘源
+關注
關注
0文章
93瀏覽量
16038 -
Systick
+關注
關注
0文章
62瀏覽量
13150
發布評論請先 登錄
相關推薦
ADuCM360 SysTick的時鐘源怎么使能?
使用FreeRTOS時Systick時鐘的配置分享
STM32的SysTick時鐘源是來自Cortex系統定時器嗎
STM32的SysTick時鐘源是來自Cortex系統定時器嗎?
![<b class='flag-5'>STM32</b>的<b class='flag-5'>SysTick</b><b class='flag-5'>時鐘</b><b class='flag-5'>源</b>是<b class='flag-5'>來自</b>Cortex系統定時器嗎?](https://file.elecfans.com/web1/M00/8D/B9/pIYBAFykSseANPGqAAAPbjclgs0685.png)
什么是SysTick定時器?實現STM32時鐘系統的詳細資料說明
![什么是<b class='flag-5'>SysTick</b>定時器?實現<b class='flag-5'>STM32</b><b class='flag-5'>時鐘</b>系統的詳細資料說明](https://file.elecfans.com/web1/M00/B2/97/pIYBAF4NmzWATfYJAAFz-CHv3Js941.png)
STM32學習筆記:系統滴答時鐘SysTick
![<b class='flag-5'>STM32</b>學習筆記:系統滴答<b class='flag-5'>時鐘</b><b class='flag-5'>SysTick</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32—關于SYSTICK系統時鐘的詳解及學習筆記
![<b class='flag-5'>STM32</b>—關于<b class='flag-5'>SYSTICK</b>系統<b class='flag-5'>時鐘</b>的詳解及學習筆記](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
STM32F103:精準延時delay——SysTick使用
![<b class='flag-5'>STM32</b>F103:精準延時delay——<b class='flag-5'>SysTick</b>使用](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
17、STM32——SysTick詳解
![17、<b class='flag-5'>STM32</b>——<b class='flag-5'>SysTick</b>詳解](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
初學stm32-Systick滴答時鐘定時
![初學<b class='flag-5'>stm32-Systick</b>滴答<b class='flag-5'>時鐘</b>定時](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
一文詳解STM32的嘀嗒時鐘(SysTick)
![一文詳解<b class='flag-5'>STM32</b>的嘀嗒<b class='flag-5'>時鐘</b>(<b class='flag-5'>SysTick</b>)](https://file.elecfans.com/web2/M00/8A/3A/pYYBAGO752eActyVAAHfddEkDTk707.png)
評論