一文看懂Stm32程式結構和啟動過程

2021-10-07 14:41:41 字數 1716 閱讀 9628

使用keil編譯程式後,程式分為4部分:

code:**區,指程式中**即函式體的大小,注意程式中未使用的函式也會算在code中,也即會占用flash空間,因此不用的函式最好刪除掉,以免占用過多flash空間;

ro-data:ro就是唯讀的意思,程式中唯讀的變數(也就是帶const的)和已初始化的字串等;

rw-data:特指已初始化的可讀可寫全域性/靜態變數;

zi-data:未初始化的可讀可寫全域性/靜態變數,注意初始化為0也算做未初始化,用到的堆空間和棧空間也會被算入這裡面;

因為固定的記憶體對映方式,**區域總是從0x00000000開始,資料區域(sram)總是從0x20000000開始,在stm32f4xx系列晶元中,有三種boot 模式,通過boot[1:0]引腳選擇:

同時,將0x00000000對映到相應的啟動位置的實體地址。例如從flash memory啟動時,會將0x00000000對映到0x08000000。

根據boot[1:0]確定啟動方式,例如從flash memory啟動;

取出0x0000_0000(0x0800_0000)的棧指標和0x0000_0004(0x0800_0004)處的pc指標;

棧頂位址可以在*.map 檔案中找到 0x2000_0298 + 0x0000_0400。

reset_handle的入口位址可以在*.map中找到。

根據startup*.s檔案定義的復位函式,執行systeminit和__main函式。

; reset handler

reset_handler proc

export reset_handler [weak]

import systeminit

import __main

ldr r0,

=systeminit

blx r0

ldr r0,

=__main

bx r0

endp

systeminit函式可以在*.c檔案中找到,不在贅述,比較重要的是__main()函式,該函式通過呼叫__scatterload_copy實現rw section的拷貝,__scatterload_zeroinit實現zi section的初始化;

初始化堆和棧,而後sram結構如下圖所示:

進入main函式,程式正常執行後,如下圖所示。

一文幫你了解STM32中斷優先順序分組

優先順序分組相關問題 問題八 如何設定系統的優先順序分組?答 乙個系統,優先順序分組只須設定一次,那麼應該如何設定呢?當然是根據整個系統的需求來綜合考慮了。還是以身份證為例,在發放身份證之前,我們要總體考慮全國要分多少個區域,然後確定地區需要設定幾位數才夠。在4位的優先順序系統中,給每個中斷的身份證...

學習筆記 STM32定時器程式應用(一)

pwm互補輸出帶死區時間和剎車控制 講解 時隔11天,我又回來了 之間寫了stm32的三種定時器的一些基本概念,今天我來講解一下相關的程式應用。我們直接從野火的韌體庫例程中拷貝乙個串列埠的例程 usart接髮。由於我們這個例程是關於互補輸出,因此需要兩個gpio 死區時間用軟體配置,而剎車控制也需要...

STM32 晶元唯一ID獲取與程式許可權限制

前面我們對唯一id做了簡單的描述,並且得到了其儲存位址,接下來我們說以說如何得到這個id。前面已經描述過唯一id可以按位元組 半字 字等方式讀取。唯一id是乙個96位的資訊串,所以按字讀取就是3個字,按半字讀取就是6個,按位元組讀取就是12個。本質上沒有區別,在這裡我們按字讀取。typedef en...