历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2018年02月03日 | STM32启动流程分析

2018-02-03 来源:eefocus

     我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。

    无论是STM32、ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。


    1 启动模式的选择

    STM32芯片自带的启动方式有3种如下表

启动模式选择引脚

启动模式说明
BOOT1BOOT0
X0主闪存存储器主闪存存储器作为启动区域
01系统存储器系统存储器作为启动区域
11内置SRAM内置SRAM作为启动葡萄

    STM32的启动选择,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。其中主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动;系统存储器启动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。

    就程序的启动而言,采用以上3种方式启动,但对于一个嵌入式系统的程序来说,如果程序执行文件很大,而STM32内置的存储空间有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存储在flash中,程序执行在SDRAM中,既节约了成本有提高了运行效率。如果采用外置的Flash+SDRAM的方式,就需要一个更加复杂的启动文件(bootloader),需要考虑flash的COPY,Flash的驱动,内存的管理,通信机制等,本文暂不涉及此内容,以后有机会专门讲述。

    2 启动文件STM32F10x.s分析

    关于STM32F10x.s的启动文件,主要做了3个工作:分配和初始化堆、栈;定义复位向量并初始化;中断向量表及其相应的异常处理程序。

    2.1 定义堆、栈及其初始化

    堆和栈是能够运行C语言的前提,如以下程序:

    定义栈:

    Stack_Size EQU 0x00000200

    AREA STACK, NOINIT, READWRITE, ALIGN=3

    Stack_Mem SPACE Stack_Size

    __initial_sp

    定义堆:

    Heap_Size EQU 0x00000000

    AREA HEAP, NOINIT, READWRITE, ALIGN=3

    __heap_base

    Heap_Mem SPACE Heap_Size

    __heap_limit

    初始化堆、栈:

    _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

    2.2 定义复位向量

    Boot引脚的设置不同,复位时,起始地址的位置不同,SRAM的起始地址为0x2000000, flash的起始地址为0x8000000。Cortex-M3内核规定,起始地址必须存放堆定指针,而第二个地址必须存放复位中断入口向量。在系统复位时,内核会自动从其实地址的下一个地址(即32位)空间取出复位中断入口向量,然后跳转到复位中断服务程序,该服务程序就会跳转到main()执行程序。

    中断向量表(部分向量):

    __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 0 ; Reserved

    DCD 0 ; Reserved

    DCD 0 ; Reserved

    DCD 0 ; Reserved

    DCD SVC_Handler ; SVCall Handler

    DCD DebugMon_Handler ; Debug Monitor Handler

    DCD 0 ; Reserved

    DCD PendSV_Handler ; PendSV Handler

    DCD SysTick_Handler ; SysTick Handler

    复位中断服务程序

    ; Reset Handler // 该程序会跳转到main()

    Reset_Handler PROC

    EXPORT Reset_Handler [WEAK]

    IMPORT __main

    LDR R0, =__main

    BX R0

    ENDP

    3 其他中断向量及服务子程序

    在启动文件中,只定义了中断向量,其相应的服务子程序跳转到空操作。为以后扩展中断服务程序做了准备。

    在以上这些都胜利跑完之后,我们的微处理器(MCU)就开始main函数之旅……


推荐阅读

史海拾趣

CETC公司的发展小趣事

CETC自成立以来,一直致力于电子科技领域的研发创新。在某次关键技术的攻关中,CETC的科研团队经过数月的艰苦努力,成功突破了某型雷达的核心技术,使我国在该领域达到了国际先进水平。这一成果的取得不仅提升了CETC的技术实力,也为公司在国内外市场赢得了良好的声誉,为公司的后续发展奠定了坚实基础。

ERP公司的发展小趣事

面对不断变化的市场环境和客户需求,电子智链始终保持创新和进取的精神。公司不断投入研发资源,推出新的ERP产品和解决方案,以满足客户日益增长的需求。同时,电子智链也积极应对来自国内外竞争对手的挑战,通过不断提高产品质量和服务水平来巩固自身的市场地位。在未来的发展中,电子智链将继续秉持“客户至上、创新驱动”的理念,致力于为电子企业提供更加先进、高效和可靠的ERP解决方案。

Frequency Devices公司的发展小趣事

