STM32啟動程式碼分析及其彙編學習-ARM
STM32 啟動程式碼
Author By YuCloud
邊看啟動檔案邊學彙編
彙編
see ARM: Assembler User Guide
see: https://blog.csdn.net/zlmm741/article/details/105189487
指令 | 作用 |
---|---|
EQU | 取符號名(類似C #define),同義詞 * |
AREA | 指示編譯器彙編一個新段(程式碼段或資料段) |
SPACE | 分配記憶體空間並填零。[標號] SPACE [表示式], 同義詞 % |
PRESERVE8 | 按8位元組對齊 |
EXPORT | 宣告全域性,可被外部檔案使用,同義詞 GLOBAL |
DCD | 以字為單位分配記憶體,要求4位元組對齊且初始化該記憶體 |
PROC | 定義子程式,與ENDP成對使用,表示子程式結束 同義詞 FUNCTION |
WEAK | 編譯器特性。弱定義,優先使用外部檔案定義的標號。 |
IMPORT | 宣告標號來自外部檔案,類似於C extern |
B | 跳轉到一個標號 |
ALIGN | 編譯器指令,對指令或資料存放地址進行對齊(一般跟一個立即數,預設為4位元組) |
END | EOF,檔案結束 |
IF,ELSE,ENDIF | 條件分支 |
STM32 啟動檔案詳解
注意,彙編裡的註釋符是;
,但這裡為了視覺效果,用了斜杆
棧
Stack_Size EQU 0x00000400 // 定義一個符號,0x400為1KB // 彙編一個新段,名為STACK 不初始化(即不填零) 可讀可寫 2^3=8位元組對齊 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size // 棧本體,這裡指令是分配棧大小 __initial_sp // 標名, 表示該地址(這裡是末尾,即棧頂地址)
也就是 通知編譯器連結 -> 分配一片棧空間 -> 記錄棧頂地址
棧的作用是用於區域性變數,函式呼叫,函式形參等的開銷,棧的大小不能超過內部SRAM的大小。如果編寫的程式比較大,定義的區域性變數很多,那麼就需要修改棧的大小。如果某一天,你寫的程式出現了莫名奇怪的錯誤,並進入了硬 fault 的時候,這時你就要考慮下是不是棧不夠大,溢位了。
指令詳解
即 SPACE
指令用於留出一段填零的記憶體空間
初始化是指
Indicates that the data section is uninitialized, or initialized to zero.
指令文件連結:EQU
EQU 是偽指令,不生成二進位制程式碼
另外,Label 就是一個標號,加不加只是為了規範,不影響二進位制結果。其實上面程式碼等價於
AREA STACK, NOINIT, READWRITE, ALIGN=3
SPACE 0x00000400 // 棧本體,這裡指令是分配棧大小
<編譯器拿到__initial_sp所在行編譯時的地址> //標名, 表示該地址(這裡是末尾,即棧頂地址)
對了,官方文件說 Use the ALIGN
directive to align any code following a SPACE
or FILL
directive.
用 ALIGN
指令對齊 SPACE
或 FILL
指令之後的任何程式碼,而AREA
裡有 ALIGN 引數
個人猜測: AREA
和 SPACE
配合,才能生成一個段
反彙編一個程式,段是這樣的(黑色箭頭是 段名,方框是 整個段的內容)
堆
Heap_Size EQU 0x00000200 //Heap_Size=512B
// 新段,名為HEAP,可讀可寫,不初始化,8B對齊
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base // 堆的起始地址
Heap_Mem SPACE Heap_Size // 堆本體
__heap_limit // 堆的結束地址
堆用於 malloc/calloc 等用於動態分配記憶體的函式
通知編譯器連結->記錄堆頭地址->分配一片堆空間->記錄堆尾地址
靜態變數和區域性變數都是在SRAM中分配
過渡
PRESERVE8 // 指定當前檔案的棧按 8B 對齊
THUMB // 表示後面的指令相容 Thumb 指令集(ARM以前的16位指令集)
向量表
AREA RESET, DATA, READONLY // 彙編新段,名為RESET的資料段,只讀
EXPORT __Vectors //向量表起始
EXPORT __Vectors_End //向量表末尾
EXPORT __Vectors_Size //向量表大小,可由__Vectors_End-__Vectors計算
__Vectors
DCD __initial_sp
DCD Reset_Handler
DCD NMI_Handler
// ... 省略一些代
DCD DMA2D_IRQHandler
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
EXPORT
/GLOBAL
宣告全域性,可被外部檔案使用
向量表作用:
當核心響應了一個發生的異常後,對應的異常服務例程(ESR)就會執行。為了決定 ESR的入口地址, 核心使用了―向量表查表機制‖。這裡使用一張向量表。向量表其實是一個WORD(32 位整數)陣列,每個下標對應一種異常,該下標元素的值則是該 ESR 的入口地址。向量表在地址空間中的位置是可以設定的,通過 NVIC 中的一個重定位暫存器來指出向量表的地址。
在復位後,該暫存器的值為 0。因此,在地址 0 (即 FLASH 地址 0) 處必須包含一張向量表,用於初始時的異常分配。要注意的是這裡有個另類: 0 號型別並不是什麼入口地址,而是給出了復位後 MSP 的初值。
向量表從 FLASH 的 0 地址開始放置,以 4 個位元組為一個單位,地址 0 存放的是棧頂地址, 0X04 存放的是復位程式的地址,以此類推。從程式碼上看,向量表中存放的都是中斷服務函式的函式名,可我們知道 C 語言中的函式名就是一個地址。
DCD:分配一個或者多個以字為單位的記憶體,以四位元組對齊,並要求初始化這些記憶體。在向量表中, DCD 分配了一堆記憶體,並且以 ESR 的入口地址初始化它們。
用人話說:
核心在異常時會訪問這個表地址,並根據異常型別查表,按表跳轉到異常處理函式執行。
各種中斷處理程式 xxx_Handler
先指示編譯器彙編一個新的程式碼段,名為 |.text|
,只讀
AREA |.text|, CODE, READONLY
復位程式,也就是預設上電覆位後執行的程式
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
弱符號匯出本程式Reset_Handler
,匯入 SystemInit
和 __main
兩個符號,並LDR資料到R0暫存器,跳轉執行(BLX/BX)
注:R0~R3 暫存器通常用於函式入參出參或子程式呼叫,詳細請自行搜尋 ARM 暫存器作用
PORC 標記了程式的開始,ENDP 標記了程式的末尾。與R13(SP)暫存器相關。
R13(即SP棧指標暫存器): 當程式的執行進入異常模式時,可以將需要保護的暫存器放入R13所指向的堆疊,而當程式從異常模式返回時,則從對應的堆疊中恢復,採用這種方式可以保證異常發生後程序的正常執行。
B 跳轉的都是相對地址(相對於 PC暫存器),偏移值是由編譯器計算的
B {條件} 目標地址
條件可選,立即跳轉執行。(不返回程式),B .
是死迴圈while(1);的用法
BL 目標地址
無條件跳轉到目標地址處執行,並儲存PC值到 R14(LR) 暫存器
BLX 目標地址
無條件跳轉到目標地址處執行,並切換工作狀態為 Thumb
,同時儲存PC值到 R14(LR) 暫存器
子程式返回:通過將 R14 暫存器值複製到 PC 來實現。
前文說到, Label 代表的就是其所在地址
其他異常處理程式
定義異常處理子程式
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
//...省略一些
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
這裡雖然有 B .
(跳轉到當前地址執行,這裡會不斷跳轉執行 B .
,也就是死迴圈),
但是有外部 xxx_Handler
時,應該是會返回異常之前的處理函式的,所以在有處理函式的情況下,不會死迴圈,而是執行完異常處理函式後再跳回異常之前的函式。
弱匯出 異常處理函式 的符號表
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK] EXPORT PVD_IRQHandler [WEAK]
// 省略一些
EXPORT FPU_IRQHandler [WEAK]
EXPORT SPI4_IRQHandler [WEAK]
這裡 [WEAK]
表示優先使用外部符號,如果沒有才使用內部的(即剛才上面定義的子程式)
中斷處理函式的符號表
這裡是標號,也就是表明程式地址在這裡
這樣就排列出了中斷處理函式表,順序必須和前面的符號表對應,
應該就是為了讓編譯器對著符號名連結子程式?
WWDG_IRQHandler
PVD_IRQHandler
TAMP_STAMP_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
//...省略一些
FPU_IRQHandler
SPI4_IRQHandler
// 死迴圈(點表示當前地址,B表示立即跳轉)應該是防止程式跑飛,,所以一切執行完成後就在這裡死迴圈
B .
// 程式的結束符
ENDP
// 對齊(預設4B對齊
ALIGN
堆疊初始化
-
if
- 如果使用了微庫(MicroLib),就直接匯出堆疊地址符號
-
else
-
匯入外部程式
__use_two_region_memory
並馬上執行呼叫 -
並匯出子程式符號
__user_initial_stackheap
給外部程式呼叫
-
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
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
的程式定義: 儲存堆疊地址和大小到暫存器
// 下面是 __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
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
啟動檔案程式碼(startup_stm32f401xx.s)
點選展開完整程式碼 [startup_stm32f401xx.s]
;******************** (C) COPYRIGHT 2014 STMicroelectronics ********************
;* File Name : startup_stm32f401xx.s
;* Author : MCD Application Team
;* @version : V1.4.0
;* @date : 04-August-2014
;* Description : STM32F401xx devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Configure the system clock
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the CortexM4 processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;*******************************************************************************
;
; Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");
; You may not use this file except in compliance with the License.
; You may obtain a copy of the License at:
;
; http://www.st.com/software_license_agreement_liberty_v2
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.
;
;*******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
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
DCD UsageFault_Handler ; Usage Fault 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 ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
DCD ADC_IRQHandler ; ADC1
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_TIM9_IRQHandler ; TIM1 Break and TIM9
DCD TIM1_UP_TIM10_IRQHandler ; TIM1 Update and TIM10
DCD TIM1_TRG_COM_TIM11_IRQHandler ; TIM1 Trigger and Commutation and TIM11
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD 0 ; Reserved
DCD EXTI15_10_IRQHandler ; External Line[15:10]s
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI line
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD 0 ; Reserved
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD OTG_FS_IRQHandler ; USB OTG FS
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6
DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7
DCD USART6_IRQHandler ; USART6
DCD I2C3_EV_IRQHandler ; I2C3 event
DCD I2C3_ER_IRQHandler ; I2C3 error
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD FPU_IRQHandler ; FPU
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SPI4_IRQHandler ; SPI4
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __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
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_IRQHandler [WEAK]
EXPORT TAMP_STAMP_IRQHandler [WEAK]
EXPORT RTC_WKUP_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Stream0_IRQHandler [WEAK]
EXPORT DMA1_Stream1_IRQHandler [WEAK]
EXPORT DMA1_Stream2_IRQHandler [WEAK]
EXPORT DMA1_Stream3_IRQHandler [WEAK]
EXPORT DMA1_Stream4_IRQHandler [WEAK]
EXPORT DMA1_Stream5_IRQHandler [WEAK]
EXPORT DMA1_Stream6_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_TIM9_IRQHandler [WEAK]
EXPORT TIM1_UP_TIM10_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_TIM11_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTC_Alarm_IRQHandler [WEAK]
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
EXPORT DMA1_Stream7_IRQHandler [WEAK]
EXPORT SDIO_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT DMA2_Stream0_IRQHandler [WEAK]
EXPORT DMA2_Stream1_IRQHandler [WEAK]
EXPORT DMA2_Stream2_IRQHandler [WEAK]
EXPORT DMA2_Stream3_IRQHandler [WEAK]
EXPORT DMA2_Stream4_IRQHandler [WEAK]
EXPORT OTG_FS_IRQHandler [WEAK]
EXPORT DMA2_Stream5_IRQHandler [WEAK]
EXPORT DMA2_Stream6_IRQHandler [WEAK]
EXPORT DMA2_Stream7_IRQHandler [WEAK]
EXPORT USART6_IRQHandler [WEAK]
EXPORT I2C3_EV_IRQHandler [WEAK]
EXPORT I2C3_ER_IRQHandler [WEAK]
EXPORT FPU_IRQHandler [WEAK]
EXPORT SPI4_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_IRQHandler
TAMP_STAMP_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Stream0_IRQHandler
DMA1_Stream1_IRQHandler
DMA1_Stream2_IRQHandler
DMA1_Stream3_IRQHandler
DMA1_Stream4_IRQHandler
DMA1_Stream5_IRQHandler
DMA1_Stream6_IRQHandler
ADC_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_TIM9_IRQHandler
TIM1_UP_TIM10_IRQHandler
TIM1_TRG_COM_TIM11_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
OTG_FS_WKUP_IRQHandler
DMA1_Stream7_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
DMA2_Stream0_IRQHandler
DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler
DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler
ETH_IRQHandler
OTG_FS_IRQHandler
DMA2_Stream5_IRQHandler
DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler
USART6_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
FPU_IRQHandler
SPI4_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
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
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****