TMS320VC5509总结分享
TMS320VC5509工作基本条件包括电源电路、时钟电路、JTAG(调试用)接口电路等。 时钟电路:晶振要尽量靠近DSP,内部有倍频电路,外部可以使用12MHz的有源或者无源元件。 JTAG电路:对DSP通用系统来说要求不要超过6英寸,超过此距离要提高驱动能力。 对于不使用的外部中断接上拉电阻到DVDD。
复位信号不要用简单的RC电路,用门电路或者专门的复位芯片产生。
GPIO[0:3]的电平决定上电引导方式,需要根据自己需要设置。 对于外部引导,建议使用串行flash,布线简单(省去很多地址与数据线)。 电路参考TI提供的EVM。 TMS320VC5509的工作流程:
5509上电复位后从0xffff00开始执行程序(因为复位后IVPD的值是0xffff),在0xffff00处是指令:.ivec 0xff8000,程序转入0xff8000处执行,从0xff8000处开始就是5509内部固化的bootloader程序,在这段程序里通过读取GPIO口的状态来转入不同的boot方式。 假设用户的程序存片外flash中,5509内部固化的bootloader程序从片外的flash中按照一定格式读取数据并搬入片内RAM中,搬完后转入片内RAM的程序入口执行程序。 对于中断,需要自己定义一个中断向量表放入RAM中,并通过修改IVPD和IVPH的值来指向中断向量表的入口位置;寄存器IER0和IER1是各个中断的使能位,ST1的INTM位是总的中断使能位。中断向量表中应该放入中断服务程序的入口地址,也可以先不放入,在程序运行后通过调用CSL的IRQ_plug()函数在中断向量表插入中断服务程序入口。
学习DSP,当然是从一些简单的测试程序开始。使一个LED的闪亮是经常用的,但这其中有一个误区,现分析如下,以定时器控制LED灯为例: void main()
{
init_5509();
init_timer();
while(1)
{
asm(" NOP");
}
} interrupt void int_timer0()
{
Flag=Flag+1;
if (Flag>10) asm(" SSBX XF"); else asm(" RSBX XF");
if (Flag>20) Flag=0;
} 这个程序不能实现控制的。使用XF的时候要注意一下,XF是ST1的一个bit,但是在中断中,首先把ST1压入堆栈,出中断前才弹出堆栈,所以在中断中改变XF没有实际的意义。所以在C/C++加如汇编要谨慎。修改后的程序如下: void main()
{
init_5509();
init_timer();
while(1)
{
asm(" NOP");
if (Flag>10) asm(" SSBX XF"); else asm(" RSBX XF");
}
} interrupt void int_timer0()
{
Flag=Flag+1;
if (Flag>20) Flag=0;
} 这个程序就好使。 |