日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年08月14日(星期四)

2018年08月14日 | STM32啟動過程解讀與跟蹤驗證

發(fā)布者:考古專家 來源: eefocus關(guān)鍵字:STM32  啟動過程  跟蹤驗證 手機看文章 掃描二維碼
隨時隨地手機看文章

        近段時間由于在做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)境


關(guān)鍵字:STM32  啟動過程  跟蹤驗證 引用地址:STM32啟動過程解讀與跟蹤驗證

上一篇:STM32 啟動過程簡述
下一篇:STM32啟動過程與向量表

推薦閱讀

在最近ADI公司的RadioVerse射頻技術(shù)與設(shè)計生態(tài)系統(tǒng)新產(chǎn)品——業(yè)界最高帶寬RF收發(fā)器ADRV9008/9的技術(shù)發(fā)布會上,國外媒體記者開玩笑的一句“ADRV9009那么厲害,能救人命不?”讓認真沉浸在變革性的技術(shù)分享的交流會人群爆發(fā)一陣笑聲。國內(nèi)網(wǎng)友們常說,你這么牛怎么就不上天呢?有意思的是,創(chuàng)新的射頻技術(shù)與設(shè)計生態(tài)系統(tǒng)“RadioVerse Powered”技術(shù)真的不僅...
(圖源:Protean官網(wǎng))據(jù)外媒報道,Protean公司推出360度綜合車輪系統(tǒng)方案,集轉(zhuǎn)向、懸架、電機和氣動懸架高度控制系統(tǒng)于一體,提供卓越的車輛機動性。下一代城市交通工具的任務(wù),是在繁忙的城市中平穩(wěn)高效地運送人和貨物。新的360度轉(zhuǎn)向裝置有助于滿足這一需求。Protean360+“轉(zhuǎn)角模塊”,具有360度轉(zhuǎn)向和氣動升降能力,可實現(xiàn)全電子控制驅(qū)動、剎車、底盤升...
據(jù)日本經(jīng)濟網(wǎng)新聞報道稱,豐田和京都大學研究人員正在聯(lián)合開發(fā)新型氟離子電池技術(shù),該技術(shù)有潛力將比目前標準鋰離子電池更多的能量塞入一個體積小、重量輕的電池組中。“因為現(xiàn)有鋰離子電池在能量密度方面存在限制,雖然目前特斯拉、日產(chǎn)等汽車已達到不低的續(xù)航里程,但相比較而言,目前的續(xù)航里程可能已經(jīng)是鋰離子電池的極限,想要進一步突破續(xù)航的天花板...
小米X4發(fā)布會接近尾聲的時候,雷軍向大家介紹了小米內(nèi)部的一個探索概念項目——四足仿生機器人CyberDog。CyberDog匯集小米11年的技術(shù)沉淀,是工程師文化和創(chuàng)新精神的深度凝結(jié),也是小米對于未來科技生活的再次探索。CyberDog搭載高精度環(huán)境感知系統(tǒng),全身11個高精度向大腦實時傳輸信息,還原更真實的生物反應(yīng)。CyberDog有一個中文名字,叫“鐵蛋”,小米工...

史海拾趣

問答坊 | AI 解惑

linux2.6內(nèi)核Makefile詳解

熟悉內(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 概述 ...…

查看全部問答∨

1553B、429航空總線協(xié)議

美國EXCALIBUR公司專注于總線板卡的研究與生產(chǎn),是提供航空工業(yè)領(lǐng)域高質(zhì)量、有效數(shù)據(jù)總線接口、耦合裝置、電纜、連接器和整合裝置的領(lǐng)軍企業(yè)。 我公司是EXC廠家的指定代理商;強有力的技術(shù)支持服務(wù);及時為您解決項目中遇到的問題。 美國EXC 15 ...…

查看全部問答∨

【Labview】看看大家在用哪一種學習方法

學習LabVIEW一般有以下三種方式: 系統(tǒng)型學習方法、探索型學習方法和目標驅(qū)動型學習方法。 這三種方法之間并不矛盾,可以在不同的時段使用不同的方法。每個人可以根據(jù)自己的個性特點和所處環(huán)境選擇一個適合自己的學習方案。 安_然:目標驅(qū)動型學 ...…

查看全部問答∨

Avr STUDIO 4的一些問題

小菜在學習中斷的時候遇到以下一段代碼,可是在AVR STUDIO4的編譯過程中遇到錯誤,往各位大俠抬手想助,小菜這廂有禮了 #include #include volatile unsigned int interrupt=0;//提醒編譯器這個數(shù)是改變的不能優(yōu)化 void inter(void); SIGNAL ...…

查看全部問答∨

我想請教各位三極管的輸出方式有哪些?

   很早,我就想問了:三極管,以TTL為例子,三極管的輸出方式有,OC輸出, 推挽輸出,和普通集電級輸出,我這么認為,但是,我想請教    1. 為什么說OC適合驅(qū)動大電流負載,只是因為它在上拉后可以承受比較大的灌電流嗎? & ...…

查看全部問答∨

如何使用OLED,學生寫的,還比較詳細哦!

從一個初學者的角度寫得,沒一條都很清楚。。。   …

查看全部問答∨

STLINK調(diào)試斷點問題

我買的是萬利的板子板子上集成了ST LINKII,集成開發(fā)環(huán)境是IAR 4.42A現(xiàn)在發(fā)現(xiàn)調(diào)試中出現(xiàn)以下兩個問題:1.在匯編代碼中設(shè)置一個斷點后,如果不取消該斷點,代碼無法單步運行到下一條指令。2.在運行過程中設(shè)置一個斷點,雖然程序會停 ...…

查看全部問答∨

msp449中如何能夠使用uart1的這個串口

 我用的事利達爾的開發(fā)板,初始是這么寫的          P4SEL |= 0x03;        P4DIR|=0X01;            ...…

查看全部問答∨

關(guān)于DSP 2812的CMD問題

我初學DSP沒多久,所用的芯片是TMS320F2812,在使用SRAM.CMD文件仿真是程序運行正確,我用定時器翻轉(zhuǎn)IO口,周期是1us,一切都正常,但是我將SRAM.CMD文件換成flash.CMD文件下載到FLASH里面運行后發(fā)現(xiàn)運行的結(jié)果不對,翻轉(zhuǎn)的周期到了2us,會不會是fl ...…

查看全部問答∨

有江蘇的朋友嗎,剛剛學了不少,想著跟哪位朋友交流下

南京常州無錫都行。做zigbee的人不多啊,也許還能互相介紹個工作,哈哈?!?

查看全部問答∨
小廣播
設(shè)計資源 培訓 開發(fā)板 精華推薦

最新單片機文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved