关于2812的bootloader与中断向量表之间的关系——DSP2812启动过程

转载请注明出处: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启动。

关于2812的bootloader与中断向量表之间的关系——DSP2812启动过程_第1张图片

当有可以知道,系统复位时,中断向量表是指在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,改变向量表映射地址
			
}

疑问二:由于引导模式由GPIO引脚状态决定,那对于一个已经设计好的DSP最小系统,引脚状态在硬件上已经固定好了,意即是不是此时只能局限于一种引导模式了?不能同时进行仿真调试和烧写至FLASH内进行硬件调试吗?(因为仿真调试时,用户程序入口地址一般在SARAMH0处,烧写至FLASH内进行允许时,用户程序入口地址在FLASH处。)


尚未解决:个人认为可以通过直接修改GPIOF几个引脚对应寄存器的值,就可以改变启动模式。

你可能感兴趣的:(关于2812的bootloader与中断向量表之间的关系——DSP2812启动过程)