初学tms320f2812的一些总结

时间:2024-03-07 13:48:33

     不久前从一个学长那儿借来了一块tms320f2812的板子和一个TDS510仿真器,不过一直没有机会动手试试。最近因为闲下来了,于是重新翻出板子开始学习DSP。以前折腾过一些单片机,玩得最多的要数Keil下开发stm32,但是这次要接触的CCS还真是让我略感头疼,在熟悉CCS基本操作上就花了不少时间。废话不多说,先总结下这几天初学DSP2812的一些经验。说明一下,CCS版本是3.3,仿真器用的是TDS510 USB2.0(mingwei的)。

     打开CCS之前首先要选择目标平台,当然我选择F2812。在这里要区分Simulator和Emulator。Simulator是软件仿真,即用CCS去模拟2812执行指令,不需要硬件支持;因为是模拟,因此dsp程序运行时速度很慢,并且模拟的2812存在一些缺陷(等下会提到)。Emulator就是用仿真器连接目标板进行调试,具体就不多说了。

    为了熟悉CCS下的基本调试,我选择先用Simulator来调试程序(感觉这样简单一些)。打开CCS、创建工程、编写程序……这个程序的功能是传感器的数据(先用MATLAB采集并保存为.dat文件),然后计算出欧拉角;由于涉及到数学运算,在这里用到了IQmath库,其sin、cos等函数是通过查找表实现的,这个查找表被固化在2812的Boot ROM里(0x3FF000)。然而问题来了,在调试程序时发现,sin、cos等函数的计算结果为0,折腾半天后用CCS的Memory观察窗口观察0x3FF000的内容时才发现了原因,Boot ROM存放数学表的地方是空的(全为0),汗~~~。之后用Emulator跑同样的程序就没有这个问题,说明用Simulator调程序时,若用到了IQmath要小心了。

    基本操作大致熟悉后,开始弄Emulator。首先安装TDS510驱动(折腾了好久,最后才知道仿真器的驱动不支持64位系统),接着安装CCS用到的仿真器文件,最后打开CCS、板子上电、仿真器Connect、Load Program、Run,到此还一切正常(看到了程序printf的输出),可是主循环才跑了2次就出错了。这是我遇到的第二个“大”问题,下面详细介绍。

    首先Load Program后进入_c_int00,然后进入main执行自己编写的程序。出现错误的现象为:在包含数据处理代码的主循环中设置断点并不停地Run(每Run一次代表一次循环,记下变量i的值),运行过程中发现程序会跑飞,而且每次都在固定的循环次数后跑飞(当i = 2时);注释掉printf,程序又在i = 14时跑飞。这里所说的跑飞是指,点击run之后,CCS左下角Emulator状态卡在Running,点击halt之后程序跑到了[0x000066 FFFF ITRAP1]。
    ......
    i= 0;
    while(1){
        //process
        i ++;
        printf("%.2f %.2f %.2f\n", ang[0], ang[1], ang[2]); <<<<<<在这里设置断点
    }
    ......

    最后发现上述问题的原因是没有关闭看门狗。2812上电时看门狗是使能的,由于没有关闭看门狗,因此当看门狗计数器溢出时复位了CPU,导致CPU从Bootloader(0x3FFC00)开始运行,Flash启动模式下Bootloader会跳转至0x3F7FF6,本例中0x3F7FF6是没有被写入代码(codestart段)的,所以CPU跑飞。
    解决方法:在main函数中加入如下语句,在main中关闭看门狗。
    int *WatchdogWDCR = (void *) 0x7029;
    // Disable the watchdog:
    asm(" EALLOW ");
    *WatchdogWDCR = 0x0068;
    asm(" EDIS ");

    另一种解决方法是将程序入口(Code Entry Point)设为codestart,在里面关闭看门狗再进入_c_int00。首先,在DSP281x_CodeStartBranch.asm中,
    ......
    .ref _c_int00
    .global code_start <<<<<<<添加这一句
    .....
    然后Build Option中的Link页中,在Code Entry Point(-e)编辑框里添加code_start(原本是空,则默认为_c_int00),这样就将Debug->Restart的位置从_c_int00改为了codestart,codestart会关闭看门狗然后跳转至_c_int00。但是更改Code Entry Point后,编译时会出现warning: entry-point symbol other than "_c_int00" specified:  "code_start"提示。以下设置可以去掉这个警告:
    在“TMS320C6000优化汇编手册”第五章“链接C/C++代 码”有一段关于_c_int00符号的说明。它是运行支持库RTS.lib包含的一个重要函数。如 果Linker选项使用-c或-cr选项_c_int00被自动定义为程序的入口点。消除警告的方法,在 Linker选项下面选择No Autoinitialization。(本段摘自网络)