历史上的今天
今天是: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种如下表
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函数之旅……
下一篇:STM32:集成开发环境IDE
史海拾趣
|
户用电热式热能量表的合作与开发 一、合作内容 针对我国户用热能量表市场提出的一种全新的户用电热式热能量表,以电热方式,对热能量以公平公正的方式进行交换,摆脱了供热与用热双方对以往使用的户用机械旋翼式热能量表所出现的困扰 ,即计量 ...… 查看全部问答> |
|
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下)。谢谢各位… 查看全部问答> |
|
刚开始接触vxworks6.6,对于workbench一窍不通,哪位大大有wind river workbench3.0的中文资料啊,英文的user\'s guide 实在是看得晕啊…… 万分感谢!!!… 查看全部问答> |
|
TCPMP 0.72RC1 for CE6.0的错误-请kieven2008前来接分 请kieven2008前来接分,多谢你的帮助 否则我可能也要在这个问题了花几周时间,也有可能解决不了这个问题。… 查看全部问答> |
|
执行环境是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 ...… 查看全部问答> |
|
《AlientekSTM32实例手册》已上传20个经典实例!手册已上传 因为附件限制,不能在一个帖子中间发布所有源码和手册,所以特地附上已经上传的 实例的地址,希望对广大网友有帮助! 更新: 27个实验的库函数版本实现源码下载地址: https://bbs.eeworld.com.cn/icview-210815-1-1.html 1.原理图和PCB ...… 查看全部问答> |




