我是靠谱客的博主 大方皮皮虾,最近开发中收集的这篇文章主要介绍stm32单片机基础知识总结(五),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述

写在前面的话

大家好,不知不觉,一周的时间又即将过去了。马上三月也即将过去,2022年的第一个季度也就随之结束了。过去的一周发生了很多。

俄乌战争还在继续,且不从宏观上来说国际局势,单单从生活上说,油价已经突破九元,生活用品都在涨价。。。。。

新冠病毒还在肆虐。。。。。。

东航的一架飞机突然发生了空难。。。。。。

我不是贩卖焦虑,我只想表达,尽管现在出现了些困难,可生活还在继续,相信一切总会好起来的。就像今天的太阳,在经历了两天的阴云弥漫之后,他再一次冉冉升起,照亮了世界。

作为一名普通的技术人员,越是困难、浮躁的时候,越应该沉下心来,仔细钻研技术、夯实基础。

今天来总结的stm32基础知识是启动文件相关。要想对是stm32单片机有个深入的理解,那么启动文件就是一个绕不过去的坎。

一、什么是启动文件

简单说,启动文件是在单片机用户程序执行之前,执行的一段汇编代码。这段汇编代码是执行用户程序之前的一个准备环节。文件名以.s的格式来命名,表明其是汇编文件。启动文件,不用自己进行编写,参照一些伪指令定义,能够看得懂,在实际开发中如果涉及到一些改动,能够简单修改就可以了。

二、启动文件所讲内容概要

那么,启动文件里面主要讲的是什么内容呢?分为如下5个方面:

1.堆栈空间的定义;

2.初始化中断向量表;

3.复位中断函数(Reset_Handler){系统初始化,然后进入main函数};

4.中断函数的弱(WEAK)声明

5.用户栈和堆初始化

三、启动文件使用的汇编指令汇总

启动文件一般都是由汇编代码和伪指令来写的。

1、下面表格就是启动文件中出现的伪指令名称及其相关的含义。请大家参考:

在这里插入图片描述

2、几个名词解释

堆主要用来动态内存的分配,像 malloc()函数申请的内存就在堆上面。这个在 STM32里面用的比较少

栈的作用是用于局部变量,函数调用,函数形参等的开销,栈的大小不能超过内部SRAM 的大小。栈的生长方向是由高地址向低地址扩展。

THUMB

THUMB:表示后面指令兼容 THUMB 指令。 THUBM 是 ARM 以前的指令集, 16bit,现在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超集。

中断向量表

中断向量表:把系统中所有的中断类型码及其对应的中断向量按一定的规律存放在一个区域内,这个存储区域就叫中断向量表。

四、启动文件解读

下面是我项目工程中的完整启动文件代码。按照以上5个内容分类进行展开。这里只选取我觉得比较关键的部分进行阐述,不会逐字逐句的说明。提示注意一下,汇编文件的注释是通过 “;”来开始的,不是像C语言中,是通过// 或者/***/来进行注释的。“;”在汇编文件中,也就等同于.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

开辟栈的大小为 0X00000400(1KB),名字为 STACK, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。

开辟堆的大小为 0X00000200(512 字节),名字为 HEAP, NOINIT 即不初始化,可读可写, 8(2^3)字节对齐。

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

3.复位中断函数(Reset_Handler){系统初始化,然后进入main函数};

 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

4.中断函数的弱(WEAK)声明

