2812程序转移至flash之终极变态攻略

simple_head   2007-12-6 10:12 楼主
本人从今年9月开始第一次接触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 可能叙述不是很清楚,各位将就着看吧。

回复评论 (8)

回复: 2812程序转移至flash之终极变态攻略

哪里需要这么麻烦?这些如果有人说一下或自己到网上查一下就好办了。 在cmd文件中添加: ramfunc: LOAD=FLASHI PAGE=0 RUN =RAMH0 PAGE=1 LOAD_START(_ramfunc_loadstart), LOAD_END(_ramfunc_loadend ), RUN_START(_ramfunc_runstart) 然后在代码中添加: #pragma CODE_SECTION(目标函数名,"ramfunc") memcpy((void *)&ramfunc_runstart,(void *)&ramfunc_loadstart,&ramfunc_loadend-&ramfunc_loadstart); 这样就可以自动把FLASH的代码搬到RAM运行 在CCS里面装个FLASH插件,用仿真器就可以烧录FLASH。 为了量产,我现在正在想办法用串口烧录FLASH,也许你可以帮忙。
点赞  2007-12-12 10:41

回复:2812程序转移至flash之终极变态攻略

dingding!!!
点赞  2007-12-30 10:10

回复:2812程序转移至flash之终极变态攻略

收录到资源整理贴
http://www.CINZY.com-CINZY\'LAB辛仔实验室
点赞  2008-1-24 12:29
好东西 支持楼主
点赞  2011-3-19 22:46

做人不可浮躁

基本的步骤,都遇到过,但是解决问题的方式方法网上到处都是,10年前可能还是个问题,现在只能是人自己的问题

串口烧写器就是利用串口下程序,ti也给了解决方案
点赞  2011-5-17 11:13
mark谢谢!
点赞  2011-8-30 00:51
稍安勿燥。呵呵
工程 = 数学+物理+经济
点赞  2011-8-30 08:35
:rose: :rose: :rose:
你好呀
点赞  2011-9-12 10:34
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复