记得以前学习单片机的时候,很多教材都是会将单片机的启动流程,但是现在搜索感觉资料很少,正好用到msp430f5xxx的iap功能,需要对单片机的内存分布有一定的了解,整理了一下如下内容
msp430f5xxx系列内存分布
ram :01C00h-05BFFh RAM 16KB
flash:05C00h-0FFFFh Program
flash: 0FF80h-0FFFFh Interrupt Vectors
flash:10000h-45BFFh Program
有一点可以看到:program区别被中断向量列表给分割了,猜想是TI为了兼容以前的那些容量比较小的单片机的措施
flash: 0FF80h-0FFFFh Interrupt Vectors 这段区域在IAP烧录的时候是需要跳过的,也就是说升级程序时Interrupt Vectors 是不需要改动的,新程序的设计需要特别注意
在iar调试界面中看到的内容如下
?cstart_begin:
program_start:
006AFE 4031 5C00
?cstart_init_copy_ramfunc:
006B02 403C 1F5E
006B06 403D C8E0
006B0A 403E 0002
006B0E 13B0 C8C8
?cstart_init_zero:
006B12 403C 1C34
006B16 403D 032A
006B1A 13B0 C7DE
?cstart_init_copy:
006B1E 403C 1C00
006B22 403D 6ACA
006B26 403E 0033
006B2A 13B0 C8C8
?cstart_call_main:
006B2E 13B0 9424
006B32 13B0 C8CC
系统启动流程
1:当系统上电时产生复位,pc指针被设定成0xffff(这里是硬件决定的软件无法修改),程序从该处运 行.该处位于flash中 其内容是 0xffff: 6AFE FFFF
6AFE是iar编译器生成的 如果换成其他平台则可能不一样哈
CPU把6AFE读到指令流水线上,则下一条指令则是把pc设定为6AFE
2:到达6AFE后首先做的是把 5C00压入堆栈 原本以为5C00是flash 中program的开始地址
但实际上这句话没有啥用,位于5C00处的程序是crc_clc
3: 按顺序运行
?cstart_init_copy_ramfunc: //初始化那些需要放到内存中的程序(被ramfunc修饰过的)
?cstart_init_zero:
?cstart_init_copy:
?cstart_call_main:
006B2E 13B0 9424
值得需要注意的是 在这次编译中main的入口地址是9424
在其他的编译过程中 这个地址可能会变化
4:PC指针跳转至9424处开始运行 剩下的我们都知道了