深化懂得MCU启动原理
发布时间:2025-01-25 08:34
MCU最开端一启动后去那里读代码?本文援用地点:CPU上电启动后被计划为去地点0x00000000地位处读代替码;起首会持续读取两个字,分辨是栈指针初始值跟复位异样处置函数的地点;而后跳去履行复位异样处置函数。固然在一些晚期的ARM处置器计划中,如Arm7TDMI,复位后会直接读取0地点处的代码停止履行,由软件初始化栈指针,0地点处寄存的直接就是中止处置函数,而不是函数地点。以是咱们能够有来由揣测出,第一个字是栈地点是由于接上去的复位中止处置函数波及函数跳转,可能曾经须要寄存内容在栈里了。0x0地点处是bootROM代码吗,仍是用户bootloader代码?谜底是都能够,这实在取决于用户的代码是寄存在那里的。比方说对一些机能强的MCU(如Cortex-A系列)来说,代码自身体积比拟年夜,寄存在SD卡里或许QSPI/SPI Flash里都有可能,这些MCU启动必定是先去bootROM履行代码,由于SD卡、SPI Flash的贮存不在MCU的同一编址空间里,没初始化这些外设前基本无奈拜访,bootROM这块Nor Flash就必定是能够被MCU直接经由过程总线地点拜访的,0地点的代码位于bootROM中。代码从bootROM中起来后,经由过程启动引脚断定从哪个外设中搬用户顺序,并去初始化响应外设,将外设中存储的用户代码搬到外部SRAM中履行。后续的启动流程不赘述。对一些小容量的MCU来说,比方Cortex-M3/M4,他们的芯片里有内置Flash,这个Flash的特色跟下面说的bootROM很像,是MCU能够直接经由过程地点总线去拜访到的,不须要停止外设初始化的。固然,这些MCU外部也是有bootROM的,因而这些MCU一上电能够抉择从bootROM中启动,也能够抉择从内置Flash中启动,是经由过程外部引脚停止抉择的,抉择了谁,就把谁的肇端地点映射到0地点处。相似Cortex-M3/M4是怎样保障Flash肇端地点是栈指针跟复位异样处置函数指针的?这一点现实是经由过程编译的链接文件制订的。比方说如下是我截取的IAR的链接文件.icf。MCU有可能不从0地点开端读代码吗?M7内核芯片比拟机动了,转变了牢固从0x0000 0000地点读取中止向量表的成绩,以STM32H7为例,能够从0x0000 0000到0x3FFF 0000全部地点停止启动。专门部署了个选项字节来设置。