名为“startup_stm32f429_439xx.s”的文件,它里边使用汇编语言写好了基本程序,当STM32芯片上电启动的时候,首先会执行这里的汇编程序,从而建立起C语言的运行环境,所以我们把这个文件称为启动文件。该文件使用的汇编指令是Cortex-M4内核支持的指令,可从《Cortex-M4 Technical Reference Manual》查到,也可参考《Cortex-M3权威指南中文》,M3跟M4大部分汇编指令相同。
startup_stm32f429_439xx.s文件是由官方提供的,一般有需要也是在官方的基础上修改,不会自己完全重写。该文件可以从 KEIL5 安装目录找到,也可以从 ST 库里面找到,找到该文件后把启动文件添加到工程里面即可。不同型号的芯片以及不同编译环境下使用的汇编文件是不一样的,但功能相同。
启动文件主要功能:
初始化堆栈指针 SP
初始化程序计数器指针 PC
设置堆、栈的大小
设置中断向量表的入口地址
配置外部SRAM作为数据存储器(根据需要配置)
调用systemInit() 函数配置STM32的系统时钟
设置C库的分支入口“ __main” (最终用来调用main函数)
__main 其实不是我们定义的(不要与C语言中的main函数混淆),当编译器编译时,只要遇到这个标号就会定义这个函数,该函数的主要功能是:负责初始化栈、堆,配置系统环境,准备好C语言并在最后跳转到用户自定义的 main 函数,从此来到 C 的世界。
关键字:秉火4 启动文件 堆栈
引用地址:
秉火429笔记之四启动文件分析
推荐阅读最新更新时间:2024-11-10 22:20
关于STM32F10x.s启动文件
在 STM32不完全手册里面 ,我们所有的例程都采用了一个叫STM32F10x.s的启动文件,里面定义了STM32的堆栈大小以及各种中断的名字及入口函数名称,还有启动相关的汇编代码。STM32F10x.s是MDK提供的启动代码,从其里面的内容看来,它只定义了3个串口,4个定时器。实际上STM32的系列产品有5个串口的型号,也只有有2个串口的型号,定时器也是,做多的有8个定时器。比如,如果你用的STM32F103ZET6,而启动文件用的是STM32F10x.s的话,你可以正常使用串口1~3的中断,而串口4和5的中断,则无法正常使用。又比如,你TIM1~4的中断可以正常使用,而5~8的,则无法使用。 所以STM32F10x.s并
[单片机]
ST堆栈寄存器原理图
ST堆栈寄存器的作用,是出现中断或子程序调用时,保存断点处PC的值,以便中断或子程序结束时,能继续执行原程序。其原理图见2-10。 图2-10 ST堆栈寄存器原理图 图中,信号STEN的作用是将数据总线DBUS上数据存入堆栈寄存器ST中。
[模拟电子]
在ARM开发环境下C语言的设置堆栈指针和清理BSS段的作用概述
以前稍微写过操作系统上的C程序,感受不出来:BSS段,堆栈的意义。到了在单片机上写程序也没有考虑这些问题。但是到了ARM上环境似乎没有那么简单了,C的环境要自己来创建,不然就不能用。这也深刻的感受到了C语言中原来难以理解的概念。 裸机建立C语言环境-设置堆栈指针 这个是使用C语言的首要条件,不过这个就是指定一个sp指针就可以了,很简单的。ldr sp, =4096。 裸机建立C语言环境-清理BSS段 如果C语言中用到的全局变量或者静态变量,这个编译的时候是把它们放到了BSS段,这个段在内存中。怎么建成的?手动写一个链接脚本,添加__bss_start __bss_end变量来表示BSS段的开始和结束。如下: SECTION
[单片机]
STM32启动过程解析-2.02固件库启动文件分析
启动过程也许平时开发的时候不用太多关注,但是了解一下有助于我们加深对芯片工作过程的理解。 相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况: 1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处; 2、 通过boo
[单片机]
STM32之启动文件详解
在嵌入式应用程序开发过程里,由于使用C语言编程,基本很少涉及到机器底层寄存器的执行过程,一般都会直接在main函数里开始写代码,似乎main成为了理所当然的起点,尽管从C程序的角度来看程序都是直接从main函数开始执行。然而,MCU上电后,是如何寻找到并执行main函数这一问题却很自然的被忽略了!事实上微控制器是无法从硬件上去定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,因此main函数的入口地址在编译后便不一定是一个绝对地址。MCU上电后又是如何寻找到这个入口地址呢?以前接触无论是PIC、AVR、MSP430或是51过程中都没涉及到启动文件的配置,仅仅只有熔丝位或配置字是需
[单片机]
STM32启动文件总结
一、ARM控制器一些启动简介 ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令,执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况: 1、通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处; 2、通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处; 3、通过boot引脚设置可以将中断向量
[单片机]
串口通信的单片机程序
beep bit p3.7 ;蜂鸣器定义 org 00h jmp main org 23h ;串行中断入口地址 jmp com_int ;串行中断服务程序 ;*********** 主程序开始 ******************* org 30h main: mov sp,#30h ;设置堆栈 lcall rest ;初始化 lcall comm ;串口初始化 jmp $ ;原地等待 ; ************* 初始化 **
[单片机]
说说STM32的堆栈与内存
1.概念 这里所说的堆栈,是针对单片机所说的“堆”与“栈”,指的是内存中一片特殊用途的区域。而不是数据结构中的堆栈(虽然其实规则一样)。 这里所说的内存,是指RAM,RAM包括SRAM,DRAM等。而不是什么手机内存卡之类。 这里所说的flash,指的是用作为ROM的存储器,保存代码与常量数据。而不是动画制作。。。 栈的生长方向:指的是入栈方向,从高地址向低地址生长叫做向下生长,或逆向生长;反过来就叫向上生长,或正向生长。STM32的栈是向下生长。 2.内存中的堆栈安排 确切地说,是keil mdk根据STM32的特性,对stm32的RAM甚至flash进行部署。 编译工程后,在生成的.map文件里可以看到具体
[单片机]