深入理解MCU启动原理

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 所有地址进行启动。专门安排了个选项字节来配置。


HOLTEK新推出移动电源Flash单片机
公司及企业参展注意事项及指导
电控发动机分类
用霍尔电流传感实现高质量OBC与光伏电流检测
基于nolear建立的ConvNet体系结构并用它去训练一个特征提取器
深入理解MCU启动原理
中芯国际首个14nm工艺明年上半年量产
OPPOR11什么时候上市?OPPOR11迎来最强对手三星C10pro,你更看好谁?
超级(法拉)电容在新能源汽车中的应用
数据分析有什么作用?_光点科技
CGHV1J070D L波段放大器
广和通车联网业务全球布局
Qualcomm宣布推出Qualcomm TrueWireless™立体声技术
源创通信-12-G-AT POE Midspan (1U)供电中跨设备介绍
RS232和RS485通信协议的区别
机器人路径规划之A*算法(附C++源码)
人工智能技术设备哪些
智能照明设计/应用现状及发展趋势分析
2010年全球四大区域LED产业特色
工业机器人有哪些典型的应用场景?