1.1 为什么要设置中断向量偏移
上图可以看出程序上电先进入0x08000000开始运行,紧接着执行复位中断向量,然后执行复位中断程序,然后进入main函数。
如果想要app的中断正常运行,那就必须手动设置中断向量偏移地址。否则默认的地址是0x08000004,而不是app的起始地址。
NVIC_VTOR_MASK是用来设置中断向量表的掩码。中断向量表是一个存储中断处理程序地址的表格,用于处理不同的异常和中断。在STM32F407芯片中,中断向量表占用空间为92*4=368字节,需要对齐到2的整次幂,即512字节。因此,可以将NVIC_VTOR_MASK设置为0xFFFFFE00,即将低9位设置为0,以确保中断向量表的起始地址是512的整数倍。
又因为这个,所以将NVIC_VTOR_MASK设置为0x1FFFFE00。
设置掩码NVIC_VTOR_MASK的目的是为了确保中断向量表的起始地址满足对齐要求。对于不同的芯片,中断向量表的大小和对齐要求可能不同,因此需要根据具体情况进行设置。通过设置掩码NVIC_VTOR_MASK,可以保证中断向量表的起始地址正确,并且能够正确处理异常和中断。
这是一个用于初始化TMS32F28377D芯片中中断向量表的函数。逐行解释代码的功能:
//---------------------------------------------------------------------------
// 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;
}
首先,声明了两个指针类型变量 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)向量表。
简单来说,该函数的作用是将预定义的中断向量表数据复制到实际的中断向量表地址,并启用中断向量表。这样,处理器在执行中断服务程序时,会根据中断发生的类型找到相应的中断向量表项,从而执行相应的中断服务程序。
该函数的作用是将预定义的中断向量表数据复制到实际的中断向量表地址,并启用中断向量表。这样,处理器在执行中断服务程序时,会根据中断发生的类型找到相应的中断向量表项,从而执行相应的中断服务程序。
时钟源选择
2803x系列DSP有两个内部时钟源(INTOSC1和INTOSC2),可以不需要外部时钟。同时,也具有PLL时钟模块。一共有4种时钟源可供选择:
1) INTOSC1(10MHz)
内部时钟源1(INTOSC1),此时钟提供给看门狗块模块,内核和CPU定时器2 。
时钟频率默认为10MHz,可以通过INTOSCnTRIM寄存器修改频率。
2) INTOSC2(10MHz)
功能与INTOSC1是一样的。
3) 外部晶体振荡器
使用外部晶体振荡器给芯片提供时钟,晶振连接于X1/X2 脚。
4) 外部时钟源
如果不使用外部晶振作为时钟源,可以选择这种模式。时钟从外部时钟源的XCLKIN引脚输入生成。
注意:XCLKIN复用于GPIO19或GPIO38脚。可以通过XCLK寄存器的XCLKINSEL位选择是GPIO19还是GPIO38作为XCLKIN输入。
分析:通过上面可以总结以下几点:
①总共四个时钟源;
②系统时钟=所选择时钟*倍频系数/分频系数
比如下面找个就是:10*12/2=60MHz