//---------------------------------------------------------------------------
// InitPieVectTable:
//---------------------------------------------------------------------------
// This function initializes the PIE vector table to a known state.
// This function must be executed after boot time.
void InitPieVectTable(void)
{
Uint16 i;
Uint32 *Source = (void *) &PieVectTableInit;
Uint32 *Dest = (void *) &PieVectTable;
// Do not write over first 3 32-bit locations (these locations are
// initialized by Boot ROM with boot variables)
Source = Source + 3;
Dest = Dest + 3;
EALLOW;
for(i = 0; i < 221; i++)
{
*Dest++ = *Source++;
}
EDIS;
// Enable the PIE Vector Table
PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
}
这是一个用于初始化TMS32F28377D芯片中中断向量表的函数。逐行解释代码的功能:
- 首先,声明了两个指针类型变量 Source 和 Dest,它们分别指向 PieVectTableInit 和 PieVectTable。
- 接着,将 Source 和 Dest 各自增加 3 的偏移量。这是因为前三个32位位置是由引导程序(Boot ROM)用于初始化引导变量的,所以不应该被覆写。
- 然后,使用 EALLOW 和 EDIS 宏来使能对 PIE Vector Table 的写操作权限。
- 通过循环将 Source 指针指向的值复制给 Dest 指针指向的地址,并递增这两个指针的值。循环执行 221 次(TMS32F28377D芯片具有 221 个中断向量表项,每个项都包含一个指向中断服务程序的地址),将 PieVectTableInit 的内容复制到 PieVectTable。
- 最后,通过设置 PieCtrlRegs.PIECTRL.bit.ENPIE 为 1,启用 PIE(Peripheral Interrupt Expansion)向量表。
简单来说,该函数的作用是将预定义的中断向量表数据复制到实际的中断向量表地址,并启用中断向量表。这样,处理器在执行中断服务程序时,会根据中断发生的类型找到相应的中断向量表项,从而执行相应的中断服务程序。