4个问题,理解MCU的启动原理

科技   2024-12-23 08:01   广东  
大疆无人机、福禄克万用表、小米手机、华为手表等你来!

👆面包板社区DIY活动进行中!


1、MCU最开始一启动后去哪里读代码?

CPU上电启动后被设计为去地址0x00000000位置处读取代码;首先会连续读取两个字,分别是栈指针初始值和复位异常处理函数的地址;然后跳去执行复位异常处理函数。



当然在一些早期的ARM处理器设计中,如Arm7TDMI,复位后会直接读取0地址处的代码进行执行,由软件初始化栈指针,0地址处存放的直接就是中断处理函数,而不是函数地址。

所以我们可以有理由推测出,第一个字是栈地址是因为接下来的复位中断处理函数涉及函数跳转,可能已经需要存放内容在栈里了。

2. 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地址处。


3. 类似Cortex-M3/M4是如何保证Flash起始地址是栈指针和复位异常处理函数指针的?

这一点实际是通过编译的链接文件制定的。比如说如下是我截取的IAR的链接文件.icf。


4. MCU有可能不从0地址开始读代码吗?

M7内核芯片比较灵活了,改变了固定从0x0000 0000地址读取中断向量表的问题,以STM32H7为例,可以从 0x0000 0000 到 0x3FFF 0000 所有地址进行启动。专门安排了个选项字节来配置。

扫码加入

单片机技术交流群

 

 

年终啦!工程师写总结,送示波器、稳压电源、螺丝刀!

活动地址👉https://mbb.eet-china.com/forum/topic/147657_1_1.html



【活动主题】写工程师职涯故事或总结,发布到面包板社区网站即可!

【活动时间】2024.12.11 - 2025.02.10


可以从这几个方面开始您的分享(必须和电子行业相关):

一、职业生涯中的故事:回顾自己过去的电子从业经历;
二、2024年年终总结:分享今年的工作心得和收获,也可以是找工作的经历。
三、工作中的小事情:记录发生的一件难忘的事情,可以是一个技术案例、一个让你收获颇丰的电路。


【奖项设置】
  • 一等奖:普源DS1202Z-E示波器,华为WATCH GT 5幻夜黑,任选一个 

  • 二等奖:小米扫地机3C,小米平板REDMI Pad SE 11,任选一个

  • 三等奖:优利德UTP1306S稳压电源,华为随行WiFi 3 Pro,任选一个

  • 优秀奖:绿林螺丝刀套装117合1,米家温湿度计,任选一个 

  • 所有参与者均可获得50E币奖励!(E币可在社区商城兑换奖品)

  • 阅读量过万奖励:若单篇文章在MBB微信号阅读量过万,每篇奖1000个E币奖励(数据统计截至时间为2025.2.28,仅限前20篇,按文章发布在MBB社区的时间排序,个人累计封顶奖励10000个E币奖励)


↓↓ 点击阅读原文,参加活动 

面包板社区
分享电子技术干货,电子工程师福利!EET电子工程专辑、ESM国际电子商情、EDN电子技术设计官方社区。
 最新文章