; 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
CAN1_TX_IRQHandler
[WEAK]
EXPORT
CAN1_RX0_IRQHandler
[WEAK]
EXPORT
CAN1_RX1_IRQHandler
[WEAK]
EXPORT
CAN1_SCE_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
USART3_IRQHandler
[WEAK]
EXPORT
EXTI15_10_IRQHandler
[WEAK]
EXPORT
RTC_Alarm_IRQHandler
[WEAK]
EXPORT
OTG_FS_WKUP_IRQHandler
[WEAK]
EXPORT
TIM8_BRK_TIM12_IRQHandler
[WEAK]
EXPORT
TIM8_UP_TIM13_IRQHandler
[WEAK]
EXPORT
TIM8_TRG_COM_TIM14_IRQHandler
[WEAK]
EXPORT
TIM8_CC_IRQHandler
[WEAK]
EXPORT
DMA1_Stream7_IRQHandler
[WEAK]
EXPORT
FSMC_IRQHandler
[WEAK]
EXPORT
SDIO_IRQHandler
[WEAK]
EXPORT
TIM5_IRQHandler
[WEAK]
EXPORT
SPI3_IRQHandler
[WEAK]
EXPORT
UART4_IRQHandler
[WEAK]
EXPORT
UART5_IRQHandler
[WEAK]
EXPORT
TIM6_DAC_IRQHandler
[WEAK]
EXPORT
TIM7_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
ETH_IRQHandler
[WEAK]
EXPORT
ETH_WKUP_IRQHandler
[WEAK]
EXPORT
CAN2_TX_IRQHandler
[WEAK]
EXPORT
CAN2_RX0_IRQHandler
[WEAK]
EXPORT
CAN2_RX1_IRQHandler
[WEAK]
EXPORT
CAN2_SCE_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
OTG_HS_EP1_OUT_IRQHandler
[WEAK]
EXPORT
OTG_HS_EP1_IN_IRQHandler
[WEAK]
EXPORT
OTG_HS_WKUP_IRQHandler
[WEAK]
EXPORT
OTG_HS_IRQHandler
[WEAK]
EXPORT
DCMI_IRQHandler
[WEAK]
EXPORT
CRYP_IRQHandler
[WEAK]
EXPORT
HASH_RNG_IRQHandler
[WEAK]
EXPORT
FPU_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
CAN1_TX_IRQHandler
CAN1_RX0_IRQHandler
CAN1_RX1_IRQHandler
CAN1_SCE_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
USART3_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
OTG_FS_WKUP_IRQHandler
TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler
TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler
DMA1_Stream7_IRQHandler
FSMC_IRQHandler
SDIO_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Stream0_IRQHandler
DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler
DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler
ETH_IRQHandler
ETH_WKUP_IRQHandler
CAN2_TX_IRQHandler
CAN2_RX0_IRQHandler
CAN2_RX1_IRQHandler
CAN2_SCE_IRQHandler
OTG_FS_IRQHandler
DMA2_Stream5_IRQHandler
DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler
USART6_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
OTG_HS_EP1_OUT_IRQHandler
OTG_HS_EP1_IN_IRQHandler
OTG_HS_WKUP_IRQHandler
OTG_HS_IRQHandler
DCMI_IRQHandler
CRYP_IRQHandler
HASH_RNG_IRQHandler
FPU_IRQHandler
B
.
ENDP
ALIGN

如果我们在使用某个外设的时候,开启了某个中断,但是又忘记编写配套的中断服务程序或者函数名写错,那当中断来临的时,程序就会跳转到启动文件预先写好的空的中断服务程序中,并且在这个空函数中无线循环,即程序就死在这里。这也是[weak]起到的作用。关于weak,可以网络搜索,了解一下虚函数,和这里是一个意思。

5.用户栈和堆初始化

;*******************************************************************************
; 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

五、理解启动文件的用途总结

1、项目整体把控

每一款芯片,如果你想使用它来做开发,那都有必要了解一下它的启动文件。通过了解,我们可以体会到处理器的架构、指令集、中断向量安排等内容,对整个片子有一个整体的认识。

2、修改堆栈

如果堆栈不够用了,可以修改他们的大小。尤其是栈,当我们需求增加,代码量自然而然就会增多。那么定义的局部变量,函数嵌套的层数必然也就会增多。这个时候就需要关注栈的大小,如果发生溢出,程序就会发生意想不到的后果。

以上就是今天总结分享的内容。如果对你有帮助的话,欢迎点赞、收藏、关注!一起学习,共同进步!

在这里插入图片描述

最后

以上就是大方皮皮虾为你收集整理的stm32单片机基础知识总结(五)的全部内容,希望文章能够帮你解决stm32单片机基础知识总结(五)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部