STM32 Keil MDK启动代码解析
"STM32 Keil MDK的启动代码分析" 在STM32的Keil MDK开发环境中,启动代码是系统初始化的关键部分,它负责设置CPU的初始状态、堆栈和堆的配置,以及中断向量表的布局。以下是对启动代码的详细解析: 1. **堆栈配置**: - `Stack_Size EQU 0x00000200`:定义了堆栈的大小为512字节。堆栈通常用于保存函数调用时的返回地址、寄存器和局部变量等信息。 - `AREA STACK, NOINIT, READWRITE, ALIGN=3`:定义了一个名为STACK的数据段,不进行初始化(NOINIT),可读写(READWRITE),并按8字节对齐(ALIGN=3)。 - `Stack_Mem SPACE Stack_Size`:分配Stack_Size大小的堆栈内存空间,并将其初始化为0。 - `__initial_sp`:这个标号标识了堆栈的顶部地址。 2. **堆配置**: - `Heap_Size EQU 0x00000020`:定义了堆的大小为32字节。堆主要用于动态内存分配。 - `AREA HEAP, NOINIT, READWRITE, ALIGN=3`:定义了一个名为HEAP的数据段,同样不初始化,可读写,并按8字节对齐。 - `Heap_Mem SPACE Heap_Size`:分配Heap_Size大小的堆内存空间。 - `__heap_base` 和 `__heap_limit`:分别表示堆的起始地址和结束地址。 3. **8字节对齐**: - `PRESERVE8`:确保编译器使用8字节对齐,这对于ARM Cortex-M系列处理器的指令集是非常重要的,因为它通常需要字对齐的数据访问。 - `THUMB`:指示编译器使用Thumb指令集,这是Cortex-M3和M4处理器支持的一种16位和32位混合指令集,以节省代码空间。 4. **中断向量表**: - `AREA RESET, DATA, READONLY`:定义了一个只读数据段,实际上位于代码段(CODE区)的地址0,这是Cortex-M处理器启动时查找中断向量表的位置。 - `EXTERN` 一系列的中断服务例程:声明这些函数在其他文件中定义,使得中断处理函数可以在需要时被自动调用。 - `__Vectors`:中断向量表的起始地址,其中包含了各个中断服务例程的入口地址。 - `DCD` 语句列出了中断处理函数的地址,如复位处理程序、非 maskable 中断 (NMI) 处理程序、硬故障处理程序等。 5. **中断服务例程**: - 各种中断处理程序如`WWDG_IRQHandler`, `PVD_IRQHandler`等,是针对STM32微控制器特定外设中断的处理函数。它们在实际项目中需要根据具体应用进行编写。 STM32的启动代码主要任务是初始化堆栈和堆,设置中断向量表,以及为各种异常和中断处理提供入口。这使得系统在上电或复位后能够正确地运行用户程序。
STM32 keil mdk启动代码发分析_转2010年01月29日 星期五 13:50
;// <h> Stack Configuration
;// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>
Stack_Size EQU 0x00000200 ;//定义堆栈大小
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段 按8字节对齐 ;AREA 伪指令用于定义一个代码段或数据段 NOINIT:指定此数据段仅仅保留了内存单元,而没有将各初始值写入内存单元,或者将各个内存单元值初始化为0
Stack_Mem SPACE Stack_Size ;//保留Stack_Size大小的堆栈空间 分 配连续 Stack_Size 字节的存储单元并初始化为 0
__initial_sp ;//标号,代表堆栈顶部地址,后面有用
;// <h> Heap Configuration
;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>
Heap_Size EQU 0x00000020 ;//定义堆空间大小
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;//定义一个数据段,8字节对齐
__heap_base
Heap_Mem SPACE Heap_Size ;//保留Heap_Size的堆空间
__heap_limit ;//标号,代表堆末尾地址,后面有用
PRESERVE8 ;//指示编译器8字节对齐
THUMB ;//指示编译器为THUMB指令
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY ;//定义只读数据段,其实放在CODE区,位于0地址
EXTERN NMIException
EXTERN MemManageException
EXTERN BusFaultException
EXTERN UsageFaultException
EXTERN SVCHandler
EXTERN DebugMonitor
EXTERN PendSVC
EXTERN SysTickHandler ;//声明这些符号在外部定义,同C
;//在××it.c中实现这些函数 ,中断就能自动调用了
EXPORT __Vectors
EXPORT __initial_sp ;EXPORT:在程序中声明一个全局的标号__Vectors,该标号可在其他的文件中引用;IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义, ;但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中
__Vectors DCD __initial_sp ; Top of Stack //Cotex-M 要求此处为堆栈顶部地址
DCD Reset_Handler ; Reset Handler
DCD NMIException ; NMI Handler
DCD HardFaultException ; Hard Fault Handler
DCD MemManageException ; MPU Fault Handler
DCD BusFaultException ; Bus Fault Handler
DCD UsageFaultException ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVCHandler ; SVCall Handler
DCD DebugMonitor ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSVC ; PendSV Handler
DCD SysTickHandler ; SysTick Handler //一大堆的异常处理函数地址
; External Interrupts
EXTERN WWDG_IRQHandler
剩余7页未读,继续阅读
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- BGP协议首选值(PrefVal)属性与模拟组网实验
- C#实现VS***单元测试coverage文件转xml工具
- NX二次开发:UF_DRF_ask_weld_symbol函数详解与应用
- 从机FIFO的Verilog代码实现分析
- C语言制作键盘反应力训练游戏源代码
- 简约风格毕业论文答辩演示模板
- Qt6 QML教程:动态创建与销毁对象的示例源码解析
- NX二次开发函数介绍:UF_DRF_count_text_substring
- 获取inspect.exe:Windows桌面元素查看与自动化工具
- C语言开发的大丰收游戏源代码及论文完整展示
- 掌握NX二次开发:UF_DRF_create_3pt_cline_fbolt函数应用指南
- MobaXterm:超越Xshell的远程连接利器
- 创新手绘粉笔效果在毕业答辩中的应用
- 学生管理系统源码压缩包下载
- 深入解析NX二次开发函数UF-DRF-create-3pt-cline-fcir
- LabVIEW用户登录管理程序:注册、密码、登录与安全