STM32F103システム起動ファイルの分析

序文

この記事では、STM32F103スタートアップファイルを分析します

1.STM32F103システムの起動手順

スタートアップファイルはstartup_stm32f10x_hd.sで、これはアセンブリファイルによって書き込まれ、システムの電源を入れた後に実行される最初のプログラムです。
プロセスは次のとおり
です。1。ヒープとスタックサイズを設定し、ベクトルテーブル
を設定し、スタックポインター
を初期化し、PCポインターを初期化します= Rest_Handler
4、割り込みベクトルテーブルを初期化します
5、システムクロックを構成します
6、Cライブラリを呼び出しますfunction _mainを使用してユーザースタックを初期化し、メイン関数を実装します

2.起動ファイルコード分析

スタックスタックサイズ設定

Stack_Size      EQU     0x00000400
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp                                             

1.スタックサイズを0x00000400(1Mサイズ)に設定します
。2。スタックの機能:ローカル変数、関数呼び出し、関数パラメーター、およびその他のオーバーヘッドを保存します。スタックのサイズは内部SRAMを超えることはできません。
3.領域:アセンブラに、それがコードセグメントまたはデータセグメントであることを伝えます。STACKはスタック名を表します。任意の名前を付けることができます。NOINITは初期化なしを意味します。READWRITEは読み取りと書き込みが可能であることを意味します。ALIGN= 3アライメント2 ^ 3パワーアライメント、つまり8バイトアライメント、SPACEは特定のサイズのメモリを割り当てるために使用され、ここで指定されますはStack_Size4
であり、スペースの後の__Initial_spは、スタックの終了アドレス、つまりスタックの最上位のアドレスを表し、スタックは上位から下位に増加します。

ヒープ

Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
                PRESERVE8
                THUMB

1. Heap_Sizeは0x00000200(512バイト)に設定されます。2。__heap_baseは
ヒープの開始アドレスを表し、__ heap_limitは終了アドレスを表します。
3.ヒープは低から高に成長します
。4。ヒープは、メモリを動的に割り当てるために使用されます。一連のmalloc関数によって割り当てられたメモリはヒープ上にあります。
5、PRESERVE8:スタックが8バイトに従って整列され
ていることを示します6、THUMB:サム命令セットが使用されていることを示します

ベクトルテーブル

; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors
                EXPORT  __Vectors_End
                EXPORT  __Vectors_Size

読み取り可能であるRESETという名前のデータセグメントを定義します。また、EXPORTは、外部で使用するために__Vectors、__ Vectors_End、__ Vectors_Sizeの3つの属性を宣言します。

割り込みベクタ

カーネルが例外に応答すると、対応する例外サービスが実行されます。カーネルは、割り込みベクタテーブルを使用してエントリアドレスを示します。

__Vectors       DCD     __initial_sp               ; Top of Stack 申请的栈顶,__Vectors对外的向量起始地址
                DCD     Reset_Handler              ; Reset Handler
                DCD     NMI_Handler                ; NMI Handler
                DCD     HardFault_Handler          ; Hard Fault Handler
                DCD     MemManage_Handler          ; MPU Fault Handler
                DCD     BusFault_Handler           ; Bus Fault Handler
                ; External Interrupts
                DCD     WWDG_IRQHandler            ; Window Watchdog
                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler          ; Tamper
__Vectors_End
          
__Vectors_Size  EQU  __Vectors_End - __Vectors              

ベクトルテーブルには、システム割り込みとペリフェラル割り込みがあります。ベクトルはたくさんありますが、ここでは省略しています。
__Vectorsはベクトルの開始アドレス、__ Vectors_Endは終了アドレス、__ Vectors_Sizeはスタックのサイズです。ベクタテーブルはFLASHのアドレス0から4バイト単位で格納され、割り込みテーブルには割り込み関数の名前が格納されます。

コードスニペット

AREA    |.text|, CODE, READONLY

読み取り可能なコードセグメントを定義する

リセットプログラム、エントリー機能

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                IMPORT  SystemInit
                LDR     R0, =SystemInit
                BLX     R0               
                LDR     R0, =__main
                BX      R0
                ENDP

リセットプログラムは、最初に実行されるプログラムであり、システムクロックを初期化し、メイン関数にジャンプします。__mainは、主にユーザースタックを初期化し、メインC言語の世界にジャンプするために使用される標準のC関数ライブラリです。

                 IF      :DEF:__MICROLIB
                
                 EXPORT  __initial_sp
                 EXPORT  __heap_base
                 EXPORT  __heap_limit
                
                 ELSE
                
                 IMPORT  __use_two_region_memory
                 EXPORT  __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
                 ALIGN
                 ENDIF
                 END

おすすめ

転載: blog.csdn.net/WANGYONGZIXUE/article/details/115036140