国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

詳細(xì)的STM32啟動(dòng)配置流程解析

發(fā)布者:SereneSunset最新更新時(shí)間:2024-08-09 來(lái)源: elecfans關(guān)鍵字:STM32  啟動(dòng)配置 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

大家不妨設(shè)想一下,cpu 的工作是什么,cpu 是沒(méi)有主觀意識(shí)的,它只會(huì)按照特定的指令執(zhí)行相應(yīng)的操作,用專業(yè)術(shù)語(yǔ)來(lái)說(shuō)就是:取指 -> 譯碼 -> 執(zhí)行,譯碼和執(zhí)行肯定是在 cpu 內(nèi)部進(jìn)行操作的,并且前提是已經(jīng)取到了指令。那現(xiàn)在問(wèn)題來(lái)了,指令在哪?

d3d5cafc-17aa-11ee-962d-dac502259ad0.png

cpu上電復(fù)位后執(zhí)行的第一步操作就是取指令

問(wèn)題1:指令存儲(chǔ)在何處

我們?cè)陔娔X上編寫(xiě)的程序最終是要燒寫(xiě)到芯片內(nèi)部的 FLASH中(此處特指STM32)。

問(wèn)題2:如何將可執(zhí)行文件燒寫(xiě)至 FLASH 上

STM32 的啟動(dòng)方式有很多種,從主存 FLASH 啟動(dòng),從 system memory 啟動(dòng),從 SRAM 中啟動(dòng)。

問(wèn)題3:從 SRAM 中啟動(dòng),為什么需要重新設(shè)置中斷向量表

接下來(lái),我們將圍繞這三個(gè)問(wèn)題進(jìn)行解答

猜想

既然 cpu 上電復(fù)位后第一步操作就是取指令,那么這個(gè)指令肯定是存儲(chǔ)在掉電不丟失的存儲(chǔ)介質(zhì)上(rom、flash)。

猜想1:指令存儲(chǔ)在掉電不丟失的存儲(chǔ)介質(zhì)上

我們最終生成的、cpu可以執(zhí)行的可執(zhí)行文件肯定是要通過(guò)某種外設(shè)將用戶程序燒寫(xiě)到 FLASH 上,這一點(diǎn)肯定是毋庸置疑的,因?yàn)?cpu 與外圍設(shè)備進(jìn)行數(shù)據(jù)交互的時(shí)候是通過(guò)外設(shè)控制器來(lái)進(jìn)行的。

猜想2:通過(guò)某種外設(shè)將可執(zhí)行文件燒寫(xiě)至 FLASH 上

STM32 的 FLASH 基地址為 0X0800 0000 ,SRAM 基地址為 0X2000 0000??刹豢赡苁且?yàn)檫@兩個(gè)存儲(chǔ)介質(zhì)的地址不同,所以才要重新設(shè)置中斷向量表。 因?yàn)槲覀兌贾溃袛嘞蛄勘淼氖椎刂肪褪浅绦虻娜肟诘刂贰?p>猜想3:可能與基地址有關(guān)

實(shí)驗(yàn)驗(yàn)證

實(shí)驗(yàn)前必備知識(shí)

1. XIP設(shè)備 eXecute In Place,即芯片內(nèi)執(zhí)行,指應(yīng)用程序可以直接在 flash 閃存內(nèi)運(yùn)行,不必再把代碼讀到系統(tǒng) RAM中。在我們的印象里,應(yīng)用程序必須要從硬盤(pán)中加載到內(nèi)存當(dāng)中才可以被運(yùn)行,但實(shí)際上應(yīng)用程序是可以直接在flash 閃存運(yùn)行的,也就是說(shuō),cpu 可以直接從 flash 中取出指令。對(duì)于 STM32 而言,它是有 XIP 設(shè)備的。 STM32F1 內(nèi)存圖

d406f244-17aa-11ee-962d-dac502259ad0.png

如上圖所示,F(xiàn)LASH、SYSTEM MEMORY、OPTION BYTES 都是STM32內(nèi)部的XIP設(shè)備。 F1 內(nèi)存圖信息不是很全,再看下 F4 的內(nèi)存圖。 STM32F4內(nèi)存圖:

d42be0fe-17aa-11ee-962d-dac502259ad0.png

我們可以看到,不論是 F1 還是 F4,XIP 設(shè)備都屬于內(nèi)存圖中的 BLOCK0 區(qū)域內(nèi)。 這樣我們大概就知道了 STM32 內(nèi)部的 XIP 設(shè)備在 0x0000 0000 ~ 0x1FFF FFFF 內(nèi)。 上述的內(nèi)存圖是通過(guò)映射的方式將芯片的框圖進(jìn)行映射得到的,也就是說(shuō),上述這幅圖是為了開(kāi)發(fā)人員更好地面向芯片編程而抽象出來(lái)的一幅圖。我們先來(lái)看下面這副圖 STM32F1框圖:

