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

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

[复制链接]
党国特派员 发布时间:2015-1-7 13:14
  我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。
) w6 N) o6 e& K# g; j  无论是STM32ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。
; B: G' U6 Z% L/ m/ r  1 启动模式的选择1 j1 A8 ?4 W; {$ R  ^
  STM32芯片自带的启动方式有3种如下表
# [7 s$ c4 d& R
; P( A$ L. A1 _) U
启动模式选择引脚
启动模式
说明
BOOT1
BOOT0
X
0
主闪存存储器
主闪存存储器作为启动区域
0
1
系统存储器
系统存储器作为启动区域
1
1
内置SRAM
内置SRAM作为启动葡萄
  STM32的启动选择,通过设置BOOT1、BOOT0的引脚的高低电平即可选择。其中主闪存启动是将程序下载到内置的Flash进行启动(该flash可运行程序),该程序可以掉电保存,下次开机可自动启动;系统存储器启动是将程序写入到一快特定的区域,一般由厂家直接写入,不能被随意更改或擦除。内置SRAM启动,由于SRAM掉电丢失,不能保存程序,一般只用于程序的调试。# F& q8 {6 g* ~; [  n- U
  就程序的启动而言,采用以上3种方式启动,但对于一个嵌入式系统的程序来说,如果程序执行文件很大,而STM32内置的存储空间有限,就需要外置Nand flash/Nor flash 和SDRAM,即程序存储在flash中,程序执行在SDRAM中,既节约了成本有提高了运行效率。如果采用外置的Flash+SDRAM的方式,就需要一个更加复杂的启动文件(bootloader),需要考虑flash的COPY,Flash的驱动,内存的管理,通信机制等,本文暂不涉及此内容,以后有机会专门讲述。
" y( e: T/ R% i% C& B5 X8 o  2 启动文件STM32F10x.s分析
* T/ y% j- Z6 H/ V/ q; z  关于STM32F10x.s的启动文件,主要做了3个工作:分配和初始化堆、栈;定义复位向量并初始化;中断向量表及其相应的异常处理程序。
' L. B0 \7 q  s: l6 d5 b  2.1 定义堆、栈及其初始化
) ]( J) W( {5 |  堆和栈是能够运行C语言的前提,如以下程序:
; N% l" k3 P: L3 ~  定义栈:
3 ]: X8 z' x5 [  f+ V" g1 o$ p: t4 @  O  Stack_Size EQU 0x00000200% a  {, U9 t  |! Q
  AREA STACK, NOINIT, READWRITE, ALIGN=3- h) `; v) R: G1 u7 k: [7 x
  Stack_Mem SPACE Stack_Size
  f+ S. H2 b  @* D* r  __initial_sp0 e' r1 f9 P: g0 s, O8 T1 J
  定义堆:
* w, _5 B( p  j% B  Heap_Size EQU 0x00000000  `; b/ ~% W; f* E& k. B# ~, h
  AREA HEAP, NOINIT, READWRITE, ALIGN=3+ `' b) c/ C7 P' z
  __heap_base
* U& l( p9 B2 y1 X3 v2 \# @  Heap_Mem SPACE Heap_Size0 B" {" P5 d8 N$ N$ j
  __heap_limit( U6 Y" M  b& S) j8 g; X; I
  初始化堆、栈:2 K# I+ K4 o( D0 b, z
  _user_initial_stackheap
5 A* H, U. r2 R- z1 F, H- c+ M  LDR R0, = Heap_Mem
5 k' E5 E- O# W5 Z! g& U! [  LDR R1, =(Stack_Mem + Stack_Size)8 ~# ^" i. Y( p: [% a# Q
  LDR R2, = (Heap_Mem + Heap_Size)9 E/ B3 G, W9 h  ~/ n
  LDR R3, = Stack_Mem# L3 m. i* [* r0 k3 A) K
  BX LR
3 K: `' L" B5 _* n  2.2 定义复位向量
+ U. s- z! \* n8 b% j2 u% ]6 Q  o* S  Boot引脚的设置不同,复位时,起始地址的位置不同,SRAM的起始地址为0x2000000, flash的起始地址为0x8000000。Cortex-M3内核规定,起始地址必须存放堆定指针,而第二个地址必须存放复位中断入口向量。在系统复位时,内核会自动从其实地址的下一个地址(即32位)空间取出复位中断入口向量,然后跳转到复位中断服务程序,该服务程序就会跳转到main()执行程序。
( G% W4 l7 o2 ]% {  中断向量表(部分向量):7 b' V, x: N$ t$ p8 N( `: m
  __Vectors8 ~+ f: {6 E; U) ^+ }
  DCD __initial_sp ; Top of Stack // 初始化堆跳转! y. Z: O7 w) z# k+ W& n# s
  DCD Reset_Handler ; Reset Handler // 复位中断向量跳转
6 Y7 \, D, {- W8 v4 ]$ \4 u8 m  DCD NMI_Handler ; NMI Handler2 m& ]- E( S( u
  DCD HardFault_Handler ; Hard Fault Handler( C* N' k0 ]3 P- F1 D  i
  DCD MemManage_Handler ; MPU Fault Handler
  u3 P/ l8 X$ l  DCD BusFault_Handler ; Bus Fault Handler
. g0 u, x0 U2 l8 d* ^  DCD UsageFault_Handler ; Usage Fault Handler
" H1 f* A; X7 B+ N- ~( [  DCD 0 ; Reserved
% G8 x0 }" e$ K  [; _$ u  DCD 0 ; Reserved2 j: [8 Q/ C# W/ T
  DCD 0 ; Reserved
% e% H* d7 H9 e; Q  DCD 0 ; Reserved" y( N% M9 {7 S8 J3 u, l6 ^0 Q1 ]
  DCD SVC_Handler ; SVCall Handler
4 C9 u6 }+ b6 c$ z( E8 k2 D; T* K+ F  DCD DebugMon_Handler ; Debug Monitor Handler
9 i) A! q; `: o  DCD 0 ; Reserved/ u6 ]0 C! ]% F
  DCD PendSV_Handler ; PendSV Handler- `$ ~6 v1 ?- W. H
  DCD SysTick_Handler ; SysTick Handler; |" Q7 N! m. H4 ?  ~
  复位中断服务程序3 \8 L& B! |  C& i* p
  ; Reset Handler // 该程序会跳转到main()
4 l/ M! D4 ^" T  Reset_Handler PROC
: n% m# T& p4 h' \  m/ y  EXPORT Reset_Handler [WEAK]
  Z+ I! w1 R% I6 y6 A" v0 z  IMPORT __main2 d% C  C/ ?7 o; O8 s4 X! B
  LDR R0, =__main1 n1 T5 G& [0 y$ k9 ^# a0 p) F; d
  BX R0: c- t5 S4 x+ D+ T
  ENDP
0 n7 c' [6 ^9 T. y. ?' p- N  3 其他中断向量及服务子程序
& U5 S1 Y6 W. F7 Z  ^  在启动文件中,只定义了中断向量,其相应的服务子程序跳转到空操作。为以后扩展中断服务程序做了准备。
* `% P  ?4 ^$ y5 a: W  在以上这些都胜利跑完之后,我们的微处理器(MCU)就开始main函数之旅……
, Q' @: y( B& e

5 ]" a3 B: V  U, K8 x# B
收藏 评论1 发布时间:2015-1-7 13:14

举报

1个回答
moyanming2013 回答时间:2015-1-7 15:09:36
过来支持下

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版