stm32代码_STM32 启动代码分析

1,首先,设备关机的情况下,你按reset s时

72533563cfec8c061074fd78a4cb079a.png

STM32 NRESET 被拉低。

6fed15613b8385f0f5b5117f20c918ca.png

系统system_reset 就会收到信号,然后STM32 CPU会自动调到系统的异常向量表。

97220ac9aae2d908f7ff472bf4056435.png

这个是纯硬件行为,CPU的PC寄存器直接加载这个向量表+04偏移量的指令。

2,这个指令具体是啥了,默认情况下 这个向量表是在FLASH的最开始的地方,这个位置实际上可以编程更改的,比如把他放到RAM中,然后告诉NVIC 这个向量表放在RAM中也是可以,后面细说。先来看一下连接脚本。

27f997b6aa4ae12a243accae45d01ee4.png

图片上, *.isr_vector section 首先放在了flash 的最开始地方,接下来才是我们程序的.Text段。再来看看startup_stm32l475xx.s。

237b6a5c35dfcd7f10e451b897ad7b81.png

vector

这段汇编代码还是比较简单的,.section 指明了g_pfnVector object 放到 .isr_vector 段中,也就是说这个g_pfnVector 的数据放到了flash 最开始的地方。所以按reset时,会跳到第二个.word Reset_handler,仔细看看这个reset _handler 中断处理函数。

7130fb4c3fd3c0190f77fdd679290408.png

3,reset_handler 分析。

63行,初始化SP,把RAM的结束地址(也就是最大RAM size-1)放到SP寄存器中,栈是向下生长的。

66,把0放到R1。

67, 跳到LoopCopyDataInit 处

75,_stata,_edata,也是在连接脚本中指定的。

4bed4298e9b4da35f79cec0755f2618b.png

这个就是编译工具链把把各个程序.data(如全局变量)全放到这.data section 的开始和结束地址之间。比如你一个a.c 文件 一个全局变量int count=1, b.c文件 char []str='stm32'.编译器会把这1,stm32 这些数据全放到.data 中。 我们把程序烧到flash中,程序在执行前,需把这变量部分在ram中先初始化。说白了,汇编69---到82 就是这个事。

84-到91 行 这个也和data 段的数据初始化差不多,也是在RAM中在用0初始它。比如a.c 文件中一个全局变量int result; 这个未初始化。这段代码就用0把它给初始化了,.bss 段的数据在flash是没有存储空间的。连接脚本只记录了一下大小,.sbss/.ebss.分别是这段bss段开始和结束的位置。85,r3 设置为0。86把0写到r2 寄存器指向的内存地址处。

94,96,98行分别调用这个三个C代码写的函数, system_int.c 初始化RCC模块中的时钟,这个阶段目前用MSI(内部高速时钟源)作为系统的时钟。__libc_init_array 这个函数直接是工具链在编译你的程序是用到的外部一些库比如c库,newlib等。最后就是我们的main函数了。

4 启动的汇编代码通常和连接脚本,还是板子的配置都相关联。比如RAM、flash大小。 汇编代码需要初始化C程序的运行环境。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值