d45475c8-17aa-11ee-962d-dac502259ad0.png

STM32F4框圖:

d48c85f8-17aa-11ee-962d-dac502259ad0.png

對(duì)比兩幅框圖可以看出,F(xiàn)4 比 F1 復(fù)雜很多,特別體現(xiàn)在外設(shè)上,架構(gòu)還是差不多的。

d4b8abec-17aa-11ee-962d-dac502259ad0.png

紅色箭頭所指向的就是譯碼電路。 如果你學(xué)過(guò)微機(jī)原理,那么你肯定知道,外設(shè)是通過(guò)譯碼電路連接到地址總線上,每一個(gè)外設(shè)都有其相對(duì)應(yīng)的內(nèi)存范圍,當(dāng) cpu 發(fā)出的地址信息處于某一個(gè)外設(shè)的地址范圍內(nèi),就選中了該外設(shè),cpu就可以與該外設(shè)進(jìn)行數(shù)據(jù)交互。 一個(gè)外設(shè)對(duì)應(yīng)一個(gè)內(nèi)存范圍,那所有的外設(shè)結(jié)合起來(lái),是不是就是對(duì)應(yīng)一張圖了。

2. STM32 啟動(dòng)配置 在 STM32F10xxx 里,可以通過(guò) BOOT[1:0] 引腳選擇三種不同啟動(dòng)模式。

d4f1929a-17aa-11ee-962d-dac502259ad0.png

在系統(tǒng)復(fù)位后,SYSCLK 的第 4 個(gè)上升沿, BOOT 引腳的值將被鎖存。用戶可以通過(guò)設(shè)置 BOOT1 和 BOOT0 引腳的狀態(tài),來(lái)選擇在復(fù)位后的啟動(dòng)模式。 在啟動(dòng)延遲之后, CPU 從地址 0x0000 0000 獲取堆棧頂?shù)牡刂?,并從啟?dòng)存儲(chǔ)器的 0x0000 0004 指示的地址開(kāi)始執(zhí)行代碼。(這里先不驗(yàn)證,在之后的博客中會(huì)進(jìn)行驗(yàn)證,但你需要記住,后面用的上) 因?yàn)楣潭ǖ拇鎯?chǔ)器映像,代碼區(qū)始終從地址 0x0000 0000 開(kāi)始(通過(guò) ICode 和 DCode 總線訪問(wèn)),而數(shù)據(jù)區(qū)(SRAM)始終從地址 0x2000 0000 開(kāi)始(通過(guò)系統(tǒng)總線訪問(wèn))。Cortex-M3 的 CPU 始終從 ICode 總線獲取復(fù)位向量,即啟動(dòng)僅適合于從代碼區(qū)開(kāi)始(典型地從 Flash 啟動(dòng))。STM32F10xxx 微控制器實(shí)現(xiàn)了一個(gè)特殊的機(jī)制,系統(tǒng)可以不僅僅從 Flash 存儲(chǔ)器或系統(tǒng)存儲(chǔ)器啟動(dòng),還可以從內(nèi)置 SRAM 啟動(dòng)。 根據(jù)選定的啟動(dòng)模式,主閃存存儲(chǔ)器、系統(tǒng)存儲(chǔ)器或 SRAM 可以按照以下方式訪問(wèn):

從主閃存存儲(chǔ)器啟動(dòng):主閃存存儲(chǔ)器被映射到啟動(dòng)空間(0x00000000),但仍然能夠在它原有的地址(0x08000000)訪問(wèn)它,即閃存存儲(chǔ)器的內(nèi)容可以在兩個(gè)地址區(qū)域訪問(wèn), 0x00000000 或 0x08000000。

從系統(tǒng)存儲(chǔ)器啟動(dòng):系統(tǒng)存儲(chǔ)器被映射到啟動(dòng)空間(0x00000000),但仍然能夠在它原有的地址(互聯(lián)型產(chǎn)品原有地址為 0x1FFFB000 ,其它產(chǎn)品原有地址為 0x1FFFF000 )訪問(wèn)它。

從內(nèi)置 SRAM 啟動(dòng):只能在 0x20000000 開(kāi)始的地址區(qū)訪問(wèn) SRAM(當(dāng)從內(nèi)置 SRAM 啟動(dòng),在應(yīng)用程序的初始化代碼中,必須使用 NVIC 的異常表和偏移寄存器,重新映射向量表到 SRAM 中)。

