你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32再学习——启动流程分析

[复制链接]
党国特派员 发布时间:2015-1-7 13:14
  我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。
: ~2 I1 x, ?4 s. q8 F  无论是STM32、ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。
  s9 }5 h' R+ k, E" p  1 启动模式的选择
6 u& o. F/ M/ |7 E1 V  STM32芯片自带的启动方式有3种如下表
9 R# }$ M, |" h( z# K/ [
6 z% j& `5 o- |3 @9 S
启动模式选择引脚
启动模式
说明
BOOT1
BOOT0
X
0
主闪存存储器
主闪存存储器作为启动区域
0
1
系统存储器
系统存储器作为启动区域
1
1
内置SRAM
内置SRAM作为启动葡萄
  STM32的启动选择,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。其中主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动;系统存储器启动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。" M1 K& T& e$ I
  就程序的启动而言,采用以上3种方式启动,但对于一个嵌入式系统的程序来说,如果程序执行文件很大,而STM32内置的存储空间有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存储在flash中,程序执行在SDRAM中,既节约了成本有提高了运行效率。如果采用外置的Flash+SDRAM的方式,就需要一个更加复杂的启动文件(bootloader),需要考虑flash的COPY,Flash的驱动,内存的管理,通信机制等,本文暂不涉及此内容,以后有机会专门讲述。
4 U7 f0 I! w. H9 A$ k  2 启动文件STM32F10x.s分析
! _% S/ m& S& _  V5 P- x: m  关于STM32F10x.s的启动文件,主要做了3个工作:分配和初始化堆、栈;定义复位向量并初始化;中断向量表及其相应的异常处理程序。* V8 t9 O+ F. A
  2.1 定义堆、栈及其初始化0 o% }' s  X: B" o4 G) V% c
  堆和栈是能够运行C语言的前提,如以下程序:
- d0 C& ^/ J# q" V% P- ^* v  定义栈:
2 g) E0 [& _' f, I0 Y$ {6 B7 \0 z  Stack_Size EQU 0x00000200
2 h6 `( ~4 a2 k" [. |5 |6 ~  AREA STACK, NOINIT, READWRITE, ALIGN=36 S4 T" G  N. z+ y
  Stack_Mem SPACE Stack_Size
+ x3 s# A2 ?/ \8 V+ p+ w( c  __initial_sp: h5 O* `6 \" B. T5 o9 d# c# k7 [
  定义堆:
3 S0 k* _& M; S' v8 D2 O  Heap_Size EQU 0x00000000
* H1 W8 y# L- w9 Z; t- i& `1 J  AREA HEAP, NOINIT, READWRITE, ALIGN=3+ f6 A5 Y3 w4 ?, R( ~/ G
  __heap_base7 l# T. R* V4 _0 i
  Heap_Mem SPACE Heap_Size
+ ^0 K" V% M7 r; _9 \. [( e1 l) N  __heap_limit
4 ]/ N! U: ^# N2 P) }) K  初始化堆、栈:
* G/ t1 M$ n: `& v  _user_initial_stackheap( `; i0 U7 I: P- t& m* |/ i
  LDR R0, = Heap_Mem
1 E% j  P9 b' J+ p( {4 G  LDR R1, =(Stack_Mem + Stack_Size)
* }9 N  d: |: q- w( \* i/ k8 E  LDR R2, = (Heap_Mem + Heap_Size)0 n4 ~: ~0 w, u5 H, o5 h; M; A* r
  LDR R3, = Stack_Mem# S. D7 h* `, Q3 G+ W$ t
  BX LR
$ a5 c. t+ d* \. P  2.2 定义复位向量3 Q, H1 H1 X3 d+ ^$ z/ a9 H
  Boot引脚的设置不同,复位时,起始地址的位置不同,SRAM的起始地址为0x2000000, flash的起始地址为0x8000000。Cortex-M3内核规定,起始地址必须存放堆定指针,而第二个地址必须存放复位中断入口向量。在系统复位时,内核会自动从其实地址的下一个地址(即32位)空间取出复位中断入口向量,然后跳转到复位中断服务程序,该服务程序就会跳转到main()执行程序。: Z. \) n2 C/ q, q( P. O
  中断向量表(部分向量):
/ s4 Y! ~* a) W5 r* ?* o  __Vectors
+ D* w2 X3 _) l/ i7 z: T, S  DCD __initial_sp ; Top of Stack // 初始化堆跳转( c% J( S. \( F" F+ v
  DCD Reset_Handler ; Reset Handler // 复位中断向量跳转8 e  c0 F2 M' w  {- i( {+ [
  DCD NMI_Handler ; NMI Handler; K  w  I% ]1 R7 t# x! z
  DCD HardFault_Handler ; Hard Fault Handler
& s3 A( `  }2 x2 A; H# I  DCD MemManage_Handler ; MPU Fault Handler, s5 j0 g- \. J$ ^/ K7 x8 ^
  DCD BusFault_Handler ; Bus Fault Handler" H( |+ j& I( S5 j  Q  Y- m
  DCD UsageFault_Handler ; Usage Fault Handler9 b+ Z, y. U& O2 \
  DCD 0 ; Reserved
& ^/ |- u3 a! O  DCD 0 ; Reserved
: b) t+ {4 E  V: T6 W$ j  DCD 0 ; Reserved
6 i" t$ g; x* m. `+ l+ f( C  DCD 0 ; Reserved) U" n- X3 v# q2 R0 \# y1 a# c8 p
  DCD SVC_Handler ; SVCall Handler: w, H; |6 z/ t: @* I
  DCD DebugMon_Handler ; Debug Monitor Handler
* h4 q, c, |% x, a6 G, K. u$ j  DCD 0 ; Reserved+ c" c, \% w1 K4 k3 `& Y
  DCD PendSV_Handler ; PendSV Handler
8 s& O. O/ G4 u* C! S8 O, D* h  DCD SysTick_Handler ; SysTick Handler* g" Y7 @/ `% k1 L* I5 T
  复位中断服务程序
. p  J8 ~2 H& }  ; Reset Handler // 该程序会跳转到main()
9 C; i( d2 w% d* U2 ]5 q* B% R9 Y- s  Reset_Handler PROC
7 H0 c7 i& z: K, S$ }  EXPORT Reset_Handler [WEAK]1 w6 ?$ K9 W. ?; h- l
  IMPORT __main2 J' K( D5 M0 u
  LDR R0, =__main# C7 t% M/ a8 {' m
  BX R0) Z' \9 Q9 |) l" o& q
  ENDP7 y) R" a& G' o% k/ S" S; t
  3 其他中断向量及服务子程序6 D6 \) `7 T6 ^1 @5 U0 h6 v
  在启动文件中,只定义了中断向量,其相应的服务子程序跳转到空操作。为以后扩展中断服务程序做了准备。" l7 u; Y3 t7 ]
  在以上这些都胜利跑完之后,我们的微处理器(MCU)就开始main函数之旅……
! W- L! n7 U* h+ p

9 x& \$ @" y0 [. E5 J9 U! t& ?
赞 收藏 评论1 发布时间:2015-1-7 13:14

举报

1个回答
moyanming2013 回答时间:2015-1-7 15:09:36
过来支持下
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版