启动文件startup_stm32f40_41xxx.s主要完成如下执行过程:
·设置堆栈指针SP= __initial_SP
·设置PC指针 = Reset_handler
·配置系统时钟
·配置外部SRAM用于程序变量等数据储存(可选)
·跳转Jump到C库中的_mian,最终会调用(Call)用户程序main()函数 CortexM4处 理器复位后,处于线程模式,指令权限为最高特权级别,堆栈设置为主堆栈

硬件复位之后,CPU内的时序逻辑电路首先将0x0800 0000(flash首地址)位置存放的堆栈栈顶地址装入SP寄存器。紧接着将0x0800 0004位置存放的向量地址装入PC程序寄存器。CPU从PC寄存器指向的物理地址取出第1条指令开始执行程序,也就是开始执行复位中断函数Reset_handler。
复位中断函数会调用SystemInit()函数(c语言)来配置系统时钟、配置FSMC总线上的外部SRAM,然后跳转到C库中_main函数。由C库中的_main函数完成用户程序初始化工作,如变量赋初值等,最后_mian函数调用用户写的main()函数开始执行C程序。

Stack_Size EQU 0x00000400

            AREA    STACK, NOINIT, READWRITE, ALIGN=3

Stack_Mem SPACE Stack_Size
__initial_sp
EQU表示宏定义的伪指令其不会生成二进制代码,也不引起变量空间分0x0000 0400表示堆栈大小,以字节为单位。
开辟一段数据空间可读可写,段名STACK按照8字节对齐。
AREA后面关键之定义一个代码段或数据段,这里定义的是数据段
·STACK 表示这个段的名字,可任意命名
·NOINIT表示数据段不需要填入初始数据
·READWRITE表示此段可读可写
·ALIGN=3表示首地址按照2的3次方对齐,也就是按照8字节对齐
SPACE这行指令高速汇编器给STACK段分配0x0000 0400字节的连续内存空间。_initial_sp只是一个标号表示一片内存空间的某个位置,从c语言的角度来看变量 的地址,数组的地址或是函数入口的地址在本质上没有差别。其紧跟SPACE语句放置,表示了栈空间顶地址。M4堆栈是由高地址空间向低地址空间增长的。压栈(PUSH)时,堆栈指针SP递减,弹栈(POP)时SP递增。
栈(STACK)用于存储局部变量,保存函数返回地址。

Heap_Size EQU 0x00000200

            AREA    HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
分配一片呢连续内存空间给名叫HEAP的段,也就是分配到堆空间,大小为0x0000 0200。怼的首地址也是8字节对齐。堆朱勇用于动态内存分配,也就是说用malloc函数分配的空间位于堆空间。base表示堆得开始地址,limit表示堆得结束地址。

PRESERVE8
THUMB
保持当前文件堆栈8字节对齐,THUMB指令集16位,这是相对于32位arm指令而言的

; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
定义一段只读段RESET,3行EXPORT将3个标号声明为外部引用,主要提供给连接器链接库文件或其他文件。

; 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 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 __Vectors_End - __Vectors
这里是建立中断向量表,其具体物理地址有链接其的配置参数(IROM1的地址)决定,如果程序在flansh与运行,则向量中断表起始地址0x0800 0000
DCD表示分配一个4字节空间,每行DCD都会生成一个四字节二进制代码,中断向量表存放的实际就是中断服务程序的入口地址,的那个中断发生时,CPU的中断会将相应如入口地址赋值给PC程序技术其,之后就执行中断服务程序。

            AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main

             LDR     R0, =SystemInitBLX     R0LDR     R0, =__mainBX      R0ENDP

复位中断函数程序
·利用PROC,ENDP这一伪指令把程序分为若干个过程,使程序结构更加清晰
·WEAK声明其他同名标号优先于该标号被引用,他让我么在c文件中任意地方放置中断服务程序,只要保证函数名与向量表中一致即可。
·IMPORT伪指令用于通知编一起要使用的标号在其他源文件中定影,但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被假如到当前源文件的符号表中
·SystemInit在文件system_stm32f4xx.c里面
·_main标号并不表示main函数的入口地址,=_main也不是跳转到main开始执行C程序,其表示c/c++标准实时库函数里的一个初始化_main的入口地址,主要作用是初始化堆栈(跳转_user_init_stackheap标号进行初始化),初始化映像文件,最后跳转带c程序中的main函数,这也就解释了c必须有一个main函数作为程序的起点,这是由c/c++标准实时库所规定。

; 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
·
· 此处省略若干行
·
Default_Handler PROC 《————— 缺省的中断服务函数(开始)

            EXPORT  WWDG_IRQHandler                   [WEAK]                                        EXPORT  PVD_IRQHandler                    [WEAK]                      EXPORT  TAMP_STAMP_IRQHandler             [WEAK] ··     此处省略若干行·

CRYP_IRQHandler
HASH_RNG_IRQHandler
FPU_IRQHandler

            B       .  《——————死循环ENDP       《------缺省的中断服务函数(结束)

