使用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函式。
systeminit函式可以在*.c檔案中找到,不在贅述,比較重要的是__main()函式,該函式通過呼叫__scatterload_copy實現rw section的拷貝,__scatterload_zeroinit實現zi section的初始化;; reset handler
reset_handler proc
export reset_handler [weak]
import systeminit
import __main
ldr r0,
=systeminit
blx r0
ldr r0,
=__main
bx r0
endp
初始化堆和棧,而後sram結構如下圖所示:
進入main函式,程式正常執行後,如下圖所示。
一文幫你了解STM32中斷優先順序分組
優先順序分組相關問題 問題八 如何設定系統的優先順序分組?答 乙個系統,優先順序分組只須設定一次,那麼應該如何設定呢?當然是根據整個系統的需求來綜合考慮了。還是以身份證為例,在發放身份證之前,我們要總體考慮全國要分多少個區域,然後確定地區需要設定幾位數才夠。在4位的優先順序系統中,給每個中斷的身份證...
學習筆記 STM32定時器程式應用(一)
pwm互補輸出帶死區時間和剎車控制 講解 時隔11天,我又回來了 之間寫了stm32的三種定時器的一些基本概念,今天我來講解一下相關的程式應用。我們直接從野火的韌體庫例程中拷貝乙個串列埠的例程 usart接髮。由於我們這個例程是關於互補輸出,因此需要兩個gpio 死區時間用軟體配置,而剎車控制也需要...
STM32 晶元唯一ID獲取與程式許可權限制
前面我們對唯一id做了簡單的描述,並且得到了其儲存位址,接下來我們說以說如何得到這個id。前面已經描述過唯一id可以按位元組 半字 字等方式讀取。唯一id是乙個96位的資訊串,所以按字讀取就是3個字,按半字讀取就是6個,按位元組讀取就是12個。本質上沒有區別,在這裡我們按字讀取。typedef en...