記事のディレクトリ
序文
この記事では、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