STM32程序在Flash上的存儲(chǔ)結(jié)構(gòu)
每一款芯片的啟動(dòng)文件都值得去研究,因?yàn)樗墒悄愕某绦蚺艿淖畛跻欢温罚豢梢圆恢?。通過了解啟動(dòng)文件,我們可以體會(huì)到處理器的架構(gòu)、指令集、中斷向量安排等內(nèi)容,是非常值得玩味的。
STM32作為一款高端 Cortex-M3系列單片機(jī),有必要了解它的啟動(dòng)文件。打好基礎(chǔ),為以后優(yōu)化程序,寫出高質(zhì)量的代碼最準(zhǔn)備。
本文以一個(gè)實(shí)際測(cè)試代碼--START_TEST為例進(jìn)行闡述。
整體過程
STM32整個(gè)啟動(dòng)過程是指從上電開始,一直到運(yùn)行到 main函數(shù)之間的這段過程,步驟為(以使用微庫(kù)為例):
①上電后硬件設(shè)置SP、PC
②設(shè)置系統(tǒng)時(shí)鐘
③軟件設(shè)置SP
④加載.data、.bss,并初始化棧區(qū)
⑤跳轉(zhuǎn)到C文件的main函數(shù)
代碼
啟動(dòng)過程涉及的文件不僅包含 startup_stm32f10x_hd.s,還涉及到了MDK自帶的連接庫(kù)文件 entry.o、entry2.o、entry5.o、entry7.o等(從生成的 map文件可以看出來)。
2 程序在Flash上的存儲(chǔ)結(jié)構(gòu)
在真正講解啟動(dòng)過程之前,先要講解程序下載到 Flash上的結(jié)構(gòu)和程序運(yùn)行時(shí)(執(zhí)行到main函數(shù))時(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里進(jìn)行初始化的,對(duì)于ARM Compiler,__main主要執(zhí)行以下函數(shù):

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