每一款芯片的啟動文件都值得去研究,因為它可是你的程序跑的最初一段路,不可以不知道。通過了解啟動文件,我們可以體會到處理器的架構(gòu)、指令集、中斷向量安排等內(nèi)容,是非常值得玩味的。
STM32作為一款高端 Cortex-M3系列單片機,有必要了解它的啟動文件。打好基礎(chǔ),為以后優(yōu)化程序,寫出高質(zhì)量的代碼最準(zhǔn)備。
本文以一個實際測試代碼--START_TEST為例進行闡述。
整體過程
STM32整個啟動過程是指從上電開始,一直到運行到 main函數(shù)之間的這段過程,步驟為(以使用微庫為例):
①上電后硬件設(shè)置SP、PC
②設(shè)置系統(tǒng)時鐘
③軟件設(shè)置SP
④加載.data、.bss,并初始化棧區(qū)
⑤跳轉(zhuǎn)到C文件的main函數(shù)
代碼
啟動過程涉及的文件不僅包含 startup_stm32f10x_hd.s,還涉及到了MDK自帶的連接庫文件 entry.o、entry2.o、entry5.o、entry7.o等(從生成的 map文件可以看出來)。
2 程序在Flash上的存儲結(jié)構(gòu)
在真正講解啟動過程之前,先要講解程序下載到 Flash上的結(jié)構(gòu)和程序運行時(執(zhí)行到main函數(shù))時的SRAM數(shù)據(jù)結(jié)構(gòu)。程序在用戶Flash上的結(jié)構(gòu)如下圖所示。下圖是通過閱讀hex文件和在MDK下調(diào)試綜合提煉出來的。

上圖中:
MSP初始值由編譯器生成,是主堆棧的初始值。
初始化數(shù)據(jù)段是.data
未初始化數(shù)據(jù)段是.bss
.data和.bss是在__main里進行初始化的,對于ARM Compiler,__main主要執(zhí)行以下函數(shù):