Frequency Devices公司自成立之初,便以技术创新为核心驱动力。在20世纪90年代初,公司研发团队成功开发出一种新型高频滤波器,该滤波器在信号传输效率和稳定性上实现了重大突破。这一创新不仅解决了当时通信领域的一大技术难题,还迅速获得了市场的广泛认可。随着技术的不断迭代,Frequency Devices公司持续投入研发,推出了更多高性能、低成本的高频电子产品,逐步奠定了其在行业内的领先地位。

Cliff Electronic Components公司的发展小趣事

为了保证产品质量,Frequency Devices公司建立了完善的质量管理体系。公司引入了先进的生产设备和检测技术,对原材料采购、生产加工、成品检验等各个环节进行严格把控。同时,公司还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些措施有效保障了产品的质量和稳定性,赢得了客户的信赖和好评。

ET Enterprises Ltd公司的发展小趣事

进入1940年代后期,ET Enterprises Ltd公司将业务重心转向光电倍增管的开发和制造。通过不断的技术创新和市场拓展,公司逐渐在光电倍增管领域建立起领先地位,成为国际知名的光电倍增管供应商。

DB Lectro Inc公司的发展小趣事

为了进一步扩大市场份额,DB Lectro Inc积极寻求与国际知名企业的合作。通过与多家国际公司的技术交流和合作,公司成功地将自身的气体检测技术应用于更多领域,如天然气开采、食品饮料生产等。同时,公司还积极参与国际展览和交流活动,展示了其先进的技术和产品,赢得了国际市场的广泛认可。

问答坊 | AI 解惑

户用电热式热能量表的合作与开发

户用电热式热能量表的合作与开发 一、合作内容 针对我国户用热能量表市场提出的一种全新的户用电热式热能量表,以电热方式,对热能量以公平公正的方式进行交换,摆脱了供热与用热双方对以往使用的户用机械旋翼式热能量表所出现的困扰 ,即计量 ...…

查看全部问答>

vhdl中用altera_mf库的问题

LIBRARY ieee;USE ieee.std_logic_1164.all;LIBRARY altera_mf;USE altera_mf.all;ENTITY sin_tab IS        PORT        (                address    ...…

查看全部问答>

【SynPlify技术问题】在Synplify中如何才能将门电路组合在一起?

用Technology中的Gates view看电路图是,都是AND2 OR2 INV 的门,怎样才能把这些门综合起来,变成复杂的门,如AND3,AND4B2 等(不是RTL下)。谢谢各位…

查看全部问答>

workbench3.0的使用

刚开始接触vxworks6.6,对于workbench一窍不通,哪位大大有wind river workbench3.0的中文资料啊,英文的user\'s guide 实在是看得晕啊…… 万分感谢!!!…

查看全部问答>

TCPMP 0.72RC1 for CE6.0的错误-请kieven2008前来接分

请kieven2008前来接分,多谢你的帮助 否则我可能也要在这个问题了花几周时间,也有可能解决不了这个问题。…

查看全部问答>

请教下大家如何更好的调试wince驱动

RT,因为一直都是自己摸索着学,我都是把驱动整个写好然后再加载到系统中调试的,不知道大家有没有更好的办法,最好能走单步的。…

查看全部问答>

cygwin下挂接问题

执行环境是cgywin系统 创建文件映像: dd if=/dev/zero of=images/initrd.img bs=1k count=8192 建立文件系统并安装: /usr/sbin/mke2fs -F -v -m0 images/initrd.img mount e:/usr/local/armlinux/images/initrd.img /usr/local/armlinux/tmp ...…

查看全部问答>

程序查询方式是什么?

程序查询方式是什么? 看了几遍,不是很明白。恳请指教 …

查看全部问答>

ARm群:9548609 欢迎大家一起交流!!

ARm群:9548609 欢迎大家一起交流!!…

查看全部问答>

《AlientekSTM32实例手册》已上传20个经典实例!手册已上传

因为附件限制,不能在一个帖子中间发布所有源码和手册,所以特地附上已经上传的 实例的地址,希望对广大网友有帮助! 更新: 27个实验的库函数版本实现源码下载地址: https://bbs.eeworld.com.cn/icview-210815-1-1.html 1.原理图和PCB ...…

查看全部问答>