最近買了一款stm32f407zgt6的核心板,毫不猶豫地寫了乙個用定時器點亮led燈的程式(由於程式比較簡單就不貼上來了)。在進行1秒閃爍功能實現時,明顯發現了led的閃爍時間不對,剛開始是拿手機進行簡單的計時,結果顯示的是大約3秒的延時(測了10秒亮了兩次),在仔細檢查**後,確定不是**問題(因為**是用的野火的示例**)
systemcoreclock是系統預設的系統時鐘,在system_stm32f4xx.c檔案中查的,f407對應的系統時鐘是168mhz
由systick_init()函式,通過計算處理肯定能得到精確的定時,後通過定時器控制gpio引腳連線至示波器檢測,在高電平延時1ms的情況下,測得實際值為3.1ms。再次檢查程式,確定沒有問題後。意識到可能是系統時鐘配置的問題。期間使用了網上推薦的獲得系統時鐘頻率的函式來檢測的方法,但是沒有實際進展,這裡略過。按著思路,我找到了時鐘配置的原理圖
m = 25 n=336 p=2 在system_stm32f4xx.c檔案中,找到了如下配置
這下確認沒有問題了,把頻率引數 168000000hz代入公式反算,得到hse=25000000,也就是說hse的輸入頻率應該是25mhz,這明顯符合圖一上面的引數。由此確定,該問題並不是程式上的問題。於是問題集中到硬體上,那可能性就比較多了,先從時鐘源入手,上面的系統時鐘原理圖可以看出,hse的時鐘源由osc_out與osc_in接入,找到核心板電路圖,如圖
本來是按著25mhz的晶振去找,怎麼都找不到,接著查引腳,找到了這個8mhz的外部晶振,問題根源終於找到了,這塊板子的時鐘源用的是8mhz,但是系統配置裡面預設是按照25mhz的,將hse=8mhz帶入計算公式,得到systick=53760000hz,大約是理想值的三分之一,到此終於確定了問題所在,為了後面工程的良好實施,系統頻率還是用規定的168mhz,為好。接著修改就比較簡單了。
由公式反算,如果m=8的話,能得到理想頻率(為什麼不是其他引數,請參考一下中文手冊,其他引數是有範圍的)
接下來是在系統配置裡修改m引數,先將system_stm32f4xx.c檔案的唯讀屬性去掉(找到該檔案,右鍵屬性去掉唯讀),在kile5中重新開啟該檔案,將**翻到371行
最後附上我的核心板實物圖
基於stm32f407建立stm32F427工程
分為三個部分 1.啟動檔案 2.fwilib 包含兩個資料夾inc和src。src裡面是stm32資源的c檔案,inc則是32資源的h檔案 3.user這也是我不太理解的部分 ddbugconfig只包含了用於debug的初始化,則是f4的系統檔案。我是在f407的基礎上改的 總的來說 1.改了晶元...
STM32F407上除錯freeRTOS問題
是在正點原子的阿波羅stm32f429開發板上的例子改來的,他們的編譯沒有問題,我編譯時出現如下問題 定位到出錯的地方,是 再追 configmax syscall interrupt priority 的定義是 define configmax syscall interrupt priority...
STM32F407 驅動外部SRAM
需要驅動的sram型號為is61lv25616al,價效比比51216的高很多 配置cubemx 這幾個時序比較關鍵,可以按照手冊來計算,我用下來這幾個數值比較合適。然後就沒有然後了,生成 就可以用了。檢查sram內容是否正確 uint8 t bsp testextsram void 寫sram p...