近段時間由于在做ucos-iii的移植,所以就順便了解下STM32的啟動過程。經(jīng)過查閱各種官方文獻和對代碼進行單步跟蹤,詳細地敘述了STM32加電啟動的具體過程。對于關(guān)鍵性的語句都指明了出處。下面將學習成果分享給大家,由于筆者知識有限,不當之處敬請指出。
為了更好的說明問題,先來看STM32的內(nèi)存映射(以STM32L1xx為例)
由于固定的內(nèi)存映射,代碼區(qū)(code area)從0x00000000開始,通過指令總線(ICode Bus)和數(shù)據(jù)總線(DCode Bus)訪問。數(shù)據(jù)區(qū)(SRAM)從0x20000000開始,通過系統(tǒng)總線(System Bus)訪問。Cortex?-M3 CPU總是通過指令總線(ICode Bus)取得復(fù)位向量,這就意味著啟動空間(boot space)只能處于代碼區(qū)(code area),典型的就是Flash。STM32系列使用了一種特殊的機制,能夠從代碼區(qū)以外的區(qū)域啟動(如,內(nèi)部的SRAM)。(《cortex-m3編程指南》)
這就意味著,STM32系列可以有3種啟動模式,由BOOT1與BOOT0的設(shè)置決定選擇Flash、System memory還是SRAM作為啟動空間(boot space)。
STM32把從0x00000000到0x0005FFFF的區(qū)域作為啟動空間(boot space)的別名區(qū)。
從上面兩個表中可以看出:
當從主閃存(Main Flash memory)啟動時,啟動空間別名區(qū)映射到Flash。
當從系統(tǒng)內(nèi)存(System memory)啟動時,啟動空間別名區(qū)映射到System memory。
當從內(nèi)部SRAM(Embedded SRAM)啟動時,啟動空間別名區(qū)映射到SRAM。
注:默認是這樣的映射關(guān)系,但上述的映射關(guān)系啟動后可以由軟件修改(通過修改SYSCFG啟動器的MEM_MODE位域)。
這樣,F(xiàn)lash、System memory和SRAM分別可以從別名區(qū)和原始地址處訪問。
Flash:訪問地址為0x00000000或0x08000000
System memory:訪問地址為0x00000000或0x1FF00000
SRAM:啟動時地址為0x00000000或0x20000000(STM32Fxx的參考手冊上說,啟動后只能在0x20000000開始訪問,即啟動后這個映射消失,需要重定位中斷向量表,這是特例)
System memory內(nèi)置了ST提供的boot loader,可以通過該boot loader下載程序到Flash中。
用戶程序?qū)嶋H只能存儲在Flash中,且能在Flash和SRAM中執(zhí)行(因為cortex-m3核采用哈佛結(jié)構(gòu),代碼可直接在Flash運行,馮?諾依曼結(jié)構(gòu)則必須將代碼拷貝至RAM運行)。
Flash就像是電腦的硬盤,用于存儲代碼。
System memory就像是電腦的ROM,里面的程序有芯片廠商寫好,用戶不可改寫。
SRAM就像是電腦的內(nèi)存,里面的數(shù)據(jù)都是動態(tài)的,掉電就丟失的,用于建立堆棧等。
對于用戶代碼來說,只需要考慮從Flash啟動和從SRAM啟動兩種情況。
了解上述映射關(guān)系之后,就可以討論中斷向量表了。
Cortex-m3核的中斷向量表是不變的(中斷向量表每一項為4個字節(jié),中斷向量表的第一項:棧頂,中斷向量表的第二項:復(fù)位向量……,中斷向量表每項內(nèi)容可以看官方的啟動文件,或者查看相關(guān)的手冊),只需要用戶設(shè)定表頭的地址。
默認情況下,從Flash啟動,中斷向量表從Flash的起始地址(0x08000000)開始存放。同時映射到0x00000000處。向量表偏移寄存器(VTOR)的值為0x00000000(實際映射到0x08000000)。
若從SRAM啟動,中斷向量表還是存放在Flash中(Flash才能固化存儲,SRAM只能加電才有效),只不過拷貝到SRAM的首地址0x20000000處。此時向量表偏移寄存器(VTOR)的值也是0x00000000(實際映射到0x20000000)。而啟動過程結(jié)束后,這個特殊的映射不復(fù)存在了(據(jù)參考手冊推測的),所以,需要修改向量表偏移寄存器(VTOR)的值為0x20000000以后的值(其中TBLOFF位域要是0x200的倍數(shù),這個是字對齊的要求(見《cortex-m3編程手冊》),由于STM32的中斷向量一共有68+16=84個,應(yīng)該把這個數(shù)增加到下一個2的整數(shù)倍即128,然后換算成地址范圍128*4=512,就得到了0x200),以便處理中斷。
因此,無論用哪種模式啟動,復(fù)位時棧頂指針總能在0x00000000(或0x08000000)處找到,而復(fù)位向量總能在0x00000004(或0x08000004)處找到。
又根據(jù)《cortex-m3編程手冊》,復(fù)位時,CPU從0x00000000處獲取棧頂指針MSP(默認使用主堆棧),從0x00000004處獲取程序計數(shù)器PC(復(fù)位向量)。則印證了上述說法。
下面通過追蹤STM32L1xx標準外設(shè)庫V1.2.0(STM32L1xx_StdPeriph_Lib_V1.2.0)中的啟動文件startup_stm32l1xx_md.s來驗證上述說法。
先復(fù)位CPU,從寄存器窗口可以看到:
R13(SP)的值為0x20000FC0(MSP),R15(PC)的值為0x08000420。這兩個值就是地址0x00000000和地址0x00000004處存放的內(nèi)容。由于是從Flash啟動,所以,實際上也就是0x08000000和0x08000004處存放的內(nèi)容??梢詮膬?nèi)存窗口中看出:
內(nèi)存地址 | 內(nèi)容 |
0x00000000 | C0H |
0x00000001 | 0FH |
0x00000002 | 00H |
0x00000003 | 20H |
0x00000004 | 21H |
0x00000005 | 04H |
0x00000006 | 00H |
0x00000007 | 08H |
從0x00000000處,取出1個字(32位,4個字節(jié)),為0x20000FC0,是堆棧指針SP的值。
從0x00000004處,取出1個字(32位,4個字節(jié)),為0x08000421,而PC指針讀回0x08000420
它把末位的1變成了0,這個是由于內(nèi)存對齊造成的,因為cortex-m3核PC的LSB一定讀回0,因此指令至少是半字對齊的(《cortex-m3編程手冊》)。
同樣的結(jié)果在反匯編窗口也可以得到:
繼續(xù)跟蹤:此時程序?qū)ぶ返絇C指針指示的地址0x08000420處執(zhí)行
此處,指令 LDR R0,=SystemInit 將函數(shù)SystemInit的入口地址傳給R0,從反匯編窗口可以看到指令被寫成LDR r0,[pc,#36],表明SystemInit的入口地址在存放在PC指針偏移36處,即0x08000420(+0x4)+0x24=0x08000448(因為CM3內(nèi)部使用了指令流水線,讀PC時返回的值是當前指令的地址+4《Cortex?-M3權(quán)威指南》)下一條指令在0x08000422處,BLX R0 將R0的值傳給PC(必須保證加載到PC的數(shù)值是奇數(shù)(即LSB=1),傳給PC后,PC的LSB讀回0),調(diào)用SystemInit函數(shù)。這個函數(shù)里面開啟了外部晶振,設(shè)置了PLL,除能了所有中斷,設(shè)置了時鐘為32MHz,并且重定位中斷向量表在0x08000000處(這句在Flash啟動時可以不需要,因為能從0x00000000映射到0x08000000)。從該函數(shù)返回后,用同樣的方式調(diào)用C/C++標準實時庫的__main函數(shù),進行了一些處理(如用戶堆棧初始化等,具體可以跟蹤匯編代碼,這部分網(wǎng)上已有過分析,不再贅述)后,調(diào)用main函數(shù),進入C語言環(huán)境。
關(guān)于啟動文件的中斷向量表部分:
以上是在建立中斷向量表(DCD偽指令表明,為每個中斷向量分配了1個字的連續(xù)空間)。
實際上,對啟動文件分析的資料已經(jīng)很多,也足夠詳細,此處就不再贅述了。
基于上面分析,可以總結(jié)STM32啟動的大體過程。
1、上電復(fù)位,CPU從0x00000000處獲取棧頂指針MSP(默認使用主堆棧),從0x00000004處獲取程序計數(shù)器PC(復(fù)位向量)。
2、MSP指針必然指向SRAM區(qū)的,因為堆棧必須建立在該區(qū)。
3、根據(jù)PC的值找到復(fù)位中斷處理函數(shù)Reset_Handler
4、調(diào)用SystemInit函數(shù)。
5、調(diào)用__main函數(shù),初始化用戶堆棧
6、調(diào)用main函數(shù),進入C語言環(huán)境
上一篇:STM32 啟動過程簡述
下一篇:STM32啟動過程與向量表
推薦閱讀
史海拾趣
創(chuàng)新是Advanced Analog公司發(fā)展的核心動力。公司始終堅持自主研發(fā)和技術(shù)創(chuàng)新,不斷推出新的產(chǎn)品和技術(shù)。這些新產(chǎn)品不僅滿足了市場的多樣化需求,也進一步鞏固了公司在電源管理IC領(lǐng)域的領(lǐng)先地位。同時,Advanced Analog還積極關(guān)注行業(yè)發(fā)展趨勢和未來技術(shù)走向,為公司的長遠發(fā)展做好戰(zhàn)略布局。
Advanced Analog自1999年創(chuàng)立起,便專注于電源管理IC的設(shè)計及研發(fā)。面對當時電子市場的激烈競爭,公司憑借對技術(shù)的深刻理解和敏銳的市場洞察力,成功開發(fā)出多款高性能、高可靠性的電源管理IC產(chǎn)品,迅速在行業(yè)中嶄露頭角。通過不斷的技術(shù)創(chuàng)新和優(yōu)化,Advanced Analog逐漸在電源管理IC領(lǐng)域建立起自己的技術(shù)優(yōu)勢和品牌影響力。
隨著技術(shù)的不斷積累和市場需求的日益增長,HI Microwave不斷加大研發(fā)投入,成功開發(fā)出了一系列高性能的微波組件產(chǎn)品,包括隔離器、循環(huán)器、開關(guān)、濾波器、功率分配器/合成器、定向耦合器、天線、混頻器、壓控振蕩器(VCOs)和射頻放大器等。這些產(chǎn)品廣泛應(yīng)用于無線電信和光纖通信行業(yè),滿足了客戶多樣化的需求。同時,公司還積極與國內(nèi)外知名企業(yè)和科研機構(gòu)合作,共同推動微波通信技術(shù)的發(fā)展。
CONTTEK Group GmbH公司深知品質(zhì)是企業(yè)的生命線。因此,公司建立了嚴格的質(zhì)量管理體系,從原材料的采購到產(chǎn)品的生產(chǎn)、檢測、包裝等每一個環(huán)節(jié)都進行嚴格把控。這種對品質(zhì)的執(zhí)著追求,使得公司的產(chǎn)品贏得了客戶的廣泛信賴和好評。許多知名電子企業(yè)都選擇與CONTTEK Group GmbH公司建立長期合作關(guān)系,共同推動電子行業(yè)的發(fā)展。
隨著產(chǎn)品技術(shù)的不斷提升,Crystalfontz America Inc公司開始積極拓展市場。公司通過與各大電子設(shè)備制造商建立合作伙伴關(guān)系,將產(chǎn)品應(yīng)用于嵌入式系統(tǒng)、機架式服務(wù)器、儀器集群等領(lǐng)域。同時,公司還積極參加各類行業(yè)展會和技術(shù)交流活動,提升品牌知名度,吸引更多潛在客戶。這些舉措有效推動了公司市場份額的擴大和業(yè)務(wù)的快速增長。
品質(zhì)管理是CAT發(fā)展的重要保障。公司建立了嚴格的質(zhì)量管理體系,從原材料采購到產(chǎn)品制造、檢驗、包裝等各個環(huán)節(jié)都進行嚴格的品質(zhì)控制。CAT還注重與客戶的溝通與協(xié)作,及時了解客戶需求,為客戶提供個性化的解決方案和優(yōu)質(zhì)的售后服務(wù)。這些舉措使得CAT贏得了客戶的廣泛信賴和長期合作。
熟悉內(nèi)核的Makefile對開發(fā)設(shè)備驅(qū)動、理解內(nèi)核代碼結(jié)構(gòu)都是非常重要的 linux2.6內(nèi)核Makefile的許多特性和2.4內(nèi)核差別很大,在內(nèi)核目錄的documention/kbuild/makefiles.txt中有詳細的說明。給大家一個中文版的翻譯 === 目錄 === 1 概述 ...… 查看全部問答∨ |
美國EXCALIBUR公司專注于總線板卡的研究與生產(chǎn),是提供航空工業(yè)領(lǐng)域高質(zhì)量、有效數(shù)據(jù)總線接口、耦合裝置、電纜、連接器和整合裝置的領(lǐng)軍企業(yè)。 我公司是EXC廠家的指定代理商;強有力的技術(shù)支持服務(wù);及時為您解決項目中遇到的問題。 美國EXC 15 ...… 查看全部問答∨ |
學習LabVIEW一般有以下三種方式: 系統(tǒng)型學習方法、探索型學習方法和目標驅(qū)動型學習方法。 這三種方法之間并不矛盾,可以在不同的時段使用不同的方法。每個人可以根據(jù)自己的個性特點和所處環(huán)境選擇一個適合自己的學習方案。 安_然:目標驅(qū)動型學 ...… 查看全部問答∨ |
小菜在學習中斷的時候遇到以下一段代碼,可是在AVR STUDIO4的編譯過程中遇到錯誤,往各位大俠抬手想助,小菜這廂有禮了 #include #include volatile unsigned int interrupt=0;//提醒編譯器這個數(shù)是改變的不能優(yōu)化 void inter(void); SIGNAL ...… 查看全部問答∨ |
很早,我就想問了:三極管,以TTL為例子,三極管的輸出方式有,OC輸出, 推挽輸出,和普通集電級輸出,我這么認為,但是,我想請教 1. 為什么說OC適合驅(qū)動大電流負載,只是因為它在上拉后可以承受比較大的灌電流嗎? & ...… 查看全部問答∨ |
|
我買的是萬利的板子板子上集成了ST LINKII,集成開發(fā)環(huán)境是IAR 4.42A現(xiàn)在發(fā)現(xiàn)調(diào)試中出現(xiàn)以下兩個問題:1.在匯編代碼中設(shè)置一個斷點后,如果不取消該斷點,代碼無法單步運行到下一條指令。2.在運行過程中設(shè)置一個斷點,雖然程序會停 ...… 查看全部問答∨ |
|
我初學DSP沒多久,所用的芯片是TMS320F2812,在使用SRAM.CMD文件仿真是程序運行正確,我用定時器翻轉(zhuǎn)IO口,周期是1us,一切都正常,但是我將SRAM.CMD文件換成flash.CMD文件下載到FLASH里面運行后發(fā)現(xiàn)運行的結(jié)果不對,翻轉(zhuǎn)的周期到了2us,會不會是fl ...… 查看全部問答∨ |
設(shè)計資源 培訓 開發(fā)板 精華推薦
- MPS電機研究院 讓電機更聽話的秘密! 第一站:電機應(yīng)用知識大考!
- TI E2E 無線主題月,寫出你的學習筆記!
- 【答題有禮】了解PI推出的全新LinkSwitch-XT2離線反激式開關(guān)電源IC產(chǎn)品系列
- 更直觀的了解5G?觀看羅德與施瓦茨主題演講,填問卷贏好禮!
- 【在線研討會】ADI RadioVerse™技術(shù)與集成DPD算法的RF收發(fā)器AD9375
- 免費領(lǐng)?。夯趇.MX RT1062的Teensy 4.1開發(fā)板,參考開源設(shè)計,DIY LCR表~
- TI史上最強音視頻DSP—DM6467之SEED開發(fā)板全套資源
- TI 工業(yè)月,靈感不設(shè)限!深度挖掘工業(yè)設(shè)計的痛點和難點,讀專題填問卷贏好禮!
- 單片機零起點入門,帶你DIY 51開發(fā)板
- Artilux GeSi 3D傳感技術(shù) 大幅增強人眼安全保障
- Vicor 啟動產(chǎn)品國產(chǎn)化,服務(wù)本土客戶再升級
- Strategy Analytics:2019年Q2全球智能音箱銷量飆升到3030萬
- STM32F429DISCO+AT070TN92 7寸LCD
- 技術(shù)文章—時效性網(wǎng)絡(luò)(TSN)讓工業(yè)控制如虎添翼
- App Store去年全球銷售額5190 億美元,中國占47%
- 半導(dǎo)體將迎來2nm時代
- 華為云IoT物聯(lián)網(wǎng)平臺競爭力位居國內(nèi)第一,全球第三
- Redmi K30 Pro系列喜提多個冠軍,牛!
- 疫情中的服務(wù)機器人技術(shù) —— 自主定位導(dǎo)航