先提出一个无法忽略的问题:微控制器(单片机)上电后,是如何寻找到并执行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日常使用笔记——启动方式相关推荐

  1. 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详解) 文章 ...

  2. ## I.MX6ULL学习笔记一I.MX启动方式

    技术标签: Linux学习 linux 物联网 嵌入式 一.硬件启动方式选择 I.MX6U 支持多种启动方式以及启动设备,比如可以从 SD/EMMC.NAND Flash.QSPI Flash等启动. ...

  3. mongoDB的读书笔记(via3.0)(00)_【概览】(02)_mongoDB3.0中的mongod启动方式小试牛刀

    mongod启动 本来想写Replica的非测试模式的集群架构的,但是实在是手痒痒,把mongoDB的3.0给download下来了,看了一两眼文档后决定还是先大概写一点点关于启动的话题,之后写Rep ...

  4. Android:日常学习笔记(6)——探究活动(3)

    Android:日常学习笔记(6)--探究活动(3) 活动的生命周期 返回栈 Android中的活动是可以叠加的,我们每启动一个新活动,就会覆盖在原来的活动上,点击Back以后销毁最上面的活动,下面的 ...

  5. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  6. 法那科机器人初始化启动_发那科机器人的控制方式和控制柜的启动方式

    工业机器人能得到广泛应用,得益于它拥有有多种控制方式,按作业任务的不同,可主要分为点位控制方式.连续轨迹控制方式.力(力矩)控制方式和智能控制方式四种控制方式. 1.点位控制方式(PTP) 这种控制方 ...

  7. 数学建模日常心得笔记

    本文章是个人学习数学建模的日常心得笔记 学习资料: B站视频: [零基础教程]老哥:数学建模算法.编程.写作和获奖指南全流程培训!_哔哩哔哩_bilibili 参考书籍:<MATLAB R201 ...

  8. 启动ipython_iPython pylab模式启动方式

    iPython pylab模式启动方式 在命令行窗口(CMD窗口)输入 ipython --pylab 或者在ipython 环境下输入%pylab 补充知识:%matplotlib inline 被 ...

  9. 计算机的启动方式有那三种,我们每天都要启动电脑,你知道三种启动方式有什么不同吗?...

    在日常生活中,我们每天都要启动电脑进行工作,启动有冷启动.热启动和复位启动,你知道他们有什么不同吗? 计算机的启动方式有以下两种分类: 01按启动媒体分 1.软驱启动,将启动盘插入软驱来驱动电脑硬件, ...

最新文章

  1. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
  2. python自学网站推荐-杭州python自学网站
  3. 聊聊并发(七)——Java中的阻塞队列
  4. CentOS6.5安装Redis3.2.8版本
  5. 机器学习实践:TensorFlow2 多GPU负载不均衡问题
  6. 下载并搭建VAuditDemo漏洞代码审计平台
  7. SAP CRM中间件下载出错的错误排查
  8. [JSON].valueOf( keyPath )
  9. SpringBoot集成MyBatis-Plus分页插件
  10. python list去重并删除某些元素_使用Python实现list(列表)中的重复元素删除,例如: X= [1,1,2,a,a,[1,2,3]] 去重后:X= 「1,2,a,[1,2...
  11. 基于Adobe LCDS产品的数据访问解决方案Part4
  12. 2016-08-12
  13. PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解
  14. 13.Serving Frontend Files
  15. java apdu读取社保卡_读取社保卡信息 - osc_qzrqhs9y的个人空间 - OSCHINA - 中文开源技术交流社区...
  16. Python机器视觉--OpenCV入门--机器视觉与OpencCV用途简介
  17. Adobe Creative Cloud 不能加载APP导致卸载ps失败 解决方案
  18. stata陈强:计量经济学及stata应用_陈强 第五章 多元线性回归
  19. RAID10磁盘阵列损坏修复操作
  20. C语言练习题:据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数值的两倍。现给定某人身高,请你计算其标准体重应该是多少?

热门文章

  1. 备份win7 便签 sticky notes
  2. plsql dev 12 版下载地址
  3. 福州大学特大游戏制作团伙-冲刺日志(第9天11.23)
  4. 电气工程及其自动化专业英语复习
  5. 软考中级-软件设计师-视频学习时长记录
  6. python爬取气象台每日天气图代码
  7. RTSP/RTMP/GB28181协议/海康SDK/Ehome协议接入TSINGSEE青犀视频平台磁盘空间计算介绍
  8. 外卖点餐平台系统源码
  9. NLP --- 条件随机场CRF(预测算法详解)
  10. 700+页机器学习笔记pdf下载