IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F10x启动文件详解 -> 正文阅读

[嵌入式]STM32F10x启动文件详解


本文为使用汇编开发STM32系列文章之----启动文件详解篇,全部文章目录点此跳转。


??本文不会像其他文章一样只是简单的说一下启动文件的每个部分是什么,说了很多却又像没说一样。本文将对启动文件中的每句话的作用及其如此编写的原因进行深入探究,使大家真正的理解和掌握启动文件的编写,而不是只懂修改堆栈大小。

一、基础设定

??在开始正式解释STM32F10x启动文件前,应首先对其Cortex-M3内核的复位序列以及中断向量等设定进行说明,才可能充分理解启动文件中每句代码的必要性。

1.Cortex-M3内核的复位序列

??Cortex-M3内核上电后,首先对系统进行复位操作,保证初始状态的正确。离开复位状态后,首先要做的两件事是取出栈顶(MSP)的初始值以及程序计数器(PC)的初始值。Cortex-M3规定,在地址0x00000000处存放32位的栈顶(MSP)初始值,在地址0x00000004处存放32位的程序计数器(PC)初始值。实际流程如下图所示。
在这里插入图片描述
??需要说明的是,因为每个存储单元大小为8位,一个32位的值占用4个存储单元也就是4个地址偏移,所以栈顶(MSP)初始值和程序计数器(PC)初始值实际上是在存储单元上连续存放的。

2.向量表

??Cortex-M3内核拥有11个系统异常和最多240个外部中断,这些都是可以在代码执行的任何阶段对其打断,并进行异常的处理。每当发生异常时,异常产生部分会返回给Cortex-M3内核一个编号,每个编号对应着固定的异常,以此可以判断所产生的是哪一个异常。
??而,向量表中记录的就是每个异常发生后应该跳转到的代码执行地址-----即中断服务函数地址。通过固定向量表中异常的位置,加上发生中断时的编号(n),即可在发生异常时通过向量表的基地址(base_add)加偏移地址计算出中断服务函数的地址(add)存放位置:add = bas_add + n * 4。
??STM32f10xxx固定的向量表顺序如下所示,其中开始执行时的地址是固定的,但是在运行开始以后,向量表是可以移动至其他位置的。(因为在flash中是无法在程序中更改向量地址的,则可以在运行开始后将向量表移动至ram中,即可随时修改向量地址。)

优先级名称地址说明
--0x00000000保留,为迎合Cortex-M3内核设定,此处放置MSP初值
-3 (固定)Reset0x00000004复位
-2 (固定)NMI0x00000008不可屏蔽中断
-1 (固定)HardFault0x0000000C硬件失效
0 (可设置)MemManage0x00000010存储管理
1 (可设置)BusFault0x00000014预取指失败或存储器访问失败
2 (可设置)BusFault0x00000018预取指失败或存储器访问失败
--0x0000001C-0x0000002B保留
3 (可设置)SVCall0x0000002C通过SWI指令的系统服务调用
4 (可设置)DebugMonitor0x00000030调试监控器
--0x00000034保留
5 (可设置)PendSV0x00000038可挂起的系统服务
6 (可设置)SysTick0x0000003C系统嘀嗒定时器
7 (可设置)WWDG0x00000040窗口定时器中断
8 (可设置)PVD0x00000044连到EXTI的电源电压检测(PVD)中断
9 (可设置)TAMPER0x00000048侵入检测中断
10 (可设置)RTC0x0000004C实时时钟(RTC)全局中断
11 (可设置)FLASH0x00000050闪存全局中断
12 (可设置)RCC0x00000054复位和时钟控制(RCC)中断
13-17 (可设置)EXTI0至EXTI40x00000058至0x00000068EXTI线0至4中断
18-24 (可设置)DMA1至DMA70x0000006C至0x00000084DMA1 通道1 至 通道7 全局中断
0x00000088至0x00000012C其他25到66优先级的中断

上表并不完全,因为篇幅原因,就不放完整向量表了。想看完整向量表的可以查看文档《STM32F10xxx中文参考手册》,或者点此查看。

3.AAPCS协定

??在进行STM32的编程时,使用的都是C语言。但是芯片上电后首先执行的是启动文件,是汇编语言编写的,之后由汇编语言环境跳转到C语言环境进行执行。在某些情况下也需要从C语言环境跳转到汇编语言执行一些C语言做不到的事情。由此就产生了两种新的环境转换情景,那么就需要两个环境在进行转换时按照一定的约束或者说是规则,保证跳转后可正常执行,保证还可正常跳转回之前状态。
??则AAPCS(ARM Architecture Procedure Call Standard)诞生了,即 “ARM架构程序调用标准” 。其中约定了调用函数时的参数、返回值以及某些寄存器在C语言环境下的作用等等。
??我们知道在汇编语言环境下可以访问的通用寄存器有R0-R15,除了一些特殊功能寄存器例如R13(MSP/PSP)、R14(LR)以及R15(PC)外,其他寄存器一般都可用于存储计算过程的数据使用。但是在C语言环境下,有函数类型代码,其包含参数和返回值,则AAPCS规定了其R0-R15的使用方式。其中R0-R4用于传递参数和返回结果,R4-R11用于保存函数内部的局部变量,R12定义为 “程序调用过程中备份寄存器”,其他的特殊寄存器则功能不变。两个环境下寄存器功能如下图所示。
在这里插入图片描述

二、启动文件 startup_stm32f10x_md.s 详解

??因为stm32的启动文件具有一般性,本文将startup_stm32f10x_md.s文件作为解释对象。由于本人水平有限,难免会有错误之处,欢迎指正。

1.文件头

??文件开头比较好理解,是ST官方编写者做的版权声明和文件功能的说明,翻译后如下所示。

;******************** (C) 版权所有 2011 STMicroelectronics ********************
;* 文件名称           : startup_stm32f10x_md.s
;* 作者               : MCD 应用团队
;* 版本               : V3.5.0
;* 日期               : 2011年3月11日
;* 说明               : 基于MDK-ARM工具链的STM32F10x中容量器件矢量表
;*                      这个文件执行:
;*                      - 初始化 SP(堆栈)
;*                      - 初始化 PC(程序指针)指向 Reset_Handler
;*                      - 设置除ISR地址外的向量表条
;*                      - 配置时钟系统
;*                      - 在C库中分支到__main(最终调用main())
;*                      重置后,CortexM3处理器处于线程模式,优先级为特权,堆栈设置为Main。
;* <<< 使用上下文菜单中的配置向导 >>>   
;*******************************************************************************
;本固件仅供参考,旨在为客户提供有关其产品的编码信息,以节省时间。
;因此,意法半导体公司不对因此类固件内容和/或客户使用本文中包含的
;与其产品相关的编码信息而引起的任何直接、间接或后果性损害承担责任。
;*******************************************************************************

2.堆栈空间分配

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 15:55:12  更:2022-05-01 15:55:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 0:53:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码