一般情況下都是從主閃存模式啟動(dòng)的,也就是用戶代碼被燒寫(xiě)到 0x08000000 地址處。 內(nèi)嵌的自舉程序 (Bootloader) 內(nèi)嵌的自舉程序存放在系統(tǒng)存儲(chǔ)區(qū),由 ST 在生產(chǎn)線上寫(xiě)入,用于通過(guò)可用的串行接口對(duì)閃存存儲(chǔ)器進(jìn)行重新編程,也就是這個(gè)自舉程序在出廠的時(shí)候就已經(jīng)固化了。大家可以想一下內(nèi)嵌的自舉程序的作用是什么?想不出來(lái)也沒(méi)關(guān)系,后面會(huì)講到。 如果想要詳細(xì)了解這個(gè)自舉程序到底干了什么,可以看下官方文檔: STM32 microcontroller system memory boot mode 3. 可執(zhí)行文件的形成過(guò)程 STM32 | hex文件、bin文件、axf文件的區(qū)別? 大家可以看下這篇博文,寫(xiě)的還是挺不錯(cuò)的!描述了最終燒寫(xiě)到STM32中的可執(zhí)行代碼的形成過(guò)程。 4. 三種復(fù)位

硬件復(fù)位

顧名思義通過(guò)硬件給系統(tǒng)一個(gè)復(fù)位,比如在電路板上設(shè)計(jì)一復(fù)位電路,通過(guò)按下按鍵就可以給系統(tǒng)實(shí)現(xiàn)一個(gè)復(fù)位,而無(wú)論系統(tǒng)在執(zhí)行什么樣的程序。復(fù)位后初始化一些配置芯片,硬件復(fù)位的作用區(qū)域一般是全局的。

軟件復(fù)位

是通過(guò)軟件給系統(tǒng)一個(gè)復(fù)位信號(hào),如低電平或許是高電平(具體看系統(tǒng)設(shè)置)來(lái)實(shí)現(xiàn)復(fù)位操作軟件復(fù)位一般是一些塊結(jié)構(gòu)復(fù)位。

上電復(fù)位

系統(tǒng)在上電的瞬間就執(zhí)行復(fù)位操作, 上電復(fù)位里面包括硬件復(fù)位和軟復(fù)位的操作,硬件復(fù)位和軟復(fù)位是從上電復(fù)位里面的某點(diǎn)開(kāi)始的啟動(dòng)操作。 復(fù)位需要初始化CPU系統(tǒng),包括CPU和內(nèi)存等。

驗(yàn)證猜想

1. 驗(yàn)證猜想-1 對(duì)于猜想1,其實(shí)不需要驗(yàn)證。代碼肯定是要存儲(chǔ)在掉電不丟失的存儲(chǔ)介質(zhì)上,否則,每次重新上電都要重新燒寫(xiě)程序,這是與事實(shí)相反的。而在實(shí)驗(yàn)前必備知識(shí)中,我們了解到 STM32 內(nèi)部的 XIP 設(shè)備,那不就是代碼存儲(chǔ)的地方嗎?并且也在 STM32 啟動(dòng)方式中詳細(xì)地描述了代碼存儲(chǔ)位置。

如果從主FLASH啟動(dòng),用戶代碼存儲(chǔ)在0X 0800 0000

如果從 SYSTEM MEMORY 啟動(dòng),里面存儲(chǔ)的是 Bootloader,是芯片出廠的時(shí)候就已經(jīng)固化好了的,可以從中讀數(shù)據(jù),但是不可以向其中寫(xiě)數(shù)據(jù),它的作用就是:將用戶程序通過(guò)可用的外設(shè)燒寫(xiě)到指定的地址處,然后啟動(dòng) STM32。

如果從 SRAM 啟動(dòng),用戶代碼存儲(chǔ)在 0X2000 0000

