STM32的啟動文見分析

2021-08-14 10:20:25 字數 4914 閱讀 9133

stack_size      equ     0x00000400  ;棧大小設定為1024位元組

area stack, noinit, readwrite, align=

3 ;段名稱為stack,未初始化,允許讀寫,8位元組對齊

;area指示編譯器編譯出乙個新的**段或者資料段,align =

3,就是2的3次方位元組對齊,也就是8位元組

stack_mem space stack_size ;分配空間,大小為1024位元組,並把首位址賦值給stack_mem

__initial_sp ;初始化棧指標,指向棧的頂部,也就是上述空間的尾部,stm32採用滿遞減堆疊

定址方式

說明pop=ldm

push=stm

fa滿遞增

ldmfa

ldmda

stmfa

stmib

fd滿遞減

ldmfd

ldmia

stmfd

s***b

ea空遞增

ldmea

ldmdb

stmea

stmia

ed空遞減

ldmed

ldmib

stmed

s***a

滿遞增:sp指向最後乙個被壓入的元素,sp朝記憶體位址增加方向遞增 

滿遞減:sp指向最後乙個被壓入的元素,sp朝記憶體位址減小方向遞增 

空遞增:sp指向最後乙個被壓入的元素的下乙個為空的位址,sp朝記憶體位址增加方向遞增 

空遞減:sp指向最後乙個被壓入的元素的下乙個為空的位址,sp朝記憶體位址減小方向遞增

heap_size

equ0x00000200 ;堆大小設定為512位元組

area

heap, noinit, readwrite, align=3 ;段名稱為heap,未初始化,允許讀寫,8位元組對齊

__heap_base ;堆起始位址

heap_mem

space

heap_size ;分配堆空間

__heap_limit ;堆限制大小

preserve8   ;保持下述空間保持8位元組對齊

thumb ;使用thumb指令集,要宣告在任何使用thumb指令集的語句之前

area    reset, data, readonly   ;段名稱為reset,資料段,唯讀,保持8位元組對齊,由上面的preserve8指定

export __vectors ;向量表開始

export __vectors_end ;向量表結束

export __vectors_size ;向量表大小,可由上述兩個標號算出

;export 標號的輸出(類似於linux裝置驅動模組的export_symbol(symbol))

;dcd 用於分配一片連續的儲存單元,並且使用指定的資料進行初始化,仍然保持8位元組的對齊

__vectors dcd __initial_sp ; 堆疊頂部位址,復位後首先裝載堆疊

dcd reset_handler ; reset handler

dcd nmi_handler ; nmi handler

dcd hardfault_handler ; 硬體錯誤

dcd memmanage_handler ; mpu錯誤

dcd busfault_handler ; 匯流排錯誤

dcd usagefault_handler ; 引用錯誤

dcd 0 ; reserved

dcd 0 ; reserved

dcd 0 ; reserved

dcd 0 ; reserved

dcd svc_handler ; svcall handler

dcd debugmon_handler ; debug monitor handler

dcd 0 ; reserved

dcd pendsv_handler ; pendsv handler

dcd systick_handler ; 系統滴答計時器中斷響應函式

;上述為stm32內部指定中斷向量

; external interrupts

dcd wwdg_irqhandler ; window watchdog

......

dcd hash_rng_irqhandler ; hash and rng

dcd fpu_irqhandler ; fpu

__vectors_end ;中斷向量表結束位址

__vectors_size equ __vectors_end - __vectors ;定義中斷向量表長度為結束位址減去開始位址

area    |.text|, code, readonly ;段名為.text(c編譯器產生的**段就是.text,此處可以嵌入c編譯出來的**段),**段,唯讀

; reset handler

reset_handler proc

export reset_handler [weak] ;weak,如果有重複的定義,優先執行其他的定義

import systeminit ;匯入systeminit標號

import __main ;匯入__main標號,也就是main()函式位址

ldr r0, =systeminit

blx r0 ;帶鏈結跳轉並切換指令集

ldr r0, =__main

bx r0 ;跳轉並切換指令集

endp

; dummy exception handlers (infinite loops which can be modified)

nmi_handler proc

export nmi_handler [weak]

b . ;死迴圈

endp

......

......

align   ;預設的對齊方式,也就是4位元組對齊

;*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

; user stack and heap initialization

;*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

*****

****

if :def:__microlib ;如果勾選了此選項(在keil工程option的target選項右側)

export __initial_sp ;匯出三個符號

export __heap_base ;

export __heap_limit ;

else

import __use_two_region_memory ;否則匯入__use_two_region_memory

export __user_initial_stackheap ;匯出__user_initial_stackheap

__user_initial_stackheap

ldr r0, = heap_mem ;堆首位址

ldr r1, =(stack_mem + stack_size) ;棧頂

ldr r2, = (heap_mem + heap_size) ;堆末位址

ldr r3, = stack_mem ;棧首位址

bx lr ;等同於mov pc, lr

;跳轉並切換指令集,也就是切換到arm指令集

align

endif

end

先分配好棧,堆段

設定中斷向量表段

初始化堆疊(外部呼叫)

構建中斷處理函式,**段(裡面包含了中斷復位處理函式,裡面可以初始化整個系統,然後跳轉到main()函式處執行)

stm32如何執行軟復位 STM32啟動檔案

我們日常使用的嵌入式應用程式開發中都是編寫c c 語言,我們平時編輯乙個工程的話,只用從main函式開始編輯,微控制器程式也是從這個函式開始進行執行的。但是微控制器上電後是如何尋找到並執行main函式的呢?我們其實都會在心裡有乙個答案 啟動檔案 還記得我們當初配置第乙個stm32工程的時候在工程中新...

stm32啟動檔案分析

這篇文章主要是分析stm32啟動檔案,啟動檔案是由彙編編寫的,檔名為startup stm32f40 41 s。啟動檔案最主要的功能就是初始化堆疊指標sp,執行復位程式進入c語言main函式 1.初始化堆疊空間大小,定義棧頂位置 堆起始位置等等 2.定義中斷向量表,初始化sp指標 3.reset h...

STM32啟動檔案分析

1.啟動檔案主要作用 a.初始化指標大小 b.初始化堆指標大小 c.初始化中斷向量表 d.初始化系統時鐘 e.呼叫 main,實現堆疊的初始化,最終跳轉到c的main當中 2.棧主要儲存程式的變數,當程式變數較多時,可以將棧分配的更大,但不能超過內部sram的大小 mdk中,全域性變數和區域性變數都...