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

大容量 stm32 启动文件分析

[复制链接]
mjj123 提问时间:2010-5-18 22:46 /
IAR5.3  stm32  3.1.2库
我们都知道Cortex-M3的启动和以前的内核启动不一样,如arm7的内核,在flash的第一个地址处存放到是一个跳转指令,跳转到初始代码处。而Cortex-M3的flash的第一个地址0x0800 0000处存放的是初始默认的堆栈指针的地址(大容量的一般是0x2000 0400),在0x0800 0004处存放的是一个地址,所以内核上电后,它会先从0x0800 0004处取出地址,并跳转到这个地址处,也就是初始代码的地址处 __iar_program_start,这就是启动代码的入口:在startup_stm32f10x_hd.s中。
__iar_program_start:
  08000C20  F7FFFFD5  BL           __low_level_init  ;跳转到 __low_level_init 
  08000C24  2800      CMP          R0, #0x0
  08000C26  D001      BEQ          __iar_init$$done
  08000C28  F7FFFFDE  BL           __iar_data_init2
__iar_init$$done:
.text_2:
  08000C2C  2000      MOVS         R0, #0x0
  08000C2E  F7FFFA7F  BL           main
 
 
__low_level_init中,下划线的部分是源程序,也即是在startup_stm32f10x_hd.s中的代码
__low_level_init:
  08000BCE  4804      LDR          R0, [PC, #0x10]
                MOV  R11, LR
  08000BD0  46F3      MOV          R11, LR
                BLX  R0
  08000BD2  4780      BLX          R0 ;跳转到SystemInit_ExtMemCtl处,SystemInit_ExtMemCtl是初始化外部储存器的一段代码。   PUBWEAK SystemInit_ExtMemCtl 作用就是当用到外部sram的时候,就转到 system_stm32f10x.c中,执行void SystemInit_ExtMemCtl(void) 函数(前提是 #define DATA_IN_ExtSRAM 要打开),而不用外部sram时,就执行startup_stm32f10x_hd.s中的SystemInit_ExtMemCtl。
                LDR  R1, =sfe(CSTACK)        ; restore original stack pointer
  08000BD4  4903      LDR          R1, [PC, #0xC]
                MSR  MSP, R1    
  08000BD6  F3818808  MSR          MSP,R1  ;把堆栈指针存入r13中
                MOV  R0,#1
  08000BDA  F04F0001  MOV          R0, #0x1
                BX    R11
  08000BDE  4758      BX           R11  ;返回到__iar_program_start:,执行__iar_data_init2,初始化数据,一般是全局变量
 
  
 
 
 
  

__iar_data_init2:
  08000BE8  B510      PUSH         {R4,LR}
  08000BEA  4804      LDR          R0, [PC, #0x10]
  08000BEC  4C04      LDR          R4, [PC, #0x10]
  08000BEE  E002      B            0x8000BF6
  08000BF0  F8501B04  LDR          R1, [R0], #0x4
  08000BF4  4788      BLX          R1
  08000BF6  42A0      CMP          R0, R4
  08000BF8  D1FA      BNE          0x8000BF0
  08000BFA  BD10      POP          {R4,PC}  ;初始化完成后,把LR压入PC继续先下执行,看看上面执行到哪了,下一条就是__iar_init$$done了,再执行到main了,也就是进入我们的main()函数了。
  08000BFC  BC0B0008  DC32         0x08000BBC
  08000C00  CC0B0008  DC32         0x08000BCC
__iar_zero_init2:                                                   ;对全局变量清零,从我们自己定义的堆栈处向上清零,个数有全局变量占的空间决定
  08000C04  2300      MOVS         R3, #0x0
  08000C06  E005      B            0x8000C14
  08000C08  F8501B04  LDR          R1, [R0], #0x4
  08000C0C  F8413B04  STR          R3, [R1], #0x4
  08000C10  1F12      SUBS         R2, R2, #0x4
  08000C12  D1FB      BNE          0x8000C0C
  08000C14  F8502B04  LDR          R2, [R0], #0x4
  08000C18  2A00      CMP          R2, #0x0
  08000C1A  D1F5      BNE          0x8000C08
  08000C1C  4770      BX           LR  
  08000C1E  0000      MOVS         R0, R0
 
注意的是,__iar_data_init2:等的代码在
__exit                  0x08000c51    0x14  Code  Gb  exit.o [5]
__iar_data_init2        0x08000be9    0x1c  Code  Gb  data_init2.o [4]
__iar_program_start     0x08000c21          Code  Gb  cmain.o [4]
__iar_sh_stdout_close   0x08000c39    0x14  Code  Gb  iarwstd.o [5]
__iar_sh_stdout_handle  0x20009660     0x4  Data  Lc  iarwstd.o [5]
__iar_zero_init2        0x08000c05    0x1a  Code  Gb  zero_init2.o [4]
__low_level_init        0x08000bcf          Code  Gb  startup_stm32f10x_hd.o [1]

自己看看map文件吧。
这写就是我自己的理解。嘿嘿,希望对初学者有点帮助
 
word版  Cortex-M3启动代码分析.doc (34 KB, 下载次数: 37)

启动代码分析.doc

下载

34.5 KB, 下载次数: 61, 下载积分: ST金币 -1

收藏 评论1 发布时间:2010-5-18 22:46

举报

1个回答
wxy_stmcu 回答时间:2010-5-20 17:31:38

RE:大容量 stm32 启动文件分析

帮助太大了,如能也解释一下中容量产品的就更好了,如能也解释一下小容量产品的就完美了,“前300年无来者,后300年无人及”,^_^

所属标签

相似问题

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