2. 驗(yàn)證猜想-2 實(shí)驗(yàn)前的必備知識(shí)中已經(jīng)大概地描述了最終燒寫(xiě)到 STM32 中的可執(zhí)行文件的形成過(guò)程,現(xiàn)在我們需要驗(yàn)證的就是如何將可執(zhí)行文件燒寫(xiě)到指定的存儲(chǔ)設(shè)備中去(假設(shè)是 FLASH,其實(shí)也可以是 SRAM) 我第一次使用 Flymcu(串口下載軟件的時(shí)候),我腦海里就有一個(gè)疑問(wèn),就是這個(gè)軟件到底是怎樣使得 STM32 將生成的代碼燒寫(xiě)到內(nèi)部 FLASH 上的。這真的是很不可思議!因?yàn)?STM32 上電復(fù)位后肯定是要執(zhí)行代碼的,可是我還沒(méi)有給它代碼呢,它怎么會(huì)運(yùn)作呢?當(dāng)時(shí)我真的很迷惑。 其實(shí),STM32 出廠的時(shí)候 Bootloader(用于將用戶程序下載到 STM32 內(nèi)部指定地址處的固件(程序))就已經(jīng)固化在了 System Memory 上了,可讀寫(xiě)無(wú)效。 從 STM32 啟動(dòng)配置一節(jié)中我們知道,可以通過(guò)對(duì) BOOT1 和 BOOT0 引腳上高低電平的改變從而實(shí)現(xiàn) STM32 啟動(dòng)方式的不同。

d5110bd4-17aa-11ee-962d-dac502259ad0.png

如上所說(shuō),Bootloader 存儲(chǔ)在 Sytem Memory 上,如果想要讓 Bootloader 運(yùn)行(將用戶程序下載到指定內(nèi)存地址處),那啟動(dòng)模式肯定是要選擇以系統(tǒng)存儲(chǔ)器的方式啟動(dòng)。

BOOT1 = 0    BOOT0 = 1 -> 系統(tǒng)存儲(chǔ)器模式

因此,外部電路的設(shè)計(jì)的目的就是要能夠達(dá)到能夠?qū)?BOOT1 和 BOOT0 引腳上高低電平改變的能力。 接下來(lái),我們就以正點(diǎn)原子的原理圖(探索者)為例,來(lái)看下 STM32 外部的電路到底是如何設(shè)計(jì)的,以及Flymcu 到底是怎樣控制 BOOT1 和 BOOT0 引腳上高低電平改變從而達(dá)到具有使得 STM32 從系統(tǒng)存儲(chǔ)器啟動(dòng)的的神奇能力。

d540199c-17aa-11ee-962d-dac502259ad0.png

如上圖所示,這就是正點(diǎn)原子探索者一鍵下載電路。 一鍵下載電路涉及到模電知識(shí),下面這篇文章寫(xiě)的還不錯(cuò),并且還描述了CH340G芯片引腳的作用和功能。 stm32一鍵下載電路(下一篇文章) 從上圖我們可以知道,F(xiàn)lymcu 肯定是通過(guò) usb 線將數(shù)據(jù)或指令寫(xiě)入 CH340G 內(nèi)(CH340 D + CH340 D- )然后CH340G 根據(jù)來(lái)自 usb 的指令進(jìn)行相應(yīng)的工作。 CH340G在此電路中的工作就兩個(gè):

與STM32進(jìn)行數(shù)據(jù)交互

控制BOOT0和RESET高低電平的變化

特別注意:正點(diǎn)原子探索者BOOT0和BOOT1引腳默認(rèn)都是接地

d5768662-17aa-11ee-962d-dac502259ad0.png

BOOT0、BOOT1是通過(guò)跳線帽和地進(jìn)行連接的 現(xiàn)在我們知道了,控制 BOOT1 和 BOOT0 引腳上高低電平改變是 CH340G 的作用,而 CH340G 是嚴(yán)格按照來(lái)自Flymcu 的指令進(jìn)行的,所以,控制 BOOT1 和 BOOT0 引腳上高低電平改變的幕后黑手就是 Flymcu。 注意:向 FLASH 中燒寫(xiě)程序不僅僅只有串口,由于硬件平臺(tái)的限制,因此分析串口下載。 問(wèn)題來(lái)了,那 Flymcu 到底干了什么,它是如何將用戶程序燒寫(xiě)的 STM32 內(nèi)部指定地址處? 以跑馬燈為例,看下Flymcu燒寫(xiě)程序過(guò)程中輸出的信息。

d5869458-17aa-11ee-962d-dac502259ad0.png

DTR 電平置低:復(fù)位

RTS 電平置高:進(jìn)入 Bootloader

延時(shí) 100ms :有誰(shuí)能夠告訴我為什么

DTR 電平置高:釋放復(fù)位

RTS 維持高 :此時(shí)開(kāi)始運(yùn)行 Bootloader

開(kāi)始連接 :Flymcu 要與 STM32 連接肯定是要發(fā)送特定的指令,并且當(dāng) STM32 接收到預(yù)先約定好的指令時(shí),也會(huì)發(fā)送特定的回復(fù)。(和接頭的性質(zhì)差不多)

