天天看點

MBED 5.5.1 SystemCoreClock 問題!

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檔案,反彙編,就能得到相對正确的做法。

繼續閱讀