教程一文搞懂STM32启动文件
本文启动文件位STM32G030的启动文件(.s为结尾的文件),其他型号单片机大同小异,可以直接参考。
我们先来看下启动文件的,开头说明;****************************************************************************** ;* File Name : startup_stm32g030xx.s ;* Author : MCD Application Team ;* Description : STM32G030xx devices vector table for MDK-ARM toolchain. ;* This module performs: ;* - Set the initial SP ;* - Set the initial PC == Reset_Handler ;* - Set the vector table entries with the exceptions ISR address ;* - Branches to __main in the C library (which eventually ;* calls main()). ;* After Reset the CortexM0 processor is in Thread mode, ;* priority is Privileged, and the Stack is set to Main. ;* <<< Use Configuration Wizard in Context Menu >>> ;****************************************************************************** ;* @attention ;* ;* Copyright (c) 2019 STMicroelectronics. All rights reserved. ;* ;* This software component is licensed by ST under Apache License, Version 2.0, ;* the "License"; You may not use this file except in compliance with the ;* License. You may obtain a copy of the License at: ;* opensource.org/licenses/Apache-2.0 ;* ;****************************************************************************** ; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; Stack Configuration ; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; 1、说明
说明里除了版权的声明外主要说明了启动文件的主要功能:
1) 设置堆栈指针SP = __initial_sp。
2) 设置PC指针 = Reset_Handler。
3) 设置中断向量表。
4) 配置系统时钟。
5) 配置外部SRAM/SDRAM用于程序变量等数据存储(这是可选的)。
6) 跳转到C库中的 __main ,最终会调用用户程序的main()函数。
Cortex-M内核处理器复位或者上电后,处于线程模式,指令权限为最高级别的特权级别,堆栈设置为使用主堆栈MSP。2、启动流程
单片机在复位或者重新上电之后,CPU首先将0X08000000位置存放的堆栈栈顶地址存放到SP中(MSP),当然这个的前提是我们的程序存储到了flash里。之后将0X08000004位置存放的向量地址放入PC程序计数器中。
这时候CPU从PC寄存器指向的地址取出指令并执行,这个执行的程序是复位中断的服务程序 Reset_Handler。
复位中断服务程序中调用了SystemInit()函数,这个函数的作用是配置系统时钟、配置FMC总线上的外部SRAM/SDRAM。调用完SystemInit()函数之后,跳转到了C库中的__main 函数。这个时候任务就交给了C库中的__main函数,__main函数对用户的程序进行初始化操作,然后__main函数会调用我们自己写的main函数执行程序。3、程序分析Stack_Size EQU 0x400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
1)这里EQU是个伪指令,和我们C中的#define比较像,编译器编译不会生成二进制代码。0X400表示栈的大小。
2)AREA STACK, NOINIT, READWRITE, ALIGN=3 这句话表示,下面开始定义一个代码段或者数据段。此处是定义数据段。AREA 后面的关键字表示这个段的属性。
STACK :这个是代表这个数据段的名字,当然我们可以取任意名字。
NOINIT:表示此数据段不需要填入初始数据。
READWRITE:表示此段可读可写。
ALIGN=3 :表示首地址按照 2 的 3 次方对齐,即按照 8 字节对齐(地址对8求余数等于0)。
4)SPACE 这行指令告诉编译器给 STACK (前面命名的名称)段分配 0x00000400 字节的连续内存空间。
5) __initial_s表示了栈顶地址。__initial_sp 只是一个标号,标号主要用于表示一片内存空间的某个位置,等价于 C 语言中的"地址"概念。地址仅仅表示存储空间的一个位置,从 C 语言的角度来看,变量的地址,数组的地址或是函数的入口地址在本质上并无区别。Heap_Size EQU 0x200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit
6)这部分代码实现开辟堆(heap)空间,主要用于动态内存分配,也就是说用 malloc,calloc, realloc等函数分配的变量空间是在堆上。这里和上面的类似,首先分配一片连续的内存空间这里的名字叫 HEAP,即分配堆的空间,大小是0X200。__heap_base 表示堆的开始地址。__heap_limit 表示堆的结束地址(只是标号)。 PRESERVE8 THUMB ; Vector Table Mapped to Address 0 at Reset AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size
7)PRESERVE8 指定当前文件保持堆栈八字节对齐。
8)THUMB表示后面的指令是THUMB指令集 ,我们的内核使用的THUMB指令集。
9)AREA定义一块代码段,只读,段名字是 RESET。
10)EXPORT语句将 3 个标号申明为可被外部引用, 主要提供给链接器用于连接库文件或其他文件。__Vectors DCD __initial_sp ; Top of Stack DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler 此处省略若干代码 DCD 0 ; Reserved DCD RTC_TAMP_IRQHandler ; RTC through EXTI Line DCD FLASH_IRQHandler ; FLASH DCD RCC_IRQHandler ; RCC DCD EXTI0_1_IRQHandler ; EXTI Line 0 and 1 DCD EXTI2_3_IRQHandler ; EXTI Line 2 and 3 DCD EXTI4_15_IRQHandler ; EXTI Line 4 to 15 此处省略若干代码 DCD I2C1_IRQHandler ; I2C1 DCD I2C2_IRQHandler ; I2C2 DCD SPI1_IRQHandler ; SPI1 DCD SPI2_IRQHandler ; SPI2 DCD USART1_IRQHandler ; USART1 此处省略若干代码
11)我们可以看到这里就是我们的中断向量表了,DCD 表示分配 1 个 4 字节的空间。每行 DCD 都会生成一个 4 字节的二进制代码。中断向量表存放的实际上是中断服务程序的入口地址。当异常(也即是中断事件)发生时,CPU 的中断系统会将相应的入口地址赋值给 PC 程序计数器,之后就开始执行中断服务程序。这里地址定义到了代码断的最前面。具体的物理地址由链接器的配置参数(IROM1 的地址)决定。我们的程序在 Flash 运行,中断向量表的起始地址是 0x08000000。
__Vectors_Size EQU __Vectors_End - __Vectors AREA |.text|, CODE, READONLY ; Reset handler routine Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT __main IMPORT SystemInit LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
12)AREA 定义一块代码段,只读,段名字是 .text 。READONLY 表示只读。
13)利用 PROC、ENDP 这一对伪指令把程序段分为若干个过程,使程序的结构加清晰。
14)WEAK 声明其他的同名标号优先于该标号被引用,就是说如果外面声明了的话会调用外面的。 这个声明很重要,它让我们可以在C文件中任意地方放置中断服务程序,只要保证C函数的名字和向量表中的名字一致即可。
15)IMPORT:伪指令用于通知编译器要使用的标号在其他的源文件中定义。但要在当前源文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。
16)SystemInit 函数,主要实现RCC相关寄存器复位和中断向量表位置设置。
17)__main 标号表示C/C++标准实时库函数里的一个初始化子程序__main 的入口地址。该程序的一个主要作用是初始化堆栈(跳转__user_initial_stackheap 标号进行初始化堆栈的,下面会讲到这个标号),并初始化映像文件,最后跳转到 C 程序中的 main函数。这就解释了为何所有的 C 程序必须有一个 main 函数作为程序的起点。因为这是由 C/C++标准实时库所规,并且不能更改。NMI_Handler PROC EXPORT NMI_Handler [WEAK] 省略若干 EXPORT TIM14_IRQHandler [WEAK] EXPORT TIM16_IRQHandler [WEAK] EXPORT TIM17_IRQHandler [WEAK] EXPORT I2C1_IRQHandler [WEAK] EXPORT I2C2_IRQHandler [WEAK] EXPORT SPI1_IRQHandler [WEAK] EXPORT SPI2_IRQHandler [WEAK] EXPORT USART1_IRQHandler [WEAK] EXPORT USART2_IRQHandler [WEAK]
18)死循环,用户可以在此实现自己的中断服务程序。不过很少在这里实现中断服务程序,一般多是在其它的C文件里面重新写一个同样名字的中断服务程序,因为这里是WEEK弱定义的。如果没有在其它文件中写中断服务器程序,且使能了此中断,进入到这里后,会让程序卡在这个地方。 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
19)简单的汇编语言实现IF…….ELSE…………语句。如果定义了MICROLIB,那么程序是不会执行ELSE分支的代码。__MICROLIB在MDK的Target Option里面设置。__user_initial_stackheap由__main函数进行调用。
日足小将三笘薰生活美满!与妻子去年7月结婚,对方是名跳远选手谁是现在最火热的日本球员呢?答案当然是三笘薰,这位现在在布莱顿效力的日本球员,在英超赛场上表现非常的出色,在面对利物浦的时候他的发挥也丝毫不怯场,一个人直接撕碎了对方的防线。再加上
陈戌源够强硬!废止蔡振华新政后又出新狠招,中超或有2队将解散中超新政的变化多端,几乎让投资人们跟不上趟。从最早的U23政策收取外援调节费使用中性名字,到限薪令,再到现在严苛的准入条件,几乎每年都有新花样。面对琳琅满目的新政策,很多俱乐部们最
一方丝巾,系住春天的浪漫逐渐向暖的春天,我们除了关注衣服款式的变化,也千万不要小看配饰的作用。丝巾替代了厚重的围巾,既可带来融融暖意,又足够轻盈飘逸,理所当然地成为春季专属浪漫,方寸之间,就可以让整个人焕
夫妻免票,情侣半票浪漫情人节邂逅古村群约惠指南!浪漫,不是突然的惊喜而是日复一日的陪伴情人节到了在这里祝所有的有情人终成眷属!情人节活动政策1。结婚夫妻免景区大门票(出示结婚证或户口本等有效证件)2。情侣同游,门票减半(情侣牵手
嵩山龙门迷雾中吹响集结号河南日报客户端记者李悦2月7日,随着2023年职业联赛俱乐部负责人会议在香河召开,新赛季各级职业联赛的筹备工作正式提上了日程。据了解,今年中超联赛将于4月中旬开赛,赛制也恢复到了大
中国乒乓之绝地反击被困住的胜利在今年春节档的七部影片中,中国乒乓之绝地反击(下文简称为中国乒乓)是最多戏的最晚定档,最早展映,迅速撤档改名,延期到大年初三上映,没过两天又再次撤档,改到2月17日上,在此期间还一
中国政法大学经济法学博士我们真的跑路了,抱歉了2022年11月21日,盛大金禧在官网高调公告我们跑路了官宣跑路,言语间满是炫耀和讽刺,文中写道我们真的跑路了,抱歉了,钱已经被我们用专业的团队洗干净了,我们人也在国外了,这个国家
截至目前,中国天眼发现脉冲星总数已超740颗!截至目前,中国天眼发现的脉冲星总数已经达到740颗以上。被称为中国天眼的500米口径球面射电望远镜(FAST),是目前世界上口径最大,灵敏度最高的单口径射电望远镜,其反射面面积大约
Webbeds泰国旅游峰会在曼谷举行重点关注中国市场峰会现场王贤思摄中新网曼谷2月9日电(王国安王贤思)Webbeds2023年泰国旅游峰会当地时间2月8日在曼谷举行,众多泰国本地及境外旅游企业代表参会。嘉宾演讲王贤思摄嘉宾演讲王贤
中国6大地域错觉没去过就很难相信,新疆被误会最多仅凭着初中地理课上学来的一鳞半爪,还远远谈不上了解世界。我们对这个世界,还存在着太多的误解和不切实际的想象。当你真正踏上梦中的土地,一些知识会被印证而有些知识,则会被彻底推翻。我以
中国男篮将在香港进行两场男篮世界杯亚大区预选赛新华社香港2月9日电(记者韦骅许朗轩)就中国国家男子篮球队2月在香港的两场2023年男篮世界杯亚大区预选赛,中国香港篮球总会9日召开新闻发布会介绍了赛事筹备工作。2月9日,中国香港