注意:STM32 從 Bootloader 啟動(dòng)到能夠與外部設(shè)備進(jìn)行數(shù)據(jù)交互需要一定的時(shí)間,因此連接需要一定的時(shí)間

讀出關(guān)于芯片相關(guān)的數(shù)據(jù)

讀出選項(xiàng)字節(jié)

進(jìn)行全片擦除,去除寫(xiě)保護(hù),再次重啟 Bootloader(有大佬能告訴我為什么)

編寫(xiě)程序,從 0x0800 0000 處開(kāi)始運(yùn)行

上述的過(guò)程中,大家比較疑惑的地方就是,F(xiàn)lymcu 發(fā)送給 STM32 的指令到底是什么,這個(gè)指令肯定是事先就確定好的,在這個(gè)文檔中提及到了。 stm32 microcontroller system memory boot mode 這個(gè)手冊(cè)中的內(nèi)容大家可以自己詳細(xì)地去看下,內(nèi)容不多,我就粗略地說(shuō)一下必要的知識(shí)點(diǎn)。 硬件連接需要(文檔中的第35頁(yè)) 通過(guò)串口與外部設(shè)備進(jìn)行數(shù)據(jù)交互時(shí)STM32外部電路設(shè)計(jì)。

d5b69ea0-17aa-11ee-962d-dac502259ad0.png

通過(guò) DFU 與外部設(shè)備進(jìn)行數(shù)據(jù)交互時(shí) STM32 外部電路設(shè)計(jì)

d5b69ea0-17aa-11ee-962d-dac502259ad0.png

還有其他的連接方式,我想表述的意思就是: Bootloader 與外部設(shè)備進(jìn)行數(shù)據(jù)交互的方式有很多種,不僅僅只有串口,只是由于硬件平臺(tái)有限(正點(diǎn)原子只有通過(guò)串口下載的接口(調(diào)試接口除外))而根據(jù)不同的交互方式,STM32 外部的電路設(shè)計(jì)又大不相同。 Bootloader啟動(dòng)流程

d5f471d0-17aa-11ee-962d-dac502259ad0.png

從啟動(dòng)流程中我們就可以得到Flymcu發(fā)送給STM32的特定連接指令為:0x7F。 STM32F40xxx/41xxx devices bootloader version

d61927a0-17aa-11ee-962d-dac502259ad0.png

通過(guò)版本信息中紅色畫(huà)線部分可以得知,當(dāng) Bootloader 接收到相應(yīng)的命令之后,就會(huì)連續(xù)發(fā)送兩個(gè) response。我們這個(gè)時(shí)候再看下 Flymcu 中的輸出信息,

d6516908-17aa-11ee-962d-dac502259ad0.png

通過(guò)紅色畫(huà)線部分可以看出,F(xiàn)lymcu 接收到兩個(gè)來(lái)自 Bootloader 的信息。 此時(shí),接頭成功?。。。?! 接頭成功后肯定就可以進(jìn)行數(shù)據(jù)交互了?。。?因此,我們最初的猜想是正確的:即 STM32 通過(guò)某種外設(shè)將可執(zhí)行文件燒寫(xiě)至 FLASH 上(也可以是 SRAM) 驗(yàn)證猜想-3 博客當(dāng)中已經(jīng)多次提及到,STM32 不僅可以從 FLASH 上啟動(dòng),還可以從 SRAM 上啟動(dòng)。并且在STM32啟動(dòng)配置中有一個(gè)小提示:從 SRAM 中啟動(dòng),需要重新設(shè)置中斷向量表。 中斷向量表的設(shè)置是用戶在用戶程序中自己實(shí)現(xiàn)的?。?! 要驗(yàn)證這個(gè)猜想,可以從 SRAM 中啟動(dòng),但是不設(shè)置中斷向量表,看一下會(huì)出現(xiàn)什么情況。

d6812206-17aa-11ee-962d-dac502259ad0.png

由于正點(diǎn)原子的電路設(shè)計(jì)(因?yàn)槲沂褂玫木褪钦c(diǎn)原子的探索者開(kāi)發(fā)板),使得無(wú)法通過(guò)串口進(jìn)行 SRAM 啟動(dòng),只能通過(guò)調(diào)試接口下載程序。

注意:SRAM是掉電數(shù)據(jù)就會(huì)丟失的存儲(chǔ)器介質(zhì),因此使用時(shí)(前提是已經(jīng)掉電)要重新下載程序從 SRAM 中啟動(dòng)的最主要的目的是用來(lái)調(diào)試程序,產(chǎn)品中的用戶程序肯定都是存儲(chǔ)在 FLASH 上的,不然每次掉電后用戶程序都沒(méi)了?。?!

