你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32启动过程经验分享

[复制链接]
攻城狮Melo 发布时间:2023-4-12 19:33

微信图片_20230412193343.jpg

STM32的内核处理器其实就是一个没有感情的代码执机器,对于一个处理器而言,它只要开始工作就会不断地获取指令,并且执行。

内核支持的指令存放在ARM公司固定好的指令集里,因此用户编写的代码最终都会转化为芯片能够识别的指令,一般这个工作都是由编译工具链来完成的(Toolchains)。

芯片上电以后会触发复位异常,该异常触发后芯片就会去一个叫做中断向量表的地方,终端向量表一般存放在存储器的0地址,之后根据复位中断对应的偏移找到相应的中断处理函数所在的特定入口位置并执行。

微信图片_20230412193337.png

复位异常处理函数入口地址一般是用户编写的主程序的入口地址,也就是main函数,这样处理器要执行什么代码都可以被人为地去修改,去执行指定的操作。

简单总结这个过程为3个步骤:触发异常->中断向量->用户程序。

中断向量表可以放置在芯片内部不同类型的存储器中,即芯片内部不同类型的存储器都可以作为启动区域。存储器采用固定的存储器映射,代码区域起始地址为0x0000 0000,而数据区域起始地址为0x2000 0000(通过系统总线访问)。CortexTM-M4FCPU始终通过ICode总线获取复位向量,这意味着只有代码区域(通常为Flash)可以提供自举空间。STM32F4xx微控制器实施一种特殊机制,可以从其它存储器(如内部SRAM)进行自举(启动)。

映射到不同的存储器上内核就会根据不同存储器上的零地址进行访问,这个零地址不是绝对的,而是不同存储器的起始地址,是相对的。

芯片复位后,在 SYSCLK的第四个上升沿锁存BOOT引脚的值。用户可以通过设置BOOT1和BOOT0引脚来选择需要的自举模式。BOOTO为专用引脚,而BOOT1则与GPIO引脚共用。一旦完成对BOOT1的采样,相应GPIO引脚即进入空闲状态,可用于其它用途。

微信图片_20230412193332.png

器件退出待机模式时,还会对BOOT引脚重新采样。因此,当器件处于待机模式时,这些引脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU将从地址0x0000 0000获取栈顶值,然后从始于0x0000 0004的自举存储器开始执行代码。

结下来根据工程内的启动文件进行分析,对任意一个stm32工程来说,都会有一个.s(汇编文件)的启动文件,芯片刚启动的时候不具备运行C语言等高级语言的能力。

微信图片_20230412193329.png

根据文件描述,启动文件的主要工作如下:

1.初始化堆栈指针
11.png

2.设置PC指针的指(当前指令运行地址+8)
3.设置中断向量表入口地址

微信图片_20230412193325.png

4.配置系统时钟,此时系统使用的是内部高速时钟源RC。
5.调用C库函数__main去初始化堆栈的工作,最终会跳转到用户自己编写的main函数中

微信图片_20230412193321.jpg


转载自: 骆驼听海

如有侵权请联系删除



收藏 评论0 发布时间:2023-4-12 19:33

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版