
![]() STM32的内核处理器其实就是一个没有感情的代码执机器,对于一个处理器而言,它只要开始工作就会不断地获取指令,并且执行。 内核支持的指令存放在ARM公司固定好的指令集里,因此用户编写的代码最终都会转化为芯片能够识别的指令,一般这个工作都是由编译工具链来完成的(Toolchains)。 芯片上电以后会触发复位异常,该异常触发后芯片就会去一个叫做中断向量表的地方,终端向量表一般存放在存储器的0地址,之后根据复位中断对应的偏移找到相应的中断处理函数所在的特定入口位置并执行。 ![]() 复位异常处理函数入口地址一般是用户编写的主程序的入口地址,也就是main函数,这样处理器要执行什么代码都可以被人为地去修改,去执行指定的操作。 简单总结这个过程为3个步骤:触发异常->中断向量->用户程序。 中断向量表可以放置在芯片内部不同类型的存储器中,即芯片内部不同类型的存储器都可以作为启动区域。存储器采用固定的存储器映射,代码区域起始地址为0x0000 0000,而数据区域起始地址为0x2000 0000(通过系统总线访问)。CortexTM-M4FCPU始终通过ICode总线获取复位向量,这意味着只有代码区域(通常为Flash)可以提供自举空间。STM32F4xx微控制器实施一种特殊机制,可以从其它存储器(如内部SRAM)进行自举(启动)。 映射到不同的存储器上内核就会根据不同存储器上的零地址进行访问,这个零地址不是绝对的,而是不同存储器的起始地址,是相对的。 芯片复位后,在 SYSCLK的第四个上升沿锁存BOOT引脚的值。用户可以通过设置BOOT1和BOOT0引脚来选择需要的自举模式。BOOTO为专用引脚,而BOOT1则与GPIO引脚共用。一旦完成对BOOT1的采样,相应GPIO引脚即进入空闲状态,可用于其它用途。 ![]() 器件退出待机模式时,还会对BOOT引脚重新采样。因此,当器件处于待机模式时,这些引脚必须保持所需的自举模式配置。这样的启动延迟结束后,CPU将从地址0x0000 0000获取栈顶值,然后从始于0x0000 0004的自举存储器开始执行代码。 结下来根据工程内的启动文件进行分析,对任意一个stm32工程来说,都会有一个.s(汇编文件)的启动文件,芯片刚启动的时候不具备运行C语言等高级语言的能力。 ![]() 根据文件描述,启动文件的主要工作如下: 1.初始化堆栈指针 ![]() 2.设置PC指针的指(当前指令运行地址+8) 3.设置中断向量表入口地址 ![]() 4.配置系统时钟,此时系统使用的是内部高速时钟源RC。 5.调用C库函数__main去初始化堆栈的工作,最终会跳转到用户自己编写的main函数中 ![]() 转载自: 骆驼听海 如有侵权请联系删除 |
【STM32C0测评】Nucleo-C092开发板驱动DS1302实验
Keil下的STM32N6之RAM运行工程配置说明
【STM32MP257-DK】01开发板开箱、ST MPU 生态资源使用、环境搭建以及镜像更新
兔哥的初代M33【002】-H503Nucleo 内部flash操作
兔哥的杂谈【002】——如何性价比更高地去编译STM32
汇编浮点库qfplib移植STM32F769I-DISCO开发板与硬件浮点运算性能测试对比
FreeRTOS学习笔记2
【NUCLEO-H533RE评测】+05 调试PWM
基于STM32在线升级OTA经验分享
基于STM32 hardfault问题分析经验分享