如何通過(guò)調(diào)試接口將用戶程序下載到 SRAM 處,可以參考一下下面兩篇博文:

STM32 內(nèi)部 SRAM 調(diào)試程序

在 SRAM 中調(diào)試代碼

假設(shè)你現(xiàn)在已經(jīng)實(shí)現(xiàn)了能夠通過(guò)調(diào)試接口將用戶程序下載到 SRAM 處,那么接下來(lái),我們來(lái)驗(yàn)證一下。如果沒(méi)有重新設(shè)置中斷向量表會(huì)出現(xiàn)什么結(jié)果。 得出結(jié)論,總結(jié)歸納 對(duì)于最開(kāi)始提出的三個(gè)猜想,現(xiàn)在可以得出結(jié)論:

指令存儲(chǔ)在掉電不丟失的存儲(chǔ)介質(zhì)上

STM32 通過(guò)某種外設(shè)將可執(zhí)行文件燒寫(xiě)至掉電不丟失的存儲(chǔ)介質(zhì)上

中斷向量表的首地址就是程序的入口地址

注意: 通過(guò)串口下載程序,實(shí)際上是 Flymcu(上位機(jī))與 STM32 內(nèi)置的 Bootloader 進(jìn)行數(shù)據(jù)交互,但兩者直接需要特定的硬件環(huán)境(CH340G(USB轉(zhuǎn)串口芯片)) 注意: 內(nèi)存圖中的 reserved 有些是不使用,有些是不能用(有其他重要的作用:可讀寫(xiě)忽略),不可以修改其值 看完這篇博客,你的腦海里必須得有一個(gè)流程的框架:

用戶面向單片機(jī)編寫(xiě)用戶代碼(C,C++,ASM)

用戶代碼通過(guò)交叉編譯工具鏈生成單片機(jī)可以執(zhí)行的可執(zhí)行文件(HEX,BIN,AXF)

上位機(jī):各種燒寫(xiě)工具(不局限于 Flymcu (因?yàn)?Bootloader 與外部設(shè)備進(jìn)行數(shù)據(jù)交互不僅僅只是通過(guò)USART)))與單片機(jī)內(nèi)部的 Bootloader 進(jìn)行數(shù)據(jù)交互(目的是將可執(zhí)行文件下載到指定的存儲(chǔ)地址處)

將可執(zhí)行文件下載到指定存儲(chǔ)地址處,然后還會(huì)繼續(xù)等待上位機(jī)的 command,可以通過(guò)復(fù)位或上位機(jī)發(fā)送跳轉(zhuǎn)到用戶代碼入口地址的命令執(zhí)行用戶程序。 這個(gè)流程的框架總結(jié)一句話就是: 可執(zhí)行程序 -> cpu執(zhí)行第一條用戶代碼的流程 至于 cpu 執(zhí)行第一條用戶代碼之后的流程后面的博客會(huì)詳細(xì)說(shuō)明,但毋庸置疑的是,這是一個(gè)重要轉(zhuǎn)折點(diǎn),在這個(gè)點(diǎn)之后執(zhí)行的是你自己編寫(xiě)的代碼,你比較熟悉這個(gè)過(guò)程,但是在這個(gè)點(diǎn)之前,對(duì)大部分人來(lái)說(shuō)都是都是比較陌生的,但是但你對(duì)這個(gè)過(guò)程了解之后,會(huì)對(duì)你的知識(shí)體系有非常大的提升。 希望這篇博客對(duì)你有所幫助。

關(guān)鍵字:STM32  啟動(dòng)配置 引用地址:詳細(xì)的STM32啟動(dòng)配置流程解析

上一篇:STM32F407 基本定時(shí)器使用
下一篇:獨(dú)立看門(mén)狗的理解

推薦閱讀最新更新時(shí)間:2025-07-12 16:49

