STM3日常使用笔记——启动方式
先提出一个无法忽略的问题:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?
答案很显然:微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。
因此“启动文件”显得格外重要,无论性能高下,结构简繁,价格贵贱,每一种微控制器(处理器)都必须有启动文件,启动文件的作用便是负责执行微控制器从“复位”到“开始执行main函数”中间这段时间(称为启动过程)所必须进行的工作。
相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化。ARM7/ARM9内核的控制器在复位后,CPU会从存储空间的绝对地址0x000000取出第一条指令执行复位中断服务程序的方式启动,即固定了复位后的起始地址为0x000000(PC = 0x000000)同时中断向量表的位置并不是固定的。而Cortex-M3内核则正好相反,有3种情况:
1、通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
2、通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
3、通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述;
可以简单总结一下STM32的启动文件和启动过程:首先对栈和堆的大小进行定义,并在代码区的起始处建立中断向量表,其第一个表项是栈顶地址,第二个表项是复位中断服务入口地址。然后在复位中断服务程序中跳转¬¬C/C++标准实时库的main函数,完成用户堆栈等的初始化后,跳转.c文件中的main函数开始执行C程序。假设STM32被设置为从内部FLASH启动(这也是最常见的一种情况),中断向量表起始地位为0x8000000,则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32遇到复位信号后,则从0x80000004处取出复位中断服务入口地址,继而执行复位中断服务程序,然后跳转__main函数,最后进入mian函数,来到C的世界。
1,ISP模式.这种模式就是STM32复位后就执行固化在内部的BOOTLOADER程序(固化的,我们无法读写.),然后等待串口数据,从而实现串口bootloader功能. 这种模式不会从用户存储区启动(除非用串口控制其从0X08000000启动),所以在更新了代码之后,需要设置为其他模式(FLASH模式).
2,FLASH启动模式.这种模式直接从0X08000000启动,也就是我们自己编写的代码的启动方式了.正常情况都应该用这种.
3,SRAM启动模式.这种模式我没有用过,是从0X20000000启动的,也就是说在sram模式开始之前,你要确保SRAM里面已经有代码了,否则就是死机.
STM3日常使用笔记——启动方式相关推荐
- i.MX RT开发笔记-03 | i.MX RT1062地址空间映射及启动方式
系列文章目录 i.MX RT开发笔记-01 | 初识 i.MX RT1062 跨界MCU i.MX RT开发笔记-02 | i.MX RT1062开发环境搭建(MDK芯片包.NXP SDK详解) 文章 ...
- ## I.MX6ULL学习笔记一I.MX启动方式
技术标签: Linux学习 linux 物联网 嵌入式 一.硬件启动方式选择 I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/EMMC.NAND Flash.QSPI Flash等启动. ...
- mongoDB的读书笔记(via3.0)(00)_【概览】(02)_mongoDB3.0中的mongod启动方式小试牛刀
mongod启动 本来想写Replica的非测试模式的集群架构的,但是实在是手痒痒,把mongoDB的3.0给download下来了,看了一两眼文档后决定还是先大概写一点点关于启动的话题,之后写Rep ...
- Android:日常学习笔记(6)——探究活动(3)
Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...
- Android:日常学习笔记(8)———探究UI开发(5)
Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...
- 法那科机器人初始化启动_发那科机器人的控制方式和控制柜的启动方式
工业机器人能得到广泛应用,得益于它拥有有多种控制方式,按作业任务的不同,可主要分为点位控制方式.连续轨迹控制方式.力(力矩)控制方式和智能控制方式四种控制方式. 1.点位控制方式(PTP) 这种控制方 ...
- 数学建模日常心得笔记
本文章是个人学习数学建模的日常心得笔记 学习资料: B站视频: [零基础教程]老哥:数学建模算法.编程.写作和获奖指南全流程培训!_哔哩哔哩_bilibili 参考书籍:<MATLAB R201 ...
- 启动ipython_iPython pylab模式启动方式
iPython pylab模式启动方式 在命令行窗口(CMD窗口)输入 ipython --pylab 或者在ipython 环境下输入%pylab 补充知识:%matplotlib inline 被 ...
- 计算机的启动方式有那三种,我们每天都要启动电脑,你知道三种启动方式有什么不同吗?...
在日常生活中,我们每天都要启动电脑进行工作,启动有冷启动.热启动和复位启动,你知道他们有什么不同吗? 计算机的启动方式有以下两种分类: 01按启动媒体分 1.软驱启动,将启动盘插入软驱来驱动电脑硬件, ...
最新文章
- Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
- python自学网站推荐-杭州python自学网站
- 聊聊并发(七)——Java中的阻塞队列
- CentOS6.5安装Redis3.2.8版本
- 机器学习实践:TensorFlow2 多GPU负载不均衡问题
- 下载并搭建VAuditDemo漏洞代码审计平台
- SAP CRM中间件下载出错的错误排查
- [JSON].valueOf( keyPath )
- SpringBoot集成MyBatis-Plus分页插件
- python list去重并删除某些元素_使用Python实现list(列表)中的重复元素删除,例如: X= [1,1,2,a,a,[1,2,3]] 去重后:X= 「1,2,a,[1,2...
- 基于Adobe LCDS产品的数据访问解决方案Part4
- 2016-08-12
- PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解
- 13.Serving Frontend Files
- java apdu读取社保卡_读取社保卡信息 - osc_qzrqhs9y的个人空间 - OSCHINA - 中文开源技术交流社区...
- Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介
- Adobe Creative Cloud 不能加载APP导致卸载ps失败 解决方案
- stata陈强:计量经济学及stata应用_陈强 第五章 多元线性回归
- RAID10磁盘阵列损坏修复操作
- C语言练习题:据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?