打印

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

[复制链接]
528|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Plantt|  楼主 | 2017-8-14 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
2812程序转移至flash之终极变态攻略

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 可能叙述不是很清楚,各位将就着看吧。

相关帖子

沙发
vivilzb1985| | 2017-8-15 22:34 | 只看该作者
这个过程的还是多参考些,重在学习解决问题的过程的。

使用特权

评论回复
板凳
firstblood| | 2017-8-15 22:35 | 只看该作者
这个针对初学者来说,总结成这样是非常不错的。

使用特权

评论回复
地板
kingkits| | 2017-8-16 13:47 | 只看该作者
对于你目前这种情况,不妨考虑先使用C做启动,再考虑把其中的关键代码进行汇编优化。
说实话,没用好把该是人家做的不好,是你知道的太少

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

637

主题

901

帖子

4

粉丝