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

查看: 9382|回复: 1

大容量 stm32 启动文件分析

[复制链接]

3

主题

8

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-5-18 22:46:05 | 显示全部楼层 |阅读模式
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

回复

使用道具 举报

7

主题

12

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2010-5-20 17:31:38 | 显示全部楼层

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

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

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版