当前位置:首页 > 单片机 > 单片机
[导读] 我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一

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

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


1 启动模式的选择

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

启动模式选择引脚

启动模式说明BOOT1BOOT0X0主闪存存储器主闪存存储器作为启动区域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函数之旅……


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

本来,process就是过程,是很自然的。但在舶来的BPR、BPM等流行的同时,process又变成流程了。那么,流程图为生么不是process chart呢?process analysis应该是过程分析还是流程分析?...

关键字: procedure 过程 流程

芯片一般是指集成电路的载体,也是集成电路经过设计、制造、封装、测试后的结果,通常是一个可以立即使用的独立的整体。如果把中央处理器CPU比喻为整个电脑系统的心脏,那么主板上的芯片组就是整个身体的躯干。对于主板而言,芯片组几...

关键字: 集成电路 流程 制造

根据市场调查公司的研究,到了2020年将会有超过5亿颗的新一代处理器采用FOWLP封装制程技术,并且在未来,每一部智能型手机内将会使用超过10颗以上采用FOWLP封装制程技术生产的芯片。

关键字: 封装 流程

摘要:为了解决无线个人局域网的速率和成本冋题,分析了ZigBee无线传感网络的体系结构,给出T以CC2430片上系统芯片为核心的ZigBee无线网络系统的硬件构成以及主节点的软件程序流程。

关键字: Zigbee CC2430 硬件 流程

Nefele是可以在分布式环境中有效部署,扩展和监视流程的系统。 来自:沃尔夫冈·约翰 [v1] 2020年6月12日,星期五13:21:59 发布的论文。 无论是操作系统级别还是硬件级别的虚拟化,

关键字: 云计算 流程 监控 系统 流程控制

今年5月份,国务院常务会议确定,11月底前在全国实施“携号转网”,即实现不换手机号也能换运营商 。日前,工信部发布《携号转网服务管理暂行办法(征求意见稿)》,向社会公开征求意见。 那如何办理携号转网呢

关键字: 携号转网 操作 流程
关闭