【windows下基于Eclipse和GCC搭建stm32开发环境(4)】STM32启动过程详解
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启动过程详解相关推荐
- 基于Eclipse平台的Android OpenCV开发环境搭建
基于Eclipse平台的Android OpenCV开发环境搭建 作者:雨水, 日期:2016-1-31,CSDN博客:http://blog.csdn.net/gobitan 摘要:本文主要记录了如 ...
- python第一部分:Eclipse和PyDev搭建python开发环境
Eclipse和PyDev搭建python开发环境 1.1总体目标 本文档作为python学习者的入门教程,通过本教程可以了解python用途.语法.在实际工作中的应 ...
- STM32通过IIC读取MPU6050原始数据过程详解
STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是主IIC,通过SCL和SDA两条线与MCU通信:第二个辅助 ...
- STM32开发实战:W25Q32JV SPI Flash详解
STM32开发实战:W25Q32JV SPI Flash详解 在STM32单片机的应用中,使用SPI Flash能够有效地扩展程序和数据存储空间.W25Q32JV SPI Flash是一种常用的Fla ...
- 在windows环境下基于sublime text3的node.js开发环境搭建
摘自:http://blog.sina.com.cn/s/blog_5a6efa330102vcla.html (略有修改) 首先安装sublime text3,百度一堆,自己找吧.理论上subli ...
- Windows下使用Visual Studio Code搭建Go语言环境
1.安装GO语言 下载地址: https://golang.org/dl/ Windows下直接运行安装GO语言即可. 安装成功. 安装完毕GO语言后,需要添加GOPATH环境变量 ,指向自己的 ...
- linux/windows下基于opc ua协议使用open62541开发客户端-上
最近公司想把windows下软件迁移到linux下,在与plc通讯方面西门子只提供windows下的库,linux下没有对应库,幸好发现有open62541这个协议外接库,对应的plc最低型号为s12 ...
- 使用Eclipse PDT + Xampp搭建Php开发环境
最新文章:Virson's Blog Eclipse版本:Eclipse Luna Service Release 2 (4.4.2) Xampp版本:XAMPP for Windows 5.6.8 ...
- php larval框架运行环境,4种Windows系统下Laravel框架的开发环境安装及部署方法详解...
1.准备工作 1.1PHP集成环境 这里我们使用的是XAMPP,XAMPP是一个功能强大的建站集成软件包,采用一键安装的方式,包含PHP7.0.Mysql.Tomcat等.最新版下载地址:PHP 5. ...
- Windows XP 启动过程详解
[预启动阶段] 1>,post过程开机自检:这是每个计算机的电源接通之后,必须要做的第一件事情.post 将检查硬件,是否有内存,是否有键盘以及scsi卡等等.虽然这是一个和操作系统无关的 过程 ...
最新文章
- 搜索引擎技术之概要预览
- 298.2亿美元的机器人市场,为什么过得有点“惨”
- dns服务器ip地址 常用列表
- python中def fun(a、b=200)_python中的函数的参数和可变参数
- OPENCV学习笔记2-5_扫描图像并访问相邻像素
- linux系统的ftp命令大全,linux系统ftp命令(示例代码)
- java sdk下载_Java Sdk下载 | 保利威帮助中心
- Intel 64 and IA-32 Architectures Instruction Format 指令格式
- javascript Array对象基础
- 2、python的print函数格式化输出
- 坚果云忽略同步文件的设置
- Python学习笔记(4)-文件读取报错
- 一名数据分析师的工作职责和需要掌握的基本知识
- 软件著作权申请流程和注意事项
- 如何将动图中多余的去掉?教你快速裁剪动图
- Mac下查找支持的字体
- Linux 终端生存指南
- 计算机页面大小4k,4K分辨率到底是什么?简单告诉你
- 【汇正财经】股权结构是如何形成的?
- 怒!移动免费上网卡是骗人的!还是黑我的手机费!
热门文章
- 【计算机基础】HTTP 超文本传输协议
- windows无法开启网络发现问题解决办法(详细)
- Vercel部署个人博客
- Linux系统管理员对普通用户的基本操作
- Vue中使用axio跨域请求外部WebService接口
- Geometric tampering estimation by means of a sift-based forensic analysis论文阅读
- 郭继孚:预约在城市交通中的应用——北京市回龙观地区实践
- python+appium出现selenium.common.exceptions.WebDriverException: Message: Method has not yet been imple
- 期末排名算不算计算机成绩,智学网怎么看年级排名 智学网如何查看期末考试成绩...
- 英语学习详细笔记(十)形容词