STM32启动过程详解

  • 一、eclipse+GCC+stm32+hal库详细介绍:
    • 1、通过eclipse创建好一个空工程
    • 2、工程精简(删除多余代码)
    • 3、禁用DEBUG代码:
  • 二、eclipse+GCC+stm32工程布局及各模块介绍:
  • 三、GCC下STM32启动代码讲解:
    • 1、向量表__isr_vertors[ ]:
    • 2、复位中断Reset_Handler():
    • 3、启动函数 _start():
      • __initialize_hardware_early()函数
      • __initialize_data(&_sidata, &_sdata, &_edata) 函数
      • __initialize_bss(&__bss_start__, &__bss_end__) 函数
      • __initialize_hardware()函数
  • 结语

~~ 原创文章,转载请注明出处 !

关于eclipse搭建stm32开发环境的内容请移步:【windows下基于Eclipse搭建stm32开发环境】

关于eclipse + stm32 + hex和bin文件下载请移步:【windows下基于Eclipse搭建stm32开发环境(2)】hex和bin文件下载到单片机
关于GCC下STM32链接脚本ld文件讲解请移步:【windows下基于Eclipse搭建stm32开发环境(3)】GCC链接脚本(.ld)文件详解

一、eclipse+GCC+stm32+hal库详细介绍:

1、通过eclipse创建好一个空工程

如下图所示:

2、工程精简(删除多余代码)

其实不精简也没关系,不会影响编译后bin文件的大小,但是无用代码多了看着麻烦
然后删除一些没用的东西:


3、禁用DEBUG代码:

DEBUG宏是STM32工程的调试代码控制开关,没有什么用,暂时关掉,也能节省空间

具体操作是删除汇编、C、C++模块配置项中预处理中的DEBUG

精简后重新编译,不会报错:

二、eclipse+GCC+stm32工程布局及各模块介绍:

经过对eclipse的ARM开发插件创建的STM32工程进行精简后,我们就得到了一个可以开发空工程。Eclipse开发环境下STM32工程文件介绍如下图所示:

三、GCC下STM32启动代码讲解:

STM32启动流程:

STM32F103的Flash起始位置0x8000000,存放是向量表,向量表前四个字节是栈顶地址,紧随其后是复位中断和其他内部异常函数地址

STM32内部Flash中程序存储结构:
关于代码编译过程中内存的分配问题,移步:stm32在GCC环境下的.ld链接脚本详解

FLASH

1、向量表__isr_vertors[ ]:

首先看一下向量表,这是代码最开始的部分:

STM32在启动的时候,上电就把栈顶地址赋值给MSP,这是又硬件完成的,然后我们STM32的外围复位电路触发一个复位中断,如下图所示,在单片机上电的一瞬间,3V3有高电平,此时电容充电,类似导通状态,NRST被拉低,触发复位中断,当电容充满电后,NRST有回到高电平

2、复位中断Reset_Handler():

进入复位中断函数之后,就等于程序已经跑起来了,那我们接着看复位中断代码,如下图:

可以看到,复位中断中,就干了一件事儿,调用_start()函数!

但是asm volatile()是啥鬼?下面要普及一下:

GCC在C代码中插入汇编代码的语法:

asm volatile(                /* volatile : 可选,禁止编译器对汇编代码进行优化 */"汇编指令"                  /* 汇编指令间使用'\n'分隔 */:"=限制符"(输出参数):"限制符"(输入参数):保留列表
)
关于GCC汇编语法,请看本人后续文章。

3、启动函数 _start():

__initialize_hardware_early()函数

硬件初始化函数__initialize_hardware_early()其实也没干啥,就是将向量表定义(看下图),因为cotex-M3是支持向量表重定义的,这个在开发bootloader的章节中会介绍到怎么用,现在先不深究

向量表默认是0x8000000,这里的重定义为&__vectors_start,那么__vectors_start是多少呢?

看下图,__vectors_start其实就是在ld链接脚本中定义的指向Flash最开始的地址的符号,&__vectors_start其实也就是等于0x8000000

所以__initialize_hardware_early()其实没干啥活:

接着往下看:
_start()函数中最重要的两个函数:

__initialize_data(&_sidata, &_sdata, &_edata) 函数

这个函数就是把FLASH中定义初始化的数据(全局变量、静态局部变量)搬运到RAM中,因为变量在代码运行的过程中是随时可变的,而我们的FALSH存储区的属性是只读,嵌入式中全局变量和静态局部变量都是放在RAM中的,局部变量则是放在堆栈中,程序自动压栈

具体__initialize_data()函数是怎么搬运这些数据的呢?,看下面代码:

该函数的实现方法是不是跟memcpy()类似?是不是恍然大明白了?

__initialize_bss(&bss_start, &bss_end) 函数

这个函数是将那些只定义而没有初始化的变量进行初始化,看下面具体代码:

其实也简单,就是把这些变量在RAM中的存储位置都写“0”

__initialize_hardware()函数

RAM初始化完场后,是__initialize_hardware()函数:

看一下它的代码:

好家伙,真正的硬件初始化代码在这里呢,看到Clock,就不用我多说了吧,时钟初始化!!!这个不做过多阐述了,玩过STM32的相信都能看懂,百度上也可以找到详细介绍!

继续再看_start()函数的最后几行代码:

到这里看到了int code = main(),相信你应该很快反应过来了,这里调用可main函数,可见启动过程已经完成了!

总结一下启动流程,如下图:

结语

** 更多内容见后续文章 ~~~~**。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a2529280665/article/details/121595643
————————————————

【windows下基于Eclipse和GCC搭建stm32开发环境(4)】STM32启动过程详解相关推荐

  1. 基于Eclipse平台的Android OpenCV开发环境搭建

    基于Eclipse平台的Android OpenCV开发环境搭建 作者:雨水, 日期:2016-1-31,CSDN博客:http://blog.csdn.net/gobitan 摘要:本文主要记录了如 ...

  2. python第一部分:Eclipse和PyDev搭建python开发环境

                   Eclipse和PyDev搭建python开发环境 1.1总体目标 本文档作为python学习者的入门教程,通过本教程可以了解python用途.语法.在实际工作中的应 ...

  3. STM32通过IIC读取MPU6050原始数据过程详解

    STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是主IIC,通过SCL和SDA两条线与MCU通信:第二个辅助 ...

  4. STM32开发实战:W25Q32JV SPI Flash详解

    STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...

  5. 在windows环境下基于sublime text3的node.js开发环境搭建

    摘自:http://blog.sina.com.cn/s/blog_5a6efa330102vcla.html  (略有修改) 首先安装sublime text3,百度一堆,自己找吧.理论上subli ...

  6. Windows下使用Visual Studio Code搭建Go语言环境

    1.安装GO语言 下载地址:    https://golang.org/dl/ Windows下直接运行安装GO语言即可. 安装成功. 安装完毕GO语言后,需要添加GOPATH环境变量 ,指向自己的 ...

  7. linux/windows下基于opc ua协议使用open62541开发客户端-上

    最近公司想把windows下软件迁移到linux下,在与plc通讯方面西门子只提供windows下的库,linux下没有对应库,幸好发现有open62541这个协议外接库,对应的plc最低型号为s12 ...

  8. 使用Eclipse PDT + Xampp搭建Php开发环境

    最新文章:Virson's Blog Eclipse版本:Eclipse Luna Service Release 2 (4.4.2) Xampp版本:XAMPP for Windows 5.6.8 ...

  9. php larval框架运行环境,4种Windows系统下Laravel框架的开发环境安装及部署方法详解...

    1.准备工作 1.1PHP集成环境 这里我们使用的是XAMPP,XAMPP是一个功能强大的建站集成软件包,采用一键安装的方式,包含PHP7.0.Mysql.Tomcat等.最新版下载地址:PHP 5. ...

  10. Windows XP 启动过程详解

    [预启动阶段] 1>,post过程开机自检:这是每个计算机的电源接通之后,必须要做的第一件事情.post 将检查硬件,是否有内存,是否有键盘以及scsi卡等等.虽然这是一个和操作系统无关的 过程 ...

最新文章

  1. 搜索引擎技术之概要预览
  2. 298.2亿美元的机器人市场,为什么过得有点“惨”
  3. dns服务器ip地址 常用列表
  4. python中def fun(a、b=200)_python中的函数的参数和可变参数
  5. OPENCV学习笔记2-5_扫描图像并访问相邻像素
  6. linux系统的ftp命令大全,linux系统ftp命令(示例代码)
  7. java sdk下载_Java Sdk下载 | 保利威帮助中心
  8. Intel 64 and IA-32 Architectures Instruction Format 指令格式
  9. javascript Array对象基础
  10. 2、python的print函数格式化输出
  11. 坚果云忽略同步文件的设置
  12. Python学习笔记(4)-文件读取报错
  13. 一名数据分析师的工作职责和需要掌握的基本知识
  14. 软件著作权申请流程和注意事项
  15. 如何将动图中多余的去掉?教你快速裁剪动图
  16. Mac下查找支持的字体
  17. Linux 终端生存指南
  18. 计算机页面大小4k,4K分辨率到底是什么?简单告诉你
  19. 【汇正财经】股权结构是如何形成的?
  20. 怒!移动免费上网卡是骗人的!还是黑我的手机费!

热门文章

  1. 【计算机基础】HTTP 超文本传输协议
  2. windows无法开启网络发现问题解决办法(详细)
  3. Vercel部署个人博客
  4. Linux系统管理员对普通用户的基本操作
  5. Vue中使用axio跨域请求外部WebService接口
  6. Geometric tampering estimation by means of a sift-based forensic analysis论文阅读
  7. 郭继孚:预约在城市交通中的应用——北京市回龙观地区实践
  8. python+appium出现selenium.common.exceptions.WebDriverException: Message: Method has not yet been imple
  9. 期末排名算不算计算机成绩,智学网怎么看年级排名 智学网如何查看期末考试成绩...
  10. 英语学习详细笔记(十)形容词