其中__scatterload會對.data和.bss進行初始化。
加載數(shù)據(jù)段和初始化棧的參數(shù)
加載數(shù)據(jù)段和初始化棧的參數(shù)分別有4個,這里只講解加載數(shù)據(jù)段的參數(shù),至于初始化棧的參數(shù)類似。
后來出現(xiàn)了 Flash 這種可電擦寫的存儲器,并集成在了單片機內(nèi)部。但出廠的時候單片機的程序存儲區(qū)仍然是空白的,沒有任何代碼。用戶編譯程序后,下載到單片機后才能運行。那么在產(chǎn)品發(fā)給用戶后,如果發(fā)現(xiàn)有Bug怎么辦呢?就得用編程器把新代碼重新下載一次。這實在是有點兒麻煩,特別是如果客戶距離很遠的話。于是有聰明的程序猿想了一個辦法,寫一小段特殊的代碼放在程序里,這段代碼可以通過一定方式,比如用按鍵觸發(fā)進入運行,它可以通過串口(早期的 PC 串口是標(biāo)配)接收新的代碼并寫入Flash,從而在沒有硬件編程器的情況下也能完成代碼的更新。
標(biāo)準(zhǔn)化的零部件模式、HI(Huawei Inside) 模式以及鴻蒙智行模式。(1)零部件模式:車 BU 類似傳統(tǒng)汽車供應(yīng)鏈中的 Tier1, 提供標(biāo)準(zhǔn)化零部件模塊給車廠,包括激光雷達、毫米波雷達、攝像頭、電機電控、 車聯(lián)網(wǎng)模塊等 30 多種標(biāo)準(zhǔn)化部件。(2)HI 模式:提供包括軟硬件的全棧解決方案, 幫助車企充分享受到華為先進的智能化技術(shù),相較于零部件模式,HI 模式與車企的 合作程度更加深入,特別是 HI 模式下可以在智能電動、智能座艙與智能駕駛等領(lǐng)域 實現(xiàn)持續(xù)迭代升級。(3)鴻蒙智行模式:鴻蒙智行則是在 HI 模式的基礎(chǔ)上更進一步, 華為全方位介入合作車型的生命周期,發(fā)揮華為消費者端累積的經(jīng)驗,提供技術(shù)和 服務(wù)支持,幫助其提升產(chǎn)品競爭力。
從業(yè)務(wù)歸屬和范圍上看,零部件模式和 HI 模式主要由車 BU 為車企提供零部件 與解決方案,華為不參與整車設(shè)計;而鴻蒙智行模式主要歸華為終端 BG 進行管理。 具體來說,終端 BG 相關(guān)部門負(fù)責(zé)產(chǎn)品規(guī)劃、整車開發(fā)、工程實現(xiàn)、品控管理、供 應(yīng)鏈管理、生產(chǎn)制造、渠道銷售、品牌營銷到交付售后等各個環(huán)節(jié),車 BU 的解決 方案部負(fù)責(zé)進駐車企。
五大解決方案協(xié)同,為車企提供多樣化配置。華為掌握芯、硬、軟、云等智能 化核心技術(shù),在此基礎(chǔ)上,車 BU 先后推出 MDC 智能駕駛平臺、激光雷達、4D 成 像雷達、AR-HUD、鴻蒙車機 OS、HUAWEI HiCar 人-車-家全場景智慧互聯(lián)、車載 智慧屏、車載充電、DriveONE 電驅(qū)動、C-V2X、自動駕駛云服務(wù)等一系列創(chuàng)新解決 方案,共形成乾崑 ADS、乾崑車控、乾崑車云、乾崑車載光、鴻蒙座艙等五大解決 方案,涵蓋了智能網(wǎng)聯(lián)電動汽車的各個方面。華為在汽車智能化領(lǐng)域技術(shù)實力雄厚, 推動汽車產(chǎn)業(yè)轉(zhuǎn)型升級。
1.3、 車企入股引望加深合作,華為有望與更多車企實現(xiàn)“雙向奔赴”
阿維塔/賽力斯入股引望,開啟華為打造汽車產(chǎn)業(yè)智能化開放平臺的關(guān)鍵一步。 8 月 20 日,長安汽車發(fā)布公告,聯(lián)營企業(yè)阿維塔擬與華為簽署《股權(quán)轉(zhuǎn)讓協(xié)議》,以 115 億元的價格購買華為持有的旗下智能汽車解決方案新公司引望 10%的股權(quán),并且 阿維塔有權(quán)提名引望董事會 7 名成員中的 1 名董事。徐直軍表示,阿維塔是華為幫 助車企“造好”車、造“好車”的開創(chuàng)性實踐。8 月 26 日,賽力斯發(fā)布公告,子公司賽 力斯擬以 115 億元的價格購買華為持有的旗下智能汽車解決方案新公司引望 10%的 股權(quán),成為第二家入股華為引望的車企,并且賽力斯汽車在交割后有權(quán)向引望董事 會提名一位董事和一位審計委員會委員。華為有意將引望打造成汽車產(chǎn)業(yè)智能化開 放平臺,成為汽車智能化部件和解決方案的領(lǐng)導(dǎo)者。阿維塔和賽力斯相繼成為引望 的戰(zhàn)略投資者后,引望還將繼續(xù)對戰(zhàn)略合作伙伴開放股權(quán),華為將繼續(xù)全方位支持 引望打造領(lǐng)先的產(chǎn)品和技術(shù),攜手共同推動汽車產(chǎn)業(yè)崛起和智能化全面發(fā)展。
人員、技術(shù)和資產(chǎn)所有權(quán)即將裝載,引望獨立運作在即。徐直軍稱,2024 年底 希望把所有資產(chǎn)、人員裝載到引望,實現(xiàn)引望獨立運作。根據(jù)賽力斯公告,華為技 術(shù)和目標(biāo)公司將在受讓方支付第一筆交易價款前簽署裝載協(xié)議。知識產(chǎn)權(quán)方面,采 用轉(zhuǎn)讓與許可相結(jié)合的模式進行裝載,截至 2024 年 7 月 31 日,華為擬轉(zhuǎn)讓專利及 專利申請共計 6838 項,擬許可專利包括裝載業(yè)務(wù)需要使用的其他專利;擬轉(zhuǎn)讓及擬 許可技術(shù)包含裝載業(yè)務(wù)相關(guān)軟件、代碼、文檔和數(shù)據(jù)等技術(shù)資產(chǎn);擬轉(zhuǎn)讓商標(biāo)及商 標(biāo)申請共計 1603 項,擬許可商標(biāo)及商標(biāo)申請共計 1600 項。人員方面,華為技術(shù)及 其關(guān)聯(lián)方從事裝載業(yè)務(wù)并且用工關(guān)系將轉(zhuǎn)移至目標(biāo)公司的員工將不少于 5500 人。華 為在之前的發(fā)展中已與長安汽車、賽力斯、奇瑞、北汽、江淮、東風(fēng)、一汽等車企 展開深度合作,合作朋友圈持續(xù)擴大,而引望已經(jīng)引入了第一批包括阿維塔和賽力 斯在內(nèi)的兩家車企的投資,第二批車企投資尚在接觸中。
程序猿們也是現(xiàn)代歷史前進的重要推動力啊!
后來,有芯片廠商把這種代碼在出廠時就固化在芯片里,極大的方便了代碼下載和程序更新。STM32F030內(nèi)部就固化了Bootloader。當(dāng)我們把一個引腳 BOOT0 拉高的同時,重新給芯片上電或復(fù)位,就會觸發(fā)Boootloader進入運行。此時我們通過單片機的串口就可以把新程序發(fā)送給單片機,發(fā)送完后把 BOOT0 拉低,再復(fù)位單片機,新程序就會運行起來。
Startup Code 可以譯為啟動代碼。單片機上電或復(fù)位后最先執(zhí)行的一段代碼。一般主要會完成堆棧指針的設(shè)置,復(fù)位向量的獲取和加載,然后初始化變量,最后跳轉(zhuǎn)到用戶代碼。在詳細(xì)看啟動代碼之前,我們先看一下 STM32F030 的內(nèi)存映射。
?STM32的啟動過程?主要包括以下幾個關(guān)鍵步驟:
?初始化堆棧指針和程序計數(shù)器?:當(dāng)STM32芯片上電或復(fù)位時,處理器會從特定的內(nèi)存地址(通常是0x00000000)獲取堆棧指針(MSP)的初始值,并將其加載到堆棧指針寄存器(SP)中。同時,處理器從0x00000004地址獲取程序計數(shù)器(PC)的初始值,指向復(fù)位處理程序(Reset_Handler)的入口地址?12。
?復(fù)位處理程序?:復(fù)位處理程序(Reset_Handler)是啟動代碼中的關(guān)鍵部分,負(fù)責(zé)初始化系統(tǒng)時鐘、配置外設(shè)、設(shè)置中斷相關(guān)參數(shù)等操作。完成這些初始化后,復(fù)位處理程序會跳轉(zhuǎn)到用戶定義的啟動代碼或主函數(shù)(main)?13。
?啟動模式?:STM32支持三種啟動模式:
?主閃存存儲器啟動?:這是最常見的啟動模式。處理器從內(nèi)置的Flash啟動,通常用于通過JTAG或SWD模式下載程序。
?系統(tǒng)存儲器啟動?:用于通過外部接口(如UART、CAN或USB)下載和更新程序。系統(tǒng)存儲器中包含一個出廠預(yù)置的ISP(In-System Programming)代碼,用于橋接外部代碼到內(nèi)置Flash。
?內(nèi)置SRAM啟動?:用于調(diào)試和修復(fù)固件,但SRAM中的代碼在掉電后會丟失?14。
?內(nèi)存映射?:不同的啟動模式會將不同的內(nèi)存區(qū)域映射到0x00000000地址。例如,在主Flash啟動模式下,內(nèi)置Flash的起始地址(0x08000000)會被重映射到0x00000000地址?12。
通過這些步驟,STM32芯片能夠從特定的存儲介質(zhì)中加載和執(zhí)行程序,完成初始化操作后進入用戶代碼的執(zhí)行環(huán)境。
收起分享