第一次接触TI的DSP:2812,做一个音频处理系统(很简单的几个滤波器而以)。至今日基本完成前期开发。现将本人作为一个初学者,完成2812的整个开发过程简单披露一下,有两个目的:
1。供2812players参考借鉴
2。听取各位意见,了解我开发过程中的缺陷,并予以更新。
最开始,我download一个CCS for 2812的30天演示板,打开例子程序,进行编译调试。发现C的程序可以运行,但是汇编的运行不了。我是肯定要用汇编的,查了好久,才发现,汇编程序load后,还要从菜单中选择reset操作,然后PC才能指向代码开始的地方,也就是FLASH的起始地址0x3d8000。(TMD翻遍了help,tutorial,quickstart没见着有说要先reset的,气S我了)。然后就学了学2812的指令、伪指令,写了几个滤波器的程序。
接着,30天演示板CCS到期了,TMD反安装再重新装也不行(TI在一边说,MD你以为我弱智阿!),,我订购的2812SDK评估板到了。用评估板带的CCS for 2812调出前期写好的程序,TMD一开始就不给面子,load时说是有空间不可以写,一看是flash空间。CCS自己的汇编例子就把代码放在flash空间!只得修改cmd文件,重新排放代码。这样,再用SDK仿真的时候,我的程序是跟flash空间无关的,代码全部放在H0空间,数据放在M0和L0L1空间。就这样,McBSP,timer,comparer,PWM输出,PIE配置,PLL,CSM,WATCHDOG,PERIPHERAL CLOCK等一样一样来过。期间有不少问题,如:外围器件寄存器写不进去(peripheral clock control register配置不妥),PWM无输出(GPIO寄存器配置不妥),中断进不去(看门狗没有正确关闭,中断还没有来就被狗reset回去了),中断只能进去一次(PIEACK寄存器在中断中没有清除相应中断标志)。外围器件调了一圈后,信号通了,把信号处理过程放到McBSP串口接收中断中去,我的project差不多了。
再下一步就是要把我的程序移植到flash中,让SDK可以脱离PC和CCS运行。先打开SDK光盘上配的flash烧写软件:SDFlash。打开一个2812的例子,看了看project setting,不甚明了,不管先烧了再说,然后就reset-->flash。在打开CCS调出flash空间一看,不错,被erase的地方全是0xffff,有烧写的地方都是正确的植。我就直接用SDFlash中那个例子,把它的烧写文件换成我的那个out文件。烧不进去。因为我的out文件中,程序数据全在SARAM中。看来是要修改程序,将代码数据放在flash中,重新编译,生成out文件。再烧,烧进去了。开始程序运行不对,用CCS跟踪,发现DSP程序不可以写flash中被我定义成数据段的地方。看来只有再flash开始处,编写自己的boot loader,将flash中的数据全部搬运到M0空间。这样做了后,SDK脱离PC,CCS运行可以了。但是我用示波器仔细检测波形后,发现波形不准确,也就是跟用CCS仿真运行时(这时代码数据全部再SARAM中)不完全一样。研究后发现,是因为flash中的程序执行时,即使等待周期设到最低,flash pipeline打开,也并不一定是一周期一指令(如:一串nop,执行起来是1cycle,1cycle,1cycle,4cycle,1cycle,1cycle,1cycle,4cycle...)。这样是我的系统不能接受的。必须把代码也搬运到SARAM中去。但是搬运代码有一个问题,那就是代码中有跳转,调用指令,这一跳转一调用又回到flash中去了。于是查指令,跳转我全部换成相对位移的短跳转,可是调用没有相对的,全是绝对地址调用。这下,不得不逼我使出变态的一招:先将程序运行完全正确的那个版本(代码数据全部再SARAM中)编译load在reset,然后选择file菜单-->data-->save,我把我的程序和数据分别存成16进制文本文件。就是一行一个“0xXXXX”的机器码和数据。然后用Delphi写一个小程序,把代码数据两个文本文件的每一行加上“ .word ”,这样这两个文本文件添加到用来烧flash的程序中就成了合法的语句。跳转调用什么的也绝对是指向SARAM的。从新编译得到out文件,再烧写flash,这下完全对了。SDK板脱离PC,CCS运行了,波形也非常准确。
不过我想,我一定是哪里做的不对,TI不可能让它的用户做这么变态的烧写flash操作吧?
另外注意:
烧flash时,SDK跳线应该选成boot to H0 ram,否则烧写可能失败。这一点,TMD文档帮助里也没有提到。
脱离PC,CCS运行时,SDK跳线应该选成boot to H0 flash |