20200708 昨天突然發現 Systick這個定時器不大好用了,慢了不少。
但是序列槽和以太網都好用,是以這些天沒發現這個問題。把mbed啟動過程屏蔽了就好用了。
發現是是SystemCoreClock這個值 由168000000變為成了0x20000000,
那麼什麼時候變得呢?斷點發現是在__user_setup_stackheap裡面變的。這個值估計就是成了ram的起始位址了。
找了一下網上,發現了香水城的文章 《【實戰經驗】使用mbed 進行STM32 開發及STM32F0的時鐘問題》,
另注:我一直認為香水城是ST推廣成功最大功臣。隻要他的文章肯定是正确且有價值的。
他文章是關于F0的,我遇到的是F4,
并且文章裡的和我遇到的完全不一樣,我遇到的是棧的最高位址的值(SystemCoreClock)變了。
是以我想了個絕妙的辦法,弄個臨時變量放在寄存器裡倒騰一把,
uint32_t temp = SystemCoreClock;
__user_setup_stackheap();
SystemCoreClock = temp;
反彙編如下:
0x08074532 4807 LDR r0,[pc,#28] ; @0x08074550
0x08074534 6804 LDR r4,[r0,#0x00]
...........................
0x0807453E 4804 LDR r0,[pc,#16] ; @0x08074550
0x08074540 6004 STR r4,[r0,#0x00]
這樣的話代碼改動比較小,就是system_stm32f4xx.c一點不用動。
當然還有2種方法,就是 把SystemCoreClock弄成個const,這樣就放在了code區域,當然需要把這個函數SystemCoreClockUpdate屏蔽掉。
還有3種方法就是把變量SystemCoreClock别放在system_stm32f4xx.c外面,或者把變量SystemCoreClock與變量AHBPrescTable交換個位置(就是先定義AHBPrescTable)。
後兩種方法我沒試過。
總而言之,看下map檔案,反彙編,就能得到相對正确的做法。