当前位置: 首页 > news >正文

浅析stm32启动文件

浅析stm32启动文件

文章目录

  • 浅析stm32启动文件
    • 1.什么是启动文件?
    • 2.启动文件的命名规则
    • 3.stm32芯片的命名规则

1.什么是启动文件?

我们来看gpt给出的答案:

STM32的启动文件是一个关键的汇编语言源文件,它负责在微控制器上电或复位后执行最初的硬件配置和环境设置,为执行C语言的main函数做好准备。这个文件通常命名为startup_stm32xxxx.s,其中xxxx代表特定的STM32系列和型号,例如startup_stm32f429_439xx.sstartup_stm32f10x_md.s

启动文件的主要功能包括但不限于:

  1. 初始化栈指针 (Stack Pointer,SP):设置栈区的起始地址,确保函数调用和中断处理时有地方存放局部变量和保存CPU状态。

  2. 初始化程序计数器寄存器 (Program Counter,PC):设置程序开始执行的地址,通常是复位向量地址。

  3. 配置中断向量表:定义中断服务程序的入口地址,确保在发生中断时能正确跳转到对应的处理函数。

  4. 系统时钟配置:某些启动文件或与其配合的C代码(system_stm32f10x.c)会进行基本的时钟设置,以确保CPU和外设能够按预期频率工作。

  5. C库初始化:调用_init()函数来初始化C库,包括全局变量的初始化和静态构造函数的调用。

  6. 堆(heap)和栈(stack)的配置:尽管启动文件中可能包含对堆的基地址和大小的定义,但实际是否使用堆以及其大小,取决于应用代码中的动态内存分配需求。如果应用未使用堆,那么即使启动文件中有定义,编译后的映射文件(map file)中也不会显示堆的信息。

启动文件中关于栈和堆的大小配置(如Stack_SizeHeap_Size)可以根据具体应用的需求进行调整。如果程序中使用了大量的递归调用或者大的局部变量,可能需要增大栈的大小;如果程序中频繁进行动态内存分配,则可能需要更大的堆空间。

此外,中断矢量表的起始地址初始化通常在启动文件的复位处理程序中完成,通过设置系统控制块(System Control Block, SCB)的相应寄存器来指向中断向量表的起始位置。

什么意思呢?其实就是启动文件是系统上电后编译的第一个文件,主要完成了以下几个工作:

  1. 初始化堆栈指针SP=_initial_sp
  2. 初始化PC指针=Reset_Handler
  3. 初始化中断向量表
  4. 配置系统时钟
  5. 调用C库函数_main初始化用户堆栈,从而最终调用main函数去到C的世界

所以对于不同的芯片型号来说,芯片的启动文件也存在差异,然而那如何来选择启动文件呢?这就需要我们来了解启动文件的命名规则。

2.启动文件的命名规则

在这里插入图片描述

从上面这个表格就知道启动文件的类型和选择和芯片型号以及内存大小息息相关,而我们我们如何来确定自己芯片的Flash容量呢,就常见的F103系列就有很多的型号,我们如何来选择适合自己芯片的型号呢?这就需要了解芯片的命名规则。

3.stm32芯片的命名规则

在这里插入图片描述

通过手册中的解释我们就知道STM32的芯片型号遵循一定的结构,用以标识其系列、类型、性能、引脚数目、存储容量、封装类型等关键特性。而我们选择启动文件想要了解不同芯片的Flash,就需要关注芯片的存储容量标识:

如6(32K字节)、8(64K字节)、B(128K字节)、C(256K字节)、D(384K字节)、E(512K字节)、G(1M字节)等等。

通过对芯片型号的确定和第二部分各个系列对应的启动文件就可以正确选择启动文件。

(1M字节)等等。

通过对芯片型号的确定和第二部分各个系列对应的启动文件就可以正确选择启动文件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 图示 JVM 可达性分析算法
  • opencv—常用函数学习_“干货“_4
  • prompt第四讲-fewshot
  • ES6 Class 的继承(十一)
  • 《Linux系统编程篇》vim的使用 ——基础篇
  • 论文复现丨物流中心选址问题:蜘蛛猴算法求解
  • 摄像头 RN6752v1 视频采集卡
  • 【机器学习】Scoring Model Scores: 理解、设计与优化评分模型
  • OpenWrt安装快速入门指南
  • JS之在函数中返回匿名函数的用法
  • tessy 集成测试:小白入门指导手册
  • Ubuntu 编译和运行ZLMediaKit
  • samba服务、安装-smbpasswd工具、pdbedit工具、testparm工具
  • c语言唯一一个三目运算符
  • Qt MV架构 数据-窗口映射器
  • Fundebug计费标准解释:事件数是如何定义的?
  • Java读取Properties文件的六种方法
  • Java小白进阶笔记(3)-初级面向对象
  • Redis中的lru算法实现
  • Sass Day-01
  • 对象引论
  • 马上搞懂 GeoJSON
  • 日剧·日综资源集合(建议收藏)
  • 深度学习在携程攻略社区的应用
  • 什么是Javascript函数节流?
  • AI算硅基生命吗,为什么?
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​zookeeper集群配置与启动
  • ​决定德拉瓦州地区版图的关键历史事件
  • #、%和$符号在OGNL表达式中经常出现
  • #if #elif #endif
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)php新闻发布平台 毕业设计 141646
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (五)MySQL的备份及恢复
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • .Net Core 中间件与过滤器
  • .NET开源快速、强大、免费的电子表格组件
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET命名规范和开发约定
  • //usr/lib/libgdal.so.20:对‘sqlite3_column_table_name’未定义的引用
  • @SpringBootApplication 包含的三个注解及其含义
  • @SuppressWarnings(unchecked)代码的作用
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ 云计算 | AWS ] 对比分析:Amazon SNS 与 SQS 消息服务的异同与选择
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20161101]rman备份与数据文件变化7.txt
  • [240621] Anthropic 发布了 Claude 3.5 Sonnet AI 助手 | Socket.IO 拒绝服务漏洞
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [BJDCTF2020]EzPHP1