启动文件最后一段代码是用来选择用户自己初始化的堆和栈
;*********************************************************************
; User Stack and Heap initialization
;*********************************************************************
IF :DEF:__MICROLIB

             EXPORT  __initial_spEXPORT  __heap_baseEXPORT  __heap_limitELSEIMPORT  __use_two_region_memoryEXPORT  __user_initial_stackheap

__user_initial_stackheap

             LDR     R0, =  Heap_MemLDR     R1, =(Stack_Mem + Stack_Size)LDR     R2, = (Heap_Mem +  Heap_Size)LDR     R3, = Stack_MemBX      LRALIGNENDIFEND上面就是一个简单的IF...ELSE...语句,如果定义了MICROLIB那么程序不会EKSE分支的代码。

F4跟F1一样支持3中启动方式 0 0从flash中启动;1 0从ISP系统代码中启动;1 1从cpu内部SRAM中启动。

STM32F4学习笔记1相关推荐

  1. (实验38)单片机,STM32F4学习笔记,代码讲解【SD卡实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 SD卡驱动程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ( ...

  2. (实验39)单片机,STM32F4学习笔记,代码讲解【FATFS实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 FATFS初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创 ...

  3. (实验55)单片机,STM32F4学习笔记,代码讲解【网络通信实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 LWIP初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  4. (实验37)单片机,STM32F4学习笔记,代码讲解【内存管理实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 内存池初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  5. (实验4)单片机,STM32F4学习笔记,代码讲解【串口实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 串口中断程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] (实 ...

  6. (实验6,实验7)单片机,STM32F4学习笔记,代码讲解【看门狗实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象(实验六) 主程序(实验六) 独立看门狗初始化程序(实验六) 代码讲解(实验六) 实验现象(实验七) 主程序(实验七) 窗口看门狗初始化程序(实验七) 代 ...

  7. (实验50)单片机,STM32F4学习笔记,代码讲解【串口IAP实验】【正点原子】【原创】

    文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化程序 代码讲解 文章目录 ❤2023重新理解记录 其它文章链接,独家吐血整理 实验现象 主程序 IAP初始化 ...

  8. (实验12)单片机,STM32F4学习笔记,代码讲解【OLED显示实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 OLED初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  9. (实验15)单片机,STM32F4学习笔记,代码讲解【RTC实时时钟实验】【正点原子】【原创】

    文章目录 其它文章链接,独家吐血整理 实验现象 主程序 RTC初始化程序 代码讲解 其它文章链接,独家吐血整理 (实验3)单片机,STM32F4学习笔记,代码讲解[按键输入实验][正点原子][原创] ...

  10. STM32F4学习笔记(基础介绍篇)

    来自官网的简介 这里我们学习的开发板芯片具体型号是STM32F407ZGT6,采用工作频率为168 MHz的Cortex™-M4内核,性能较强. 本篇包含的内容: 固件库简介 开发环境的简介 开发板的 ...

最新文章

  1. 在linux和windows下自动备份数据库
  2. python top n排序
  3. 异常:System.BadImageFormatException,未能加载正确的程序集XXX或其某一依赖项
  4. 2018+计算机软件,2018年6月考试《计算机软件技术基础(1)》在线考核试题
  5. 微生物组-扩增子16S分析第9期(报名直播课免费参加线下2020.8)
  6. dubbo源码深度解析_scrapy框架通用爬虫、深度爬虫、分布式爬虫、分布式深度爬虫,源码解析及应用
  7. WPF Popup 相关内容
  8. Linux机器学习软件配置
  9. Spring的事务管理难点剖析(5):联合军种作战的混乱
  10. 提高效率 JavaScript调试 js 调试工具
  11. swoole深入学习 2. tcp Server和tcp Client
  12. 游戏及开发人员的认识
  13. 转发技术风雨三十年,你经历过……
  14. 【转载】Android网络开发案例
  15. nod32更新服务无法设置问题更改
  16. asp.net oracle连接数据库,通过ASP.NET连接Oracle数据库实例教程
  17. 如何解决ueditor乱码问题
  18. ubuntu18.04装coturn
  19. 2018年2月Ivanti英万齐(前LANDESK蓝代斯克)关闭中国研发中心
  20. php中的时间函数(如何设置时区有4种方法)------与时间相关的函数 (time、date、m‘ktime、microtime(true)、strtotime)

热门文章

  1. SRPG游戏开发(五十三)第十一章 地图动作与地图事件 - 二 地图剧情(Map Plot)
  2. 【机器学习】孤立森林
  3. matlab中绘制一个sin函数曲线
  4. 「业务架构」EA874:业务架构层
  5. 网评100首最好听的歌
  6. mac protobuf java_mac 下 使用 protobuf 生成 java 及 js 及配合socket.io 使用
  7. 2015年,我从国内二线城市来到日本东京工作生活
  8. linux系统硬盘坏道,linux系统下检测硬盘上的坏道和坏块
  9. 软考数据库工程师2021下午题@故障恢复解析
  10. Softmax激活函数