啟動檔案講解

2021-09-07 10:47:47 字數 2221 閱讀 8414

本章參考資料《 stm32f4xx 中文參考手冊》第十章-中斷和事件:表 46.

stm32f42*** 和 stm32f43*** 的向量表; mdk 中的幫助手冊—arm development tools:

用來查詢 arm 的彙編指令和編譯器相關的指令。 

啟動檔案由彙編編寫,是系統上電復位後第乙個執行的程式。主要做了以下工作:

1、初始化堆疊指標 sp=_initial_sp

2、初始化 pc 指標=reset_handler

3、初始化中斷向量表

4、配置系統時鐘

5、呼叫 c 庫函式_main 初始化使用者堆疊,從而最終呼叫 main 函式去到 c 的世界 

在講解啟動**的時候,會涉及到 arm 的彙編指令和 cortex 核心的指令,有關

cortex 核心的指令我們可以參考《 cm3 權威指南 cnr2》第四章:指令集。剩下的 arm 的

彙編指令我們可以在 mdk->help->uvision help 中搜尋到,以 equ 為例,檢索如下: 

這裡將回到最初的前面幾篇文章的問題,為什麼需要手動編寫乙個systeminit() 函式讓編譯器不報錯。

:表示弱定義,如果外部檔案優先定義了該標號則首先引用該標號,如果外部

檔案沒有宣告也不會出錯。這裡表示復位子程式可以由使用者在其他檔案重新實現,這裡並

不是唯一的。

import

:表示該標號來自外部檔案,跟

c 語言中的

extern

關鍵字類似。這裡表

示 systeminit

和__main

這兩個函式均來自外部的檔案。

systeminit()

是乙個標準的庫函式,在

system_stm32f4xx.c

這個庫檔案總定義。主要作

用是配置系統時鐘,這裡呼叫這個函式之後,

f429

的系統時鐘配被配置為

180m

。__main

是乙個標準的

c 庫函式,主要作用是初始化使用者堆疊,最終呼叫

main

函式去到

c 的世界。這就是為什麼我們寫的程式都有乙個

main

函式的原因。如果我們在這裡不

呼叫__main

,那麼程式最終就不會呼叫我們

c 檔案裡面的

main

,如果是調皮的使用者就可以

修改主函式的名稱,然後在這裡面

import

你寫的主函式名稱即可。

你可能會說,_main函式我們也沒有寫啊,為什麼不報錯,這個_main函式是mdk編譯器自動給我生成的,不用使用者操心。

在啟動檔案裡面已經幫我們寫好所有中斷的中斷服務函式,跟我們平時寫的中斷服務

函式不一樣的就是這些函式都是空的,真正的中斷復服務程式需要我們在外部的 c 檔案裡

面重新實現,這裡只是提前佔了乙個位置而已。

如果我們在使用某個外設的時候,開啟了某個中斷,但是又忘記編寫配套的中斷服務

程式或者函式名寫錯,那當中斷來臨的時,程式就會跳轉到啟動檔案預先寫好的空的中斷

服務程式中,並且在這個空函式中無線迴圈,即程式就死在這裡。

下面這段話引用自《 cm3 權威指南 cnr2》 3.8—復位序列,cm4 的復位序列跟 cm3 一樣。 —秉火

注。在離開復位狀態後, cm3 做的第一件事就是讀取下列兩個 32 位整數的值:

1、 從位址 0x0000,0000 處取出 msp 的初始值。

2、 從位址 0x0000,0004 處取出 pc 的初始值——這個值是復位向量, lsb 必須是

1。 然後從這個值所對應的位址處取指。

啟動檔案的講解

1 彙編編寫的啟動檔案 startup stm32f10x hd.s 設定堆疊指標 設定pc指標 初始化中斷向量表 配置系統時鐘 對用c庫函式 main最終去到c的世界 2 時鐘配置檔案 system stm32f10x.c 把外部時鐘hse 8m,經過pll倍頻為72m。3 外設相關的 stm32...

Hmaster 啟動講解

ps 發現想寫明白確實不太容易 以下會慢慢完善 hmaster啟動會先執行hmaster 建構函式,看看它都做了什麼 初始化conf rpcserver isa inetaddressserver servername zookeep rpcserver start metrics 如果應用secu...

MySQL的啟動與連線講解

本文主要講mysql的啟動和連線 我用的是mysql5.7,win7 並有更改提示符的操作 啟動mysql服務 net start mysql net start是windows啟動服務的命令,啟動的前提是mysql要已經正確安裝成系統服務 net stop mysql 停止mysql服務 連線my...