版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第第頁詳細(xì)的STM32啟動配置流程解析大家不妨設(shè)想一下,(cpu)的工作是什么,cpu是沒有主觀意識的,它只會按照特定的指令執(zhí)行相應(yīng)的操作,用專業(yè)術(shù)語來說就是:取指->譯碼->執(zhí)行,譯碼和執(zhí)行肯定是在cpu內(nèi)部進(jìn)行操作的,并且前提是已經(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è)置中斷向量表
接下來,我們將圍繞這三個問題進(jìn)行解答
猜想
既然cpu上電復(fù)位后第一步操作就是取指令,那么這個指令肯定是存儲在掉電不丟失的存儲介質(zhì)上((rom)、flash)。
猜想1:指令存儲在掉電不丟失的存儲介質(zhì)上
我們最終生成的、cpu可以執(zhí)行的可執(zhí)行文件肯定是要通過某種外設(shè)將用戶程序燒寫到FLASH上,這一點(diǎn)肯定是毋庸置疑的,因?yàn)閏pu與外圍設(shè)備進(jìn)行數(shù)據(jù)交互的時(shí)候是通過外設(shè)(控制器)來進(jìn)行的。
猜想2:通過某種外設(shè)將可執(zhí)行文件燒寫至FLASH上
STM32的FLASH基地址為0X08000000,SRAM基地址為0X20000000??刹豢赡苁且?yàn)檫@兩個存儲介質(zhì)的地址不同,所以才要重新設(shè)置中斷向量表。因?yàn)槲覀兌贾溃袛嘞蛄勘淼氖椎刂肪褪浅绦虻娜肟诘刂贰?/p>
猜想3:可能與基地址有關(guān)
實(shí)驗(yàn)驗(yàn)證
實(shí)驗(yàn)前必備知識
1.XIP設(shè)備eXecu(te)InPl(ac)e,即芯片內(nèi)執(zhí)行,指應(yīng)用程序可以直接在flash閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng)RAM中。在我們的印象里,應(yīng)用程序必須要從硬盤中加載到內(nèi)存當(dāng)中才可以被運(yùn)行,但實(shí)際上應(yīng)用程序是可以直接在flash閃存運(yùn)行的,也就是說,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)存圖是通過映射的方式將芯片的框圖進(jìn)行映射得到的,也就是說,上述這幅圖是為了開發(fā)人員更好地面向芯片編程而抽象出來的一幅圖。我們先來看下面這副圖STM32F1框圖:
STM32F4框圖:
對比兩幅框圖可以看出,F(xiàn)4比F1復(fù)雜很多,特別體現(xiàn)在外設(shè)上,架構(gòu)還是差不多的。
紅色箭頭所指向的就是譯碼電路。如果你學(xué)過微機(jī)原理,那么你肯定知道,外設(shè)是通過譯碼電路連接到地址總線上,每一個外設(shè)都有其相對應(yīng)的內(nèi)存范圍,當(dāng)cpu發(fā)出的地址信息處于某一個外設(shè)的地址范圍內(nèi),就選中了該外設(shè),cpu就可以與該外設(shè)進(jìn)行數(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í)行代碼。(這里先不驗(yàn)證,在之后的博客中會進(jìn)行驗(yàn)證,但你需要記住,后面用的上)因?yàn)楣潭ǖ拇鎯ζ饔诚瘢a區(qū)始終從地址0x00000000開始(通過(IC)ode和(DC)ode總線訪問),而數(shù)據(jù)區(qū)(SRAM)始終從地址0x20000000開始(通過系統(tǒng)總線訪問)。Cortex-M3的CPU始終從ICode總線獲取復(fù)位向量,即啟動僅適合于從代碼區(qū)開始(典型地從Flash啟動)。STM32F10xxx(微控制器)實(shí)現(xiàn)了一個特殊的機(jī)制,系統(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ìn)行重新(編程),也就是這個自舉程序在出廠的時(shí)候就已經(jīng)固化了。大家可以想一下內(nèi)嵌的自舉程序的作用是什么?想不出來也沒關(guān)系,后面會講到。如果想要詳細(xì)了解這個自舉程序到底干了什么,可以看下官方文檔:STM32microcontrollersystemmemorybootmode3.可執(zhí)行文件的形成過程STM32|hex文件、bin文件、axf文件的區(qū)別?大家可以看下這篇博文,寫的還是挺不錯的!描述了最終燒寫到STM32中的可執(zhí)行代碼的形成過程。4.三種復(fù)位
(硬件)復(fù)位
顧名思義通過硬件給系統(tǒng)一個復(fù)位,比如在電路板上設(shè)計(jì)一復(fù)位電路,通過按下按鍵就可以給系統(tǒng)實(shí)現(xiàn)一個復(fù)位,而無論系統(tǒng)在執(zhí)行什么樣的程序。復(fù)位后初始化一些配置芯片,硬件復(fù)位的作用區(qū)域一般是全局的。
軟件復(fù)位
是通過軟件給系統(tǒng)一個復(fù)位(信號),如低電平或許是高電平(具體看系統(tǒng)設(shè)置)來實(shí)現(xiàn)復(fù)位操作軟件復(fù)位一般是一些塊結(jié)構(gòu)復(fù)位。
上電復(fù)位
系統(tǒng)在上電的瞬間就執(zhí)行復(fù)位操作,上電復(fù)位里面包括硬件復(fù)位和軟復(fù)位的操作,硬件復(fù)位和軟復(fù)位是從上電復(fù)位里面的某點(diǎn)開始的啟動操作。復(fù)位需要初始化CPU系統(tǒng),包括CPU和內(nèi)存等。
驗(yàn)證猜想
1.驗(yàn)證猜想-1對于猜想1,其實(shí)不需要驗(yàn)證。代碼肯定是要存儲在掉電不丟失的存儲介質(zhì)上,否則,每次重新上電都要重新燒寫程序,這是與事實(shí)相反的。而在實(shí)驗(yàn)前必備知識中,我們了解到STM32內(nèi)部的XIP設(shè)備,那不就是代碼存儲的地方嗎?并且也在STM32啟動方式中詳細(xì)地描述了代碼存儲位置。
如果從主FLASH啟動,用戶代碼存儲在0X08000000
如果從SYSTEMMEMORY啟動,里面存儲的是Bootloader,是芯片出廠的時(shí)候就已經(jīng)固化好了的,可以從中讀數(shù)據(jù),但是不可以向其中寫數(shù)據(jù),它的作用就是:將用戶程序通過可用的外設(shè)燒寫到指定的地址處,然后啟動STM32。
如果從SRAM啟動,用戶代碼存儲在0X20000000
2.驗(yàn)證猜想-2實(shí)驗(yàn)前的必備知識中已經(jīng)大概地描述了最終燒寫到STM32中的可執(zhí)行文件的形成過程,現(xiàn)在我們需要驗(yàn)證的就是如何將可執(zhí)行文件燒寫到指定的存儲設(shè)備中去(假設(shè)是FLASH,其實(shí)也可以是SRAM)我第一次使用Fly(mcu)(串口(下載)軟件的時(shí)候),我腦海里就有一個疑問,就是這個軟件到底是怎樣使得STM32將生成的代碼燒寫到內(nèi)部FLASH上的。這真的是很不可思議!因?yàn)镾TM32上電復(fù)位后肯定是要執(zhí)行代碼的,可是我還沒有給它代碼呢,它怎么會運(yùn)作呢?當(dāng)時(shí)我真的很迷惑。其實(shí),STM32出廠的時(shí)候Bootloader(用于將用戶程序下載到STM32內(nèi)部指定地址處的固件(程序))就已經(jīng)固化在了SystemMemory上了,可讀寫無效。從STM32啟動配置一節(jié)中我們知道,可以通過對BOOT1和BOOT0引腳上高低電平的改變從而實(shí)現(xiàn)STM32啟動方式的不同。
如上所說,Bootloader存儲在SytemMemory上,如果想要讓Bootloader運(yùn)行(將用戶程序下載到指定內(nèi)存地址處),那啟動模式肯定是要選擇以系統(tǒng)存儲器的方式啟動。
BOOT1=0
BOOT0=1->系統(tǒng)存儲器模式
因此,外部電路的設(shè)計(jì)的目的就是要能夠達(dá)到能夠?qū)OOT1和BOOT0引腳上高低電平改變的能力。接下來,我們就以正點(diǎn)原子的原理圖(探索者)為例,來看下STM32外部的電路到底是如何設(shè)計(jì)的,以及Flymcu到底是怎樣控制BOOT1和BOOT0引腳上高低電平改變從而達(dá)到具有使得STM32從系統(tǒng)存儲器啟動的的神奇能力。
如上圖所示,這就是正點(diǎn)原子探索者一鍵下載電路。一鍵下載電路涉及到(模電)知識,下面這篇文章寫的還不錯,并且還描述了CH340G芯片引腳的作用和功能。stm32一鍵下載電路(下一篇文章)從上圖我們可以知道,F(xiàn)lymcu肯定是通過(usb)線將數(shù)據(jù)或指令寫入CH340G內(nèi)(CH340D+CH340D-)然后CH340G根據(jù)來自usb的指令進(jìn)行相應(yīng)的工作。CH340G在此電路中的工作就兩個:
與STM32進(jìn)行數(shù)據(jù)交互
控制BOOT0和RESET高低電平的變化
特別注意:正點(diǎn)原子探索者BOOT0和BOOT1引腳默認(rèn)都是接地
BOOT0、BOOT1是通過(跳線帽)和地進(jìn)行連接的現(xiàn)在我們知道了,控制BOOT1和BOOT0引腳上高低電平改變是CH340G的作用,而CH340G是嚴(yán)格按照來自Flymcu的指令進(jìn)行的,所以,控制BOOT1和BOOT0引腳上高低電平改變的幕后黑手就是Flymcu。注意:向FLASH中燒寫程序不僅僅只有串口,由于硬件平臺的限制,因此分析串口下載。問題來了,那Flymcu到底干了什么,它是如何將用戶程序燒寫的STM32內(nèi)部指定地址處?以跑馬燈為例,看下Flymcu燒寫程序過程中輸出的信息。
DTR電平置低:復(fù)位
RTS電平置高:進(jìn)入Bootloader
延時(shí)100ms:有誰能夠告訴我為什么
DTR電平置高:釋放復(fù)位
RTS維持高:此時(shí)開始運(yùn)行Bootloader
開始連接:Flymcu要與STM32連接肯定是要發(fā)送特定的指令,并且當(dāng)STM32接收到預(yù)先約定好的指令時(shí),也會發(fā)送特定的回復(fù)。(和接頭的性質(zhì)差不多)
注意:STM32從Bootloader啟動到能夠與外部設(shè)備進(jìn)行數(shù)據(jù)交互需要一定的時(shí)間,因此連接需要一定的時(shí)間
讀出關(guān)于芯片相關(guān)的數(shù)據(jù)
讀出選項(xiàng)字節(jié)
進(jìn)行全片擦除,去除寫保護(hù),再次重啟Bootloader(有大佬能告訴我為什么)
編寫程序,從0x08000000處開始運(yùn)行
上述的過程中,大家比較疑惑的地方就是,F(xiàn)lymcu發(fā)送給STM32的指令到底是什么,這個指令肯定是事先就確定好的,在這個文檔中提及到了。stm32microcontrollersystemmemorybootmode這個手冊中的內(nèi)容大家可以自己詳細(xì)地去看下,內(nèi)容不多,我就粗略地說一下必要的知識點(diǎn)。硬件連接需要(文檔中的第35頁)通過串口與外部設(shè)備進(jìn)行數(shù)據(jù)交互時(shí)STM32外部(電路設(shè)計(jì))。
通過DFU與外部設(shè)備進(jìn)行數(shù)據(jù)交互時(shí)STM32外部電路設(shè)計(jì)
還有其他的連接方式,我想表述的意思就是:Bootloader與外部設(shè)備進(jìn)行數(shù)據(jù)交互的方式有很多種,不僅僅只有串口,只是由于硬件平臺有限(正點(diǎn)原子只有通過串口下載的接口(調(diào)試接口除外))而根據(jù)不同的交互方式,STM32外部的電路設(shè)計(jì)又大不相同。Bootloader啟動流程
從啟動流程中我們就可以得到Flymcu發(fā)送給STM32的特定連接指令為:0x7F。STM32F40xxx/41xxxdevicesbootloaderversion
通過版本信息中紅色畫線部分可以得知,當(dāng)Bootloader接收到相應(yīng)的命令之后,就會連續(xù)發(fā)送兩個response。我們這個時(shí)候再看下Flymcu中的輸出信息,
通過紅色畫線部分可以看出,F(xiàn)lymcu接收到兩個來自Bootloader的信息。此時(shí),接頭成功?。。。。〗宇^成功后肯定就可以進(jìn)行數(shù)據(jù)交互了?。。∫虼?,我們最初的猜想是正確的:即STM32通過某種外設(shè)將可執(zhí)行文件燒寫至FLASH上(也可以是SRAM)驗(yàn)證猜想-3博客當(dāng)中已經(jīng)多次提及到,STM32不僅可以從FLASH上啟動,還可以從SRAM上啟動。并且在STM32啟動配置中有一個小提示:從SRAM中啟動,需要重新設(shè)置中斷向量表。中斷向量表的設(shè)置是用戶在用戶程序中自己實(shí)現(xiàn)的?。?!要驗(yàn)證這個猜想,可以從SRAM中啟動,但是不設(shè)置中斷向量表,看一下會出現(xiàn)什么情況。
由于正點(diǎn)原子的電路設(shè)計(jì)(因?yàn)槲沂褂玫木褪钦c(diǎn)原子的探索者開發(fā)板),使得無法通過串口進(jìn)行SRAM啟動,只能通過調(diào)試接口下載程序。
注意:SRAM是掉電數(shù)據(jù)就會丟失的存儲器介質(zhì),因此使用時(shí)(前提是已經(jīng)掉電)要重新下載程序從SRAM中啟動的最主要的目的是用來調(diào)試程序,產(chǎn)品中的用戶程序肯定都是存儲在FLASH上的,不然每次掉電后用戶程序都沒了?。。?/p>
如何通過調(diào)試接口將用戶程序下載到SRAM處,可以參考一下下面兩篇博文:
STM32內(nèi)部SRAM調(diào)試程序
在SRAM中調(diào)試代碼
假設(shè)你現(xiàn)在已經(jīng)實(shí)現(xiàn)了能夠通過調(diào)試接口將用戶程序下載到SRAM處,那么接下來,我們來驗(yàn)證一下。如果沒有重新設(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年行李自動分檢系統(tǒng)項(xiàng)目發(fā)展計(jì)劃
- 2025年藥物載體材料項(xiàng)目合作計(jì)劃書
- 甲狀腺疾病的飲食調(diào)理
- 嗆奶課件VIP教學(xué)課件
- 遼寧省2025秋九年級英語全冊Unit9IlikemusicthatIcandanceto課時(shí)2SectionA(3a-3c)課件新版人教新目標(biāo)版
- 員工執(zhí)行力培訓(xùn)課件
- 2025年焙烤食品項(xiàng)目建議書
- 2025年金屬切削工具合作協(xié)議書
- 2025年超低頻測振儀項(xiàng)目發(fā)展計(jì)劃
- 個人護(hù)理基礎(chǔ)理論課件下載
- 急危重癥護(hù)理培訓(xùn)心得
- 大學(xué)體育-瑜伽學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 超星爾雅學(xué)習(xí)通《文獻(xiàn)信息檢索與利用(成都航空職業(yè)技術(shù)學(xué)院)》2024章節(jié)測試答案
- 21 小圣施威降大圣
- 【未知機(jī)構(gòu)】華為公司戰(zhàn)略規(guī)劃和落地方法之五看三定工具解析
- 企業(yè)微信指導(dǎo)手冊管理員版
- DL-T 2582.1-2022 水電站公用輔助設(shè)備運(yùn)行規(guī)程 第1部分:油系統(tǒng)
- (完整word版)勞動合同書(電子版)正規(guī)范本(通用版)
- 初中物理實(shí)驗(yàn)通知單
- 勞務(wù)承包通用合同
- 電力系統(tǒng)繼電保護(hù)原理課程設(shè)計(jì)-110kV電網(wǎng)距離保護(hù)設(shè)計(jì)
評論
0/150
提交評論