![詳細的STM32啟動配置流程解析_第1頁](http://file4.renrendoc.com/view/880ca2571aa80e7e94afc1252f9f00e0/880ca2571aa80e7e94afc1252f9f00e01.gif)
![詳細的STM32啟動配置流程解析_第2頁](http://file4.renrendoc.com/view/880ca2571aa80e7e94afc1252f9f00e0/880ca2571aa80e7e94afc1252f9f00e02.gif)
![詳細的STM32啟動配置流程解析_第3頁](http://file4.renrendoc.com/view/880ca2571aa80e7e94afc1252f9f00e0/880ca2571aa80e7e94afc1252f9f00e03.gif)
![詳細的STM32啟動配置流程解析_第4頁](http://file4.renrendoc.com/view/880ca2571aa80e7e94afc1252f9f00e0/880ca2571aa80e7e94afc1252f9f00e04.gif)
![詳細的STM32啟動配置流程解析_第5頁](http://file4.renrendoc.com/view/880ca2571aa80e7e94afc1252f9f00e0/880ca2571aa80e7e94afc1252f9f00e05.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第第頁詳細的STM32啟動配置流程解析大家不妨設(shè)想一下,(cpu)的工作是什么,cpu是沒有主觀意識的,它只會按照特定的指令執(zhí)行相應(yīng)的操作,用專業(yè)術(shù)語來說就是:取指->譯碼->執(zhí)行,譯碼和執(zhí)行肯定是在cpu內(nèi)部進行操作的,并且前提是已經(jīng)取到了指令。那現(xiàn)在問題來了,指令在哪?
cpu上電復(fù)位后執(zhí)行的第一步操作就是取指令
問題1:指令存儲在何處
我們在(電腦)上編寫的程序最終是要燒寫到(芯片)內(nèi)部的FLASH中(此處特指(STM32))。
問題2:如何將可執(zhí)行文件燒寫至FLASH上
STM32的啟動方式有很多種,從主存FLASH啟動,從systemmem(or)y啟動,從S(RAM)中啟動。
問題3:從SRAM中啟動,為什么需要重新設(shè)置中斷向量表
接下來,我們將圍繞這三個問題進行解答
猜想
既然cpu上電復(fù)位后第一步操作就是取指令,那么這個指令肯定是存儲在掉電不丟失的存儲介質(zhì)上((rom)、flash)。
猜想1:指令存儲在掉電不丟失的存儲介質(zhì)上
我們最終生成的、cpu可以執(zhí)行的可執(zhí)行文件肯定是要通過某種外設(shè)將用戶程序燒寫到FLASH上,這一點肯定是毋庸置疑的,因為cpu與外圍設(shè)備進行數(shù)據(jù)交互的時候是通過外設(shè)(控制器)來進行的。
猜想2:通過某種外設(shè)將可執(zhí)行文件燒寫至FLASH上
STM32的FLASH基地址為0X08000000,SRAM基地址為0X20000000。可不可能是因為這兩個存儲介質(zhì)的地址不同,所以才要重新設(shè)置中斷向量表。因為我們都知道,中斷向量表的首地址就是程序的入口地址。
猜想3:可能與基地址有關(guān)
實驗驗證
實驗前必備知識
1.XIP設(shè)備eXecu(te)InPl(ac)e,即芯片內(nèi)執(zhí)行,指應(yīng)用程序可以直接在flash閃存內(nèi)運行,不必再把代碼讀到系統(tǒng)RAM中。在我們的印象里,應(yīng)用程序必須要從硬盤中加載到內(nèi)存當(dāng)中才可以被運行,但實際上應(yīng)用程序是可以直接在flash閃存運行的,也就是說,cpu可以直接從flash中取出指令。對于STM32而言,它是有XIP設(shè)備的。STM32F1內(nèi)存圖
如上圖所示,F(xiàn)LASH、SYSTEMMEMORY、OP(TI)ONBYTES都是STM32內(nèi)部的XIP設(shè)備。F1內(nèi)存圖信息不是很全,再看下F4的內(nèi)存圖。STM32F4內(nèi)存圖:
我們可以看到,不論是F1還是F4,XIP設(shè)備都屬于內(nèi)存圖中的BLOCK0區(qū)域內(nèi)。這樣我們大概就知道了STM32內(nèi)部的XIP設(shè)備在0x00000000~0x1FFFFFFF內(nèi)。上述的內(nèi)存圖是通過映射的方式將芯片的框圖進行映射得到的,也就是說,上述這幅圖是為了開發(fā)人員更好地面向芯片編程而抽象出來的一幅圖。我們先來看下面這副圖STM32F1框圖:
STM32F4框圖:
對比兩幅框圖可以看出,F(xiàn)4比F1復(fù)雜很多,特別體現(xiàn)在外設(shè)上,架構(gòu)還是差不多的。
紅色箭頭所指向的就是譯碼電路。如果你學(xué)過微機原理,那么你肯定知道,外設(shè)是通過譯碼電路連接到地址總線上,每一個外設(shè)都有其相對應(yīng)的內(nèi)存范圍,當(dāng)cpu發(fā)出的地址信息處于某一個外設(shè)的地址范圍內(nèi),就選中了該外設(shè),cpu就可以與該外設(shè)進行數(shù)據(jù)交互。一個外設(shè)對應(yīng)一個內(nèi)存范圍,那所有的外設(shè)結(jié)合起來,是不是就是對應(yīng)一張圖了。
2.STM32啟動配置在STM32F10xxx里,可以通過BOOT[1:0]引腳選擇三種不同啟動模式。
在系統(tǒng)復(fù)位后,SYSCLK的第4個上升沿,BOOT引腳的值將被鎖存。用戶可以通過設(shè)置BOOT1和BOOT0引腳的狀態(tài),來選擇在復(fù)位后的啟動模式。在啟動延遲之后,CPU從地址0x00000000獲取堆棧頂?shù)牡刂?,并從啟動存儲器?x00000004指示的地址開始執(zhí)行代碼。(這里先不驗證,在之后的博客中會進行驗證,但你需要記住,后面用的上)因為固定的存儲器映像,代碼區(qū)始終從地址0x00000000開始(通過(IC)ode和(DC)ode總線訪問),而數(shù)據(jù)區(qū)(SRAM)始終從地址0x20000000開始(通過系統(tǒng)總線訪問)。Cortex-M3的CPU始終從ICode總線獲取復(fù)位向量,即啟動僅適合于從代碼區(qū)開始(典型地從Flash啟動)。STM32F10xxx(微控制器)實現(xiàn)了一個特殊的機制,系統(tǒng)可以不僅僅從Flash存儲器或系統(tǒng)存儲器啟動,還可以從內(nèi)置SRAM啟動。根據(jù)選定的啟動模式,主閃存存儲器、系統(tǒng)存儲器或SRAM可以按照以下方式訪問:
從主閃存存儲器啟動:主閃存存儲器被映射到啟動空間(0x00000000),但仍然能夠在它原有的地址(0x08000000)訪問它,即閃存存儲器的內(nèi)容可以在兩個地址區(qū)域訪問,0x00000000或0x08000000。
從系統(tǒng)存儲器啟動:系統(tǒng)存儲器被映射到啟動空間(0x00000000),但仍然能夠在它原有的地址(互聯(lián)型(產(chǎn)品)原有地址為0x1FFFB000,其它產(chǎn)品原有地址為0x1FFFF000)訪問它。
從內(nèi)置SRAM啟動:只能在0x20000000開始的地址區(qū)訪問SRAM(當(dāng)從內(nèi)置SRAM啟動,在應(yīng)用程序的初始化代碼中,必須使用NVIC的異常表和偏移(寄存器),重新映射向量表到SRAM中)。
一般情況下都是從主閃存模式啟動的,也就是用戶代碼被燒寫到0x08000000地址處。內(nèi)嵌的自舉程序(Bootlo(ad)er)內(nèi)嵌的自舉程序存放在系統(tǒng)存儲區(qū),由ST在生產(chǎn)線上寫入,用于通過可用的串行(接口)對閃存存儲器進行重新(編程),也就是這個自舉程序在出廠的時候就已經(jīng)固化了。大家可以想一下內(nèi)嵌的自舉程序的作用是什么?想不出來也沒關(guān)系,后面會講到。如果想要詳細了解這個自舉程序到底干了什么,可以看下官方文檔:STM32microcontrollersystemmemorybootmode3.可執(zhí)行文件的形成過程STM32|hex文件、bin文件、axf文件的區(qū)別?大家可以看下這篇博文,寫的還是挺不錯的!描述了最終燒寫到STM32中的可執(zhí)行代碼的形成過程。4.三種復(fù)位
(硬件)復(fù)位
顧名思義通過硬件給系統(tǒng)一個復(fù)位,比如在電路板上設(shè)計一復(fù)位電路,通過按下按鍵就可以給系統(tǒng)實現(xiàn)一個復(fù)位,而無論系統(tǒng)在執(zhí)行什么樣的程序。復(fù)位后初始化一些配置芯片,硬件復(fù)位的作用區(qū)域一般是全局的。
軟件復(fù)位
是通過軟件給系統(tǒng)一個復(fù)位(信號),如低電平或許是高電平(具體看系統(tǒng)設(shè)置)來實現(xiàn)復(fù)位操作軟件復(fù)位一般是一些塊結(jié)構(gòu)復(fù)位。
上電復(fù)位
系統(tǒng)在上電的瞬間就執(zhí)行復(fù)位操作,上電復(fù)位里面包括硬件復(fù)位和軟復(fù)位的操作,硬件復(fù)位和軟復(fù)位是從上電復(fù)位里面的某點開始的啟動操作。復(fù)位需要初始化CPU系統(tǒng),包括CPU和內(nèi)存等。
驗證猜想
1.驗證猜想-1對于猜想1,其實不需要驗證。代碼肯定是要存儲在掉電不丟失的存儲介質(zhì)上,否則,每次重新上電都要重新燒寫程序,這是與事實相反的。而在實驗前必備知識中,我們了解到STM32內(nèi)部的XIP設(shè)備,那不就是代碼存儲的地方嗎?并且也在STM32啟動方式中詳細地描述了代碼存儲位置。
如果從主FLASH啟動,用戶代碼存儲在0X08000000
如果從SYSTEMMEMORY啟動,里面存儲的是Bootloader,是芯片出廠的時候就已經(jīng)固化好了的,可以從中讀數(shù)據(jù),但是不可以向其中寫數(shù)據(jù),它的作用就是:將用戶程序通過可用的外設(shè)燒寫到指定的地址處,然后啟動STM32。
如果從SRAM啟動,用戶代碼存儲在0X20000000
2.驗證猜想-2實驗前的必備知識中已經(jīng)大概地描述了最終燒寫到STM32中的可執(zhí)行文件的形成過程,現(xiàn)在我們需要驗證的就是如何將可執(zhí)行文件燒寫到指定的存儲設(shè)備中去(假設(shè)是FLASH,其實也可以是SRAM)我第一次使用Fly(mcu)(串口(下載)軟件的時候),我腦海里就有一個疑問,就是這個軟件到底是怎樣使得STM32將生成的代碼燒寫到內(nèi)部FLASH上的。這真的是很不可思議!因為STM32上電復(fù)位后肯定是要執(zhí)行代碼的,可是我還沒有給它代碼呢,它怎么會運作呢?當(dāng)時我真的很迷惑。其實,STM32出廠的時候Bootloader(用于將用戶程序下載到STM32內(nèi)部指定地址處的固件(程序))就已經(jīng)固化在了SystemMemory上了,可讀寫無效。從STM32啟動配置一節(jié)中我們知道,可以通過對BOOT1和BOOT0引腳上高低電平的改變從而實現(xiàn)STM32啟動方式的不同。
如上所說,Bootloader存儲在SytemMemory上,如果想要讓Bootloader運行(將用戶程序下載到指定內(nèi)存地址處),那啟動模式肯定是要選擇以系統(tǒng)存儲器的方式啟動。
BOOT1=0
BOOT0=1->系統(tǒng)存儲器模式
因此,外部電路的設(shè)計的目的就是要能夠達到能夠?qū)OOT1和BOOT0引腳上高低電平改變的能力。接下來,我們就以正點原子的原理圖(探索者)為例,來看下STM32外部的電路到底是如何設(shè)計的,以及Flymcu到底是怎樣控制BOOT1和BOOT0引腳上高低電平改變從而達到具有使得STM32從系統(tǒng)存儲器啟動的的神奇能力。
如上圖所示,這就是正點原子探索者一鍵下載電路。一鍵下載電路涉及到(模電)知識,下面這篇文章寫的還不錯,并且還描述了CH340G芯片引腳的作用和功能。stm32一鍵下載電路(下一篇文章)從上圖我們可以知道,F(xiàn)lymcu肯定是通過(usb)線將數(shù)據(jù)或指令寫入CH340G內(nèi)(CH340D+CH340D-)然后CH340G根據(jù)來自usb的指令進行相應(yīng)的工作。CH340G在此電路中的工作就兩個:
與STM32進行數(shù)據(jù)交互
控制BOOT0和RESET高低電平的變化
特別注意:正點原子探索者BOOT0和BOOT1引腳默認都是接地
BOOT0、BOOT1是通過(跳線帽)和地進行連接的現(xiàn)在我們知道了,控制BOOT1和BOOT0引腳上高低電平改變是CH340G的作用,而CH340G是嚴格按照來自Flymcu的指令進行的,所以,控制BOOT1和BOOT0引腳上高低電平改變的幕后黑手就是Flymcu。注意:向FLASH中燒寫程序不僅僅只有串口,由于硬件平臺的限制,因此分析串口下載。問題來了,那Flymcu到底干了什么,它是如何將用戶程序燒寫的STM32內(nèi)部指定地址處?以跑馬燈為例,看下Flymcu燒寫程序過程中輸出的信息。
DTR電平置低:復(fù)位
RTS電平置高:進入Bootloader
延時100ms:有誰能夠告訴我為什么
DTR電平置高:釋放復(fù)位
RTS維持高:此時開始運行Bootloader
開始連接:Flymcu要與STM32連接肯定是要發(fā)送特定的指令,并且當(dāng)STM32接收到預(yù)先約定好的指令時,也會發(fā)送特定的回復(fù)。(和接頭的性質(zhì)差不多)
注意:STM32從Bootloader啟動到能夠與外部設(shè)備進行數(shù)據(jù)交互需要一定的時間,因此連接需要一定的時間
讀出關(guān)于芯片相關(guān)的數(shù)據(jù)
讀出選項字節(jié)
進行全片擦除,去除寫保護,再次重啟Bootloader(有大佬能告訴我為什么)
編寫程序,從0x08000000處開始運行
上述的過程中,大家比較疑惑的地方就是,F(xiàn)lymcu發(fā)送給STM32的指令到底是什么,這個指令肯定是事先就確定好的,在這個文檔中提及到了。stm32microcontrollersystemmemorybootmode這個手冊中的內(nèi)容大家可以自己詳細地去看下,內(nèi)容不多,我就粗略地說一下必要的知識點。硬件連接需要(文檔中的第35頁)通過串口與外部設(shè)備進行數(shù)據(jù)交互時STM32外部(電路設(shè)計)。
通過DFU與外部設(shè)備進行數(shù)據(jù)交互時STM32外部電路設(shè)計
還有其他的連接方式,我想表述的意思就是:Bootloader與外部設(shè)備進行數(shù)據(jù)交互的方式有很多種,不僅僅只有串口,只是由于硬件平臺有限(正點原子只有通過串口下載的接口(調(diào)試接口除外))而根據(jù)不同的交互方式,STM32外部的電路設(shè)計又大不相同。Bootloader啟動流程
從啟動流程中我們就可以得到Flymcu發(fā)送給STM32的特定連接指令為:0x7F。STM32F40xxx/41xxxdevicesbootloaderversion
通過版本信息中紅色畫線部分可以得知,當(dāng)Bootloader接收到相應(yīng)的命令之后,就會連續(xù)發(fā)送兩個response。我們這個時候再看下Flymcu中的輸出信息,
通過紅色畫線部分可以看出,F(xiàn)lymcu接收到兩個來自Bootloader的信息。此時,接頭成功!?。。?!接頭成功后肯定就可以進行數(shù)據(jù)交互了?。?!因此,我們最初的猜想是正確的:即STM32通過某種外設(shè)將可執(zhí)行文件燒寫至FLASH上(也可以是SRAM)驗證猜想-3博客當(dāng)中已經(jīng)多次提及到,STM32不僅可以從FLASH上啟動,還可以從SRAM上啟動。并且在STM32啟動配置中有一個小提示:從SRAM中啟動,需要重新設(shè)置中斷向量表。中斷向量表的設(shè)置是用戶在用戶程序中自己實現(xiàn)的?。?!要驗證這個猜想,可以從SRAM中啟動,但是不設(shè)置中斷向量表,看一下會出現(xiàn)什么情況。
由于正點原子的電路設(shè)計(因為我使用的就是正點原子的探索者開發(fā)板),使得無法通過串口進行SRAM啟動,只能通過調(diào)試接口下載程序。
注意:SRAM是掉電數(shù)據(jù)就會丟失的存儲器介質(zhì),因此使用時(前提是已經(jīng)掉電)要重新下載程序從SRAM中啟動的最主要的目的是用來調(diào)試程序,產(chǎn)品中的用戶程序肯定都是存儲在FLASH上的,不然每次掉電后用戶程序都沒了?。?!
如何通過調(diào)試接口將用戶程序下載到SRAM處,可以參考一下下面兩篇博文:
STM32內(nèi)部SRAM調(diào)試程序
在SRAM中調(diào)試代碼
假設(shè)你現(xiàn)在已經(jīng)實現(xiàn)了能夠通過調(diào)試接口將用戶程序下載到SRAM處,那么接下來,我們來驗證一下。如果沒有重新設(shè)置中斷向量表會出現(xiàn)什么結(jié)果。得出結(jié)論,總結(jié)歸納對于最開始提出的三個猜想,現(xiàn)在可以得出結(jié)論:
指令存儲在掉電不丟失的存儲介質(zhì)上
STM32通過某種外設(shè)將可執(zhí)行文件燒寫至掉電不丟失的存儲介質(zhì)上
中斷向量表的首地
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度紅酒品牌授權(quán)許可使用及維權(quán)合同
- 2025年度跨河涵洞工程勞務(wù)合作合同
- 2025年度跨境電商交易委托合同范本
- 2025年度新能源汽車充電樁建設(shè)與運營管理合同-@-8
- 經(jīng)典新郎婚禮致辭集錦15篇
- 2025年度城市綠地系統(tǒng)規(guī)劃與建設(shè)一體化服務(wù)合同
- 2025年度化妝品研發(fā)成果轉(zhuǎn)化與轉(zhuǎn)讓合同范本
- 2025年度化妝品銷售渠道拓展合作返利協(xié)議
- 聽評課記錄30篇內(nèi)容范文
- 2025年中國端側(cè)AI行業(yè)市場現(xiàn)狀及投資態(tài)勢分析報告(智研咨詢)
- 【幼兒園戶外體育活動材料投放的現(xiàn)狀調(diào)查報告(定量論文)8700字】
- 剪映專業(yè)版:PC端短視頻制作(全彩慕課版) 課件 第3章 短視頻剪輯快速入門
- 湖南省長沙市開福區(qū)青竹湖湘一外國語學(xué)校2023-2024學(xué)年九年級下學(xué)期一模歷史試題
- 帶狀皰疹與帶狀皰疹后遺神經(jīng)痛(HZ與PHN)
- 漢密爾頓抑郁和焦慮量表
- 風(fēng)電場事故案例分析
- 前列腺癌的診斷與治療
- 人教版八年級數(shù)學(xué)初中數(shù)學(xué)《平行四邊形》單元教材教學(xué)分析
- EPC項目設(shè)計及施工的配合
- 年產(chǎn)5萬噸1,4-丁二醇的工藝流程設(shè)計
- 八年級上冊-2024年中考歷史總復(fù)習(xí)核心考點與重難點(部編版)
評論
0/150
提交評論