转载请注明出处:http://blog.csdn.net/lg2lh/article/details/8036267
一、2812的中断向量表
首先2812的中断向量表映射的地址是由4个标志位决定的:VMAP,M0M1MAP,MP/MC,ENPIE。
而系统复位时VMAP=1,ENPIE=0,根绝中断向量表映射配置表可知,此时中断向量表映射在BootROM区域,地址:0x3FFFC0~0x3FFFFF;
(注意此时中断向量表并不在PIEVECT(0x000D00~0x000DFF)处)
下面看一下BootROM结构,当MPNMC=0时,系统选择从BootROM启动。
当有可以知道,系统复位时,中断向量表是指在BootROM内底部的复位向量表,地址:0x3FFFC0~0x3FFFFF;
而0x3FFFC0~0x3FFFFF这个空间内存放了PIE中断向量表,但实际只有第一个用到了,就是复位中断的中断向量表。
复位中断向量地址即为0x3FFFC0,而指针指向的就是BootROM中的Bootloader所在区域,即0X3FFC00。
而在图示A区,固化了TI做好的Bootloader.在其中完成了启动模式的选择。由于GPIOF4内部上拉,所以如果不接地,怎启动模式自动选择,从flash启动。
可是JTAG仿真时,是从H0SARAM启动的,不知道如何使得GPIOF4为低的,因为若从H0SARAM启动,GPIOF4=0,GPIOF12=0,GPIOF3=1,GPIOF2=1.
后三个引脚无内部上拉。
如果从flash启动,则退出bootloader时,则跳转到0X3F7FF6处,若从H0SARAM启动,则跳转到0X3F8000处启动。
对于flash启动程序跳到0x3F7FF6处执行,此处距0x3F7FF8(密码设置区)只有两个字的距离,故在此也就只能放一个跳转指令,即跳转到C语言程序入口,即_c_int00处,个人认为当CMD文件将.reset段配置到0x3F7FF6时,起到的作用就是:即在0x3F7FF6处使程序跳转到_c_int00处。
这个函数就是建立一个c程序的运行环境,等建立完c运行环境后c_int00调用main函数。
当系统运行C程序后,PIE中断向量表还是在BootROM区,所以要重新映射PIE向量表,即有如下函数,完成中断向量表初始化,并改变其映射地址。
void InitPieVectTable(void) { int16 i; Uint32 *Source = (void *) &PieVectTableInit; Uint32 *Dest = (void *) &PieVectTable; EALLOW; for(i=0; i < 128; i++) *Dest++ = *Source++; EDIS; // Enable the PIE Vector Table PieCtrl.PIECRTL.bit.ENPIE = 1; //使能ENPIE,改变向量表映射地址 }
尚未解决:个人认为可以通过直接修改GPIOF几个引脚对应寄存器的值,就可以改变启动模式。