STM32學(xué)習(xí)記錄11:啟動(dòng)配置
當(dāng)前的嵌入式應(yīng)用程序開(kāi)發(fā)過(guò)程里,C語(yǔ)言已成為了絕大部分場(chǎng)合的最佳選擇。如此一來(lái)main函數(shù)似乎成為了理所當(dāng)然的起點(diǎn) 因?yàn)镃程序往往從main函數(shù)開(kāi)始執(zhí)行。但一個(gè)經(jīng)常會(huì)被忽略的問(wèn)題是:微控制器(單片機(jī))上電后,是如何尋找到并執(zhí)行main函數(shù)的呢?很顯然微控制器無(wú)法從硬件上定位main函數(shù)的入口地址,因?yàn)槭褂肅語(yǔ)言作為開(kāi)發(fā)語(yǔ)言后,變量/函數(shù)的地址便由編譯器在編譯時(shí)自行分配,這樣一來(lái)main函數(shù)的入口地址在微控制器的內(nèi)部存儲(chǔ)空間中不再是絕對(duì)不變的。相信讀者都可以回答這個(gè)問(wèn)題,答案也許大同小異,但肯定都有個(gè)關(guān)鍵詞,叫 啟動(dòng)文件 ,用英文單詞來(lái)描述是 Bootloader 。 無(wú)論性能高下,結(jié)構(gòu)簡(jiǎn)繁,價(jià)格貴賤,每一種微控制器(處理器)
[單片機(jī)]
STM32 USB轉(zhuǎn)串口驅(qū)動(dòng)安裝不成功出現(xiàn)黃色感嘆號(hào)解決方法!
相信很多人在做USB轉(zhuǎn)串口時(shí)出現(xiàn)過(guò)串口驅(qū)動(dòng)安裝不成功,出現(xiàn)黃色感嘆號(hào)問(wèn)題, 出現(xiàn)這種問(wèn)題一般是驅(qū)動(dòng)安裝不成功造成的。    這里我就這個(gè)問(wèn)題總結(jié)幾個(gè)簡(jiǎn)單的方法。 方法1:   插上USB,利用驅(qū)動(dòng)人生安裝驅(qū)動(dòng)。 方法2:   先插上USB,去到設(shè)備管理器,把驅(qū)動(dòng)卸載,      然后再把USB拔掉,再插上,讓電腦自動(dòng)重新安裝驅(qū)動(dòng),反復(fù)幾次就可以了。 方法3:   有一種可能是STM32CubeMX分配的堆空間太小造成的,這里改變其大小即可,如下:       方法4:   還有一種原因是STM32F407的VBUS檢測(cè)功能默認(rèn)是開(kāi)啟,把該功能關(guān)閉即可。    以上就是我遇到過(guò)幾種USB轉(zhuǎn)串口驅(qū)動(dòng)安裝不成功的原因以及解決方
[單片機(jī)]
<font color='red'>STM32</font> USB轉(zhuǎn)串口驅(qū)動(dòng)安裝不成功出現(xiàn)黃色感嘆號(hào)解決方法!
STM32讀取HMC5883L的偏航角數(shù)據(jù)
HMC5883L是一種IIC通信的電子羅盤(pán)芯片,輸出與北的角度偏差,數(shù)值是0-360度,靠西方向增長(zhǎng),可以理解為逆時(shí)針為正。配合GPS模塊簡(jiǎn)直就是四軸飛行器的鐵桿標(biāo)配。 1. 5883的初始化 HMC5883L也是一個(gè)IIC器件,具體的操作方式和前面介紹的MPU6050類(lèi)似,這里就不在贅述了。主要區(qū)別在于5883作為IIC從機(jī)時(shí),其地址為0x3C。 1.1 初始化HMC5883 初始化HMC5883的方法和初始化MPU6050的方法差不太多,主要是模擬出IIC信號(hào),對(duì)對(duì)應(yīng)的寄存器操作,具體的可查看HMC5883的說(shuō)明手冊(cè)。 void HMC5883L_Init() { MPU_IIC_Init();//初始化IIC MP
[單片機(jī)]
單片機(jī)stm32直流電機(jī)驅(qū)動(dòng)與測(cè)速學(xué)習(xí)筆記
  通過(guò)實(shí)驗(yàn)發(fā)現(xiàn),定時(shí)器的一個(gè)通道控制一個(gè)pwm信號(hào)。   在正式開(kāi)始之前也可以參考這個(gè)視頻學(xué)習(xí)資料   (stm32直流電機(jī)驅(qū)動(dòng))   http://www.makeru.com.cn/live/1392_1218.html?s=45051   超聲波雷達(dá)測(cè)距儀   http://www.makeru.com.cn/live/15971_2626.html?s=45051   PWM驅(qū)動(dòng)電機(jī)不需要中斷。  ?、?timer.h:   #ifndef __TIMER_H   #define __TIMER_H   #include “sys.h”   void TIM3_PWM_Init(u16 arr,u16 psc);   #
[單片機(jī)]
《嵌入式-STM32開(kāi)發(fā)指南》第二部分 基礎(chǔ)篇 - 第2章 Systick系統(tǒng)定時(shí)器(HAL)
2.1 STM32Cube新建工程 關(guān)于如何使用使用STM32Cube新建工程在前文已經(jīng)講解過(guò)了,這里直說(shuō)配置GPIO部分內(nèi)容。本文要實(shí)現(xiàn)流水燈,其實(shí)輸出為初始化設(shè)置為高電平還是低電平都可以,因?yàn)榱魉疅粜枰粩喾崔D(zhuǎn) 第1章 GPIO(HAL庫(kù)) 1.GPIO配置 我們將PB0、PG6、PG7配置輸出模式(高電平、低電平均可)、輸出速率、上/下拉等,默認(rèn)即可。 圖1GPIO初始化 2.時(shí)鐘源配置 圖2時(shí)鐘源 3.時(shí)鐘配置 圖3時(shí)鐘配置 4.sys配置(滴答定時(shí)器配置) 圖4滴答定時(shí)器 以上配置和GPIO流水燈是一樣的,本文只具體講解Systick的內(nèi)容。 2.2 Systick系統(tǒng)定時(shí)器具體代碼分析 Systic
[單片機(jī)]
STM32中GPIO的8種工作模式
最近在看數(shù)據(jù)手冊(cè)的時(shí)候,發(fā)現(xiàn)在Cortex-M3里,對(duì)于GPIO的配置種類(lèi)有8種之多: (1)GPIO_Mode_AIN 模擬輸入 (2)GPIO_Mode_IN_FLOATING 浮空輸入 (3)GPIO_Mode_IPD 下拉輸入 (4)GPIO_Mode_IPU 上拉輸入 (5)GPIO_Mode_Out_OD 開(kāi)漏輸出 (6)GPIO_Mode_Out_PP 推挽輸出 (7)GPIO_Mode_AF_OD 復(fù)用開(kāi)漏輸出 (8)GPIO_Mode_AF_PP 復(fù)用推挽輸出 對(duì)于剛?cè)腴T(mén)的新手,我想這幾個(gè)概念是必須得搞清楚的,平時(shí)接觸的最多的也就是推挽輸出、開(kāi)漏輸出、上拉輸入這三種,但一直未曾對(duì)這些做過(guò)歸納。因此,在這里做一個(gè)總
[單片機(jī)]
<font color='red'>STM32</font>中GPIO的8種工作模式
stm32中將結(jié)構(gòu)體數(shù)據(jù)寫(xiě)到內(nèi)部Flash時(shí)遇到的問(wèn)題
在一次寫(xiě)代碼的過(guò)程中,想把一個(gè)結(jié)構(gòu)體的數(shù)據(jù)寫(xiě)到stm32單片機(jī)內(nèi)部代碼沒(méi)有用到的空閑Flash,結(jié)構(gòu)體開(kāi)始時(shí)這樣的: //#pragma pack(1) typedef struct { u8 DeviceAddr;//設(shè)備地址 LEDMODE LED_Mode; //LED 控制模式 BAUTRARE Baudrate; //串口波特率 u16 CRC16; //CRC校驗(yàn) }SYSTEM_CONFIG; //#pragma pack() SYSTEM_CONFIG SystemConfig; LEDMODE和BAUTRARE是定義好的兩個(gè)枚舉類(lèi)型,開(kāi)始時(shí)發(fā)現(xiàn)同樣的數(shù)據(jù),在兩次不同的CRC校驗(yàn)中得到的校驗(yàn)
[單片機(jī)]
STM32的推挽(push-pull)和開(kāi)漏(open-drain)
【Open-Drain與Push-Pull】 GPIO的功能,簡(jiǎn)單說(shuō)就是可以根據(jù)自己的需要去配置為輸入或輸出。(General Purpose Input Output,簡(jiǎn)稱為GPIO或總線擴(kuò)展器,利用工業(yè)標(biāo)準(zhǔn)I2C、SMBus?或SPI?接口簡(jiǎn)化了I/O口的擴(kuò)展。當(dāng)微控制器或芯片組沒(méi)有足夠的I/O端口,或當(dāng)系統(tǒng)需要采用遠(yuǎn)端串行通信或控制時(shí),GPIO產(chǎn)品能夠提供額外的控制和監(jiān)視功能。)但是在配置GPIO管腳的時(shí)候,常會(huì)見(jiàn)到兩種模式:開(kāi)漏輸出(open-drain,漏極開(kāi)路)和推挽輸出(push-pull)。 【Push-Pull推挽輸出】 原理: 輸出的器件是指輸出腳內(nèi)部集成有一對(duì)互補(bǔ)的MOSFET,當(dāng)Q1導(dǎo)通、Q2截止時(shí)輸出高
[單片機(jī)]
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車(chē)開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

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