有位朋友在后臺(tái)大概問(wèn)了這樣一個(gè)問(wèn)題:STM32的SysTick時(shí)鐘源是來(lái)自Cortex系統(tǒng)定時(shí)器嗎?
引伸:
為什么STM32CubeMX中Cortex系統(tǒng)定時(shí)器可選擇1分頻(和8分頻)?
1寫(xiě)在前面
看到這個(gè)問(wèn)題,我在想,這位朋友可能沒(méi)有認(rèn)真看手冊(cè),同時(shí)也存在一個(gè)誤區(qū)。
我順便也搜索了一下,網(wǎng)上很多文章都說(shuō)到:SysTick時(shí)鐘源是來(lái)自Cortex系統(tǒng)定時(shí)器,就是那個(gè)有8分頻的時(shí)鐘
但是,我們實(shí)際應(yīng)用中,SysTick時(shí)鐘源真的是來(lái)自這個(gè)Cortex系統(tǒng)定時(shí)器嗎?
2
SysTick時(shí)鐘初始化代碼
不管是使用標(biāo)準(zhǔn)外設(shè)庫(kù),還是HAL庫(kù),你初始化SysTick,都會(huì)調(diào)用內(nèi)核中的SysTick_Config函數(shù)。
比如:
SysTick_Config(SystemCoreClock / 1000);
初始化調(diào)用這段代碼之后,SysTick將會(huì)實(shí)現(xiàn)1ms中斷一次。
這段代碼實(shí)現(xiàn)1ms中斷一次相信大家都能理解,但是這里SysTick初始化和上面說(shuō)的時(shí)鐘『/8』有關(guān)系嗎?
3
SysTick時(shí)鐘源是來(lái)自哪里?
這個(gè)問(wèn)題只要認(rèn)真看參考手冊(cè)都能找到答案。
RCC通過(guò)AHB時(shí)鐘(HCLK)8分頻后作為Cortex系統(tǒng)定時(shí)器(SysTick)的外部時(shí)鐘。
通過(guò)對(duì)SysTick控制與狀態(tài)寄存器的設(shè)置,可選擇上述時(shí)鐘或Cortex(HCLK)時(shí)鐘作為SysTick時(shí)鐘。
--來(lái)自參考手冊(cè)
也就是說(shuō)SysTick時(shí)鐘源可以來(lái)自兩個(gè)地方:
AHB時(shí)鐘8分頻
HCLK(內(nèi)核)時(shí)鐘
通過(guò)SysTick控制與狀態(tài)寄存器的設(shè)置進(jìn)行選擇時(shí)鐘源。
具體就是通過(guò)CLKSOURCE(時(shí)鐘源)這一Bit位來(lái)選擇:
再次看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 */}
你會(huì)發(fā)現(xiàn),其實(shí)源碼已經(jīng)默認(rèn)使用HCLK(內(nèi)核)時(shí)鐘。
而SysTick_Config函數(shù)屬于內(nèi)核(如core_cm3.h)已經(jīng)寫(xiě)好源碼,一般我們不去修改。
所以,到這里,你會(huì)明白:SysTick時(shí)鐘源其實(shí)就是用的HCLK(內(nèi)核)時(shí)鐘。
4
STM32CubeMX...可選擇1分頻
分析上面問(wèn)題的時(shí)候,我突然發(fā)現(xiàn)一個(gè)問(wèn)題:為什么STM32CubeMX中Cortex系統(tǒng)定時(shí)器可選擇1分頻(和8分頻)?
(使用STM32CubeMX V5.1.0)
我通過(guò)配置1分頻和8分頻,各自生成代碼,進(jìn)行對(duì)比,發(fā)現(xiàn)生成的代碼完全一樣。
然后,我又查看手冊(cè),RCC時(shí)鐘樹(shù)中的這個(gè)位置是固定『/8』,也沒(méi)有看到可『/1』的說(shuō)明。
-
STM32
+關(guān)注
關(guān)注
2263文章
10847瀏覽量
353773 -
時(shí)鐘
+關(guān)注
關(guān)注
10文章
1701瀏覽量
131187 -
Cortex
+關(guān)注
關(guān)注
2文章
201瀏覽量
46380 -
Systick
+關(guān)注
關(guān)注
0文章
62瀏覽量
13020
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論