秦朝歌 2022-12-09 22:02 采纳率: 100%
浏览 39
已结题

Stm32的启动文件执行

我们都熟悉单片机上电后执行启动文件的汇编代码,初始化栈顶指针,初始化PC到reset_handler.

很疑惑,我们用的启动文件,怎么在机器上电的时候被执行的,是烧录的时候,启动文件的汇编代码被固化到哪了吗?求指导。

  • 写回答

2条回答 默认 最新

  • 单片机的码农 2022-12-12 12:29
    关注

    1.汇编文件被编译link到bin文件中了。先看下工程设置里Link页,

    img


    ro_base是0x8000000
    再看下编译的s文件,定义的RESET 段,

    img

    该reset段是map文件中可以找到,如下:

    img


    通过对编译代码添加测试代码,如下图

    img


    编译生成hex文件后,使用jfalsh打开,发现如下:

    img


    即可证明.s文件被连接到hex的开始位置,也就是0x8000000开始的地址处。当然如果sct文件中指定了位置,s文件的位置将会受sct文件影响。

    通过上述可知,Reset_Handler的地址就是存放复位向量的。当芯片复位后,会进到复位中断处理函数处执行,即如下代码:

    img

    依次执行SystemInit函数及__main函数,注意这里的__main不是我们定义的main,而是C库函数,主要是用来初始化系统堆栈,并跳到我们定义的main处理运行。
    更为详细的启动文件分析可以看下这篇文章:
    https://blog.csdn.net/chenbee168/article/details/128246677

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 12月20日
  • 已采纳回答 12月12日
  • 创建了问题 12月9日

悬赏问题

  • ¥20 安装 opencv4nodejs 报错
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥15 复杂网络,变滞后传递熵,FDA
  • ¥20 csv格式数据集预处理及模型选择
  • ¥15 部分网页页面无法显示!