今天來(lái)總結(jié)的stm32基礎(chǔ)知識(shí)是啟動(dòng)文件相關(guān)。要想對(duì)是stm32單片機(jī)有個(gè)深入的理解,那么啟動(dòng)文件就是一個(gè)繞不過(guò)去的坎。
一、什么是啟動(dòng)文件
簡(jiǎn)單說(shuō),啟動(dòng)文件是在單片機(jī)用戶程序執(zhí)行之前,執(zhí)行的一段匯編代碼。這段匯編代碼是執(zhí)行用戶程序之前的一個(gè)準(zhǔn)備環(huán)節(jié)。文件名以.s的格式來(lái)命名,表明其是匯編文件。啟動(dòng)文件,不用自己進(jìn)行編寫,參照一些偽指令定義,能夠看得懂,在實(shí)際開(kāi)發(fā)中如果涉及到一些改動(dòng),能夠簡(jiǎn)單修改就可以了。
二、啟動(dòng)文件所講內(nèi)容概要
那么,啟動(dòng)文件里面主要講的是什么內(nèi)容呢?分為如下5個(gè)方面:
1.堆??臻g的定義;
2.初始化中斷向量表;
3.復(fù)位中斷函數(shù)(Reset_Handler){系統(tǒng)初始化,然后進(jìn)入main函數(shù)};
4.中斷函數(shù)的弱(WEAK)聲明
5.用戶棧和堆初始化
三、啟動(dòng)文件使用的匯編指令匯總
啟動(dòng)文件一般都是由匯編代碼和偽指令來(lái)寫的。
1、下面表格就是啟動(dòng)文件中出現(xiàn)的偽指令名稱及其相關(guān)的含義。請(qǐng)大家參考:
2、幾個(gè)名詞解釋
堆
堆主要用來(lái)動(dòng)態(tài)內(nèi)存的分配,像 malloc()函數(shù)申請(qǐng)的內(nèi)存就在堆上面。這個(gè)在 STM32里面用的比較少
棧
棧的作用是用于局部變量,函數(shù)調(diào)用,函數(shù)形參等的開(kāi)銷,棧的大小不能超過(guò)內(nèi)部SRAM 的大小。棧的生長(zhǎng)方向是由高地址向低地址擴(kuò)展。
THUMB
THUMB:表示后面指令兼容 THUMB 指令。 THUBM 是 ARM 以前的指令集, 16bit,現(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超集。
中斷向量表
中斷向量表:把系統(tǒng)中所有的中斷類型碼及其對(duì)應(yīng)的中斷向量按一定的規(guī)律存放在一個(gè)區(qū)域內(nèi),這個(gè)存儲(chǔ)區(qū)域就叫中斷向量表。
四、啟動(dòng)文件解讀
下面是我項(xiàng)目工程中的完整啟動(dòng)文件代碼。按照以上5個(gè)內(nèi)容分類進(jìn)行展開(kāi)。這里只選取我覺(jué)得比較關(guān)鍵的部分進(jìn)行闡述,不會(huì)逐字逐句的說(shuō)明。提示注意一下,匯編文件的注釋是通過(guò) “;”來(lái)開(kāi)始的,不是像C語(yǔ)言中,是通過(guò)// 或者/***/來(lái)進(jìn)行注釋的?!?;”在匯編文件中,也就等同于.c文件中的“//”。
1.堆棧空間的定義;
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
開(kāi)辟棧的大小為 0X00000400(1KB),名字為 STACK, NOINIT 即不初始化,可讀可寫, 8(2^3)字節(jié)對(duì)齊。
開(kāi)辟堆的大小為 0X00000200(512 字節(jié)),名字為 HEAP, NOINIT 即不初始化,可讀可寫, 8(2^3)字節(jié)對(duì)齊。
2.初始化中斷向量表;
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, ADC2 and ADC3s
DCD CAN1_TX_IRQHandler ; CAN1 TX
DCD CAN1_RX0_IRQHandler ; CAN1 RX0
DCD CAN1_RX1_IRQHandler ; CAN1 RX1
DCD CAN1_SCE_IRQHandler ; CAN1 SCE
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 USART3_IRQHandler ; USART3
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 TIM8_BRK_TIM12_IRQHandler ; TIM8 Break and TIM12
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update and TIM13
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation and TIM14
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD FSMC_IRQHandler ; FSMC
DCD SDIO_IRQHandler ; SDIO
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
DCD TIM7_IRQHandler ; TIM7
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 ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD CAN2_TX_IRQHandler ; CAN2 TX
DCD CAN2_RX0_IRQHandler ; CAN2 RX0
DCD CAN2_RX1_IRQHandler ; CAN2 RX1
DCD CAN2_SCE_IRQHandler ; CAN2 SCE
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 OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out
DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In
DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI
DCD OTG_HS_IRQHandler ; USB OTG HS
DCD DCMI_IRQHandler ; DCMI
DCD CRYP_IRQHandler ; CRYP crypto
DCD HASH_RNG_IRQHandler ; Hash and Rng
DCD FPU_IRQHandler ; FPU
__Vectors_End
__Vectors_Size EQU __Vecto- __Vectors