NXP

M3的MCU的启动过程

2019-07-12 13:54发布

这段时间再看bootloader相关的内容,因此也想了解下main函数之前,mcu做了什么。参考的文档和博客的地址如下: http://www.sunyouqun.com/2017/05/mcu-startup-procedure/ 先抄一张图,这张图描述了MCU的映像文件 MCU_Startup_Image
“所谓映像文件,就是工程编译完成后生成的bin文件。 映像文件起始位置存放中断向量表(Vector Table),然后依次存放程序代码和其他数据。中断向量表的第一项为栈顶指针MSP(Main Stack Pointer)的初值,第二项为复位向量,它指向了程序的第一个指令,即复位处理函数Reset_Handler。 http://www.sunyouqun.com/wp-content/uploads/2017/05/MCU_Startup_Reset_Sequence.png 如上图所示,MCU复位时,依次完成三个任务:
  1. 从向量表的第一项(@0x00000000)中取出MSP初值
  2. 从复位向量(@0x00000004)中取出Reset_Handler函数地址
  3. 跳转到Reset_Handler函数位置并执行
在Reset_Handler函数中,MCU执行软硬件初始化,包括Flash和RAM位置、时钟和PLL、静态和全局变量等。”
在IAR上,就有以下的图
由以上图可以看到,0X0000 0000的值给了SP,也就是栈顶指针。0X0000 0004中的值给了PC,也就是程序代码段。 这里0X0000 0004的值是0X0800 1AE1,但是PC里面的值是0X08001AE0,相差了1。是因为这里使用的是Thumb指令,网上的说明 原因如下: 1.“最低位为1只是为了向cpu说明,现在要跳向thumb code,真正的地址还是偶地址对其的。” 2.“thumb是奇数地址, 原因是 ARM 内核的设置.
   由于指令都是偶地址的, 最后一位没用, ARM 内核拿来另作他用, 以代表指令(ARM为0, THUMB为1)模式” 3.“4.BX带状态切换的跳转指令

  格式:BX ;

  功能:处理器跳转到目标地址处,从那里继续执行;

  目标地址为寄存器RN的值和0xFFFFFFFE(最后一位自动清零)作与操作的结果。

目标地址处的指令可以是ARM指令,也可以是Thumb指令。

  RN的最低位存到CPSR的t位,此位决定了指令时ARM还是THUBM状态。为0表明是ARM指令,为1表明是THUMB指令。

在arm中是按照pc取指令的。32位可以寻址32G

thumb指令中取值是按照偶地址实现的。” 参考网页:http://bbs.21ic.com/icview-454078-1-1.html