对于TI的C2000系列dsp的新手来说,如何让开发板的LED点亮,是有一定的困难的。笔者就从一个初学者的角度,通过一步一步的具体操作,来让开发板的led闪烁。程序代码在附件中提供。
开发板:笔者随便找了一个TMS320F2806的电路板,带有3个led灯。其中2个通过dsp的引脚控制,另外一个是3.3V电压指示。
仿真器:XDS100V3
集成开发环境:ccs11。
编译器版本:v21.6.0.LTS
1)打开CCS11。新建一个CCS工程
2)配置工程文件,工程名自己取。
按照上面的方法进行配置。在第5步时,要选择不带main.c的空工程,单击Finish。会出现如下图的工程目录结构:
3)继续配置工程属性:
在(1)处,单击右键,出现弹出菜单,单击(2)处。
在Products选项卡中,添加仿真器型号。
单击OK,将仿真器添加到工程文件中。
4)在工程目录中新建两个文件夹:include和source。
接着,要拷入一些头文件和例程源代码到这两个文件夹中。这些.h和.c文件从何处来?可以去Ti的官网搜索相关的器件示例。在这里笔者用的是F2806芯片,可以查到一个sprc191.zip的安装包。可以在本文附件中下载或去该链接下载https://www.ti.com.cn/tool/cn/SPRC191。解压后点击安装,
然后进入安装目录,如下图:
所有本文需要的文件都来源自上面的DSP280x_common和DSP280x_headers这两个文件夹。
首先将两文件夹中的include文件夹中所有.h文件拷到工程文件的include文件夹中。
再将DSP280x_common和DSP280x_headers两文件夹source文件夹下的所有.c文件拷到工程文件中的source文件夹中。最终形成的目录结构为:
此外,还缺少一个main主函数。main函数可以自己写,也可以拷一个例程修改。这里,我们拷一个例程过来。例程从哪里找?在刚才sprc191.zip的安装目录中找:
因为用的是CCS11,所以选文件夹中xxx_ccsv4版本的程序,ccsv4表示该程序适用于CCS4以上版本的编译器。将(2)处的.c文件拷到工程文件的source文件夹中。工程中include和source下的文件如下:
5)再次设置工程文件属性:
将include文件夹的路径添加到搜索路径中:
然后再将source文件夹也添加到搜索路径中,如下图:
开始修改main主函数的代码,先将原有的代码注释掉,替换成下面的代码。
因为电路板上的两个led分别是用gpio11和gpio19控制的,并且用DELAY_US宏语句延时0.5秒。写完代码后,开始编译,按那个锤子。
会出现70多个错误,
经过分析错误信息,可知是与软件中断优先级的缺省设置冲突有关。需要删掉相关的.h和.c文件。
再编译,错误消失了,但是还有48个告警,如果不处理,程序也不会正常执行。
从编译器给出的告警信息来看,是和外设的寄存器在RAM中无法找到相应的段定义有关,特别是红框所示的地方,是说gpio的控制寄存器无法找到RAM中的段定义。我们需要操作gpio这个寄存器,出现这个告警,gpio将无法正确输出。出现这种情况说明还缺少一个链接命令文件(.cmd)。从哪找??回到sprc191.zip的安装目录,在下图中的路径里找到个.cmd文件(红框的位置)。
将其拷到工程文件夹的目录下,也可以在工程目录下新建一个cmd文件夹,将其拷到这里。笔者是用的后一种方法。
然后再编译一遍,如下图:
告警还有三个,但都不是和gpio有关的了,其中前两个是和flash代码加密相关的段,最后一个是程序烧录到flash里运行时相关的段。因为本程序都是直接在ram中运行,所以这三个告警都不会影响现在的这个工程,可以先不用管。按下Debug,将编译后的代码下载到dsp内部的ram中,将仿真器一端与电路板相连,另一端用usb口与电脑相连,按那个虫子开始将程序下载到dsp的ram中。
将程序载入到RAM后,按红圈的按钮开始运行。
点击运行。就可以看到led闪亮。
如果让闪的速度有所变化,可以修改DELAY_US(500000)中的值,这个宏定义表示延时n微秒。
因为程序是在RAM中运行的,掉电后,重新上电,RAM内容清空,程序就不会再次执行了。如果要想保存在flash中,就需要用不同的cmd链接命令文件了。
6)下面来说说如何将程序烧录到flash中运行
如果要将程序从烧录到flash,然后从flash引导运行需要在刚才程序的基础上做如下的调整:
一、更换cmd链接命令文件:
将该路径下的F2806.cmd文件复制到工程路径下的cmd文件夹中,然后将原工程中的2806_RAM_lnk.cmd删除,也可以去除编译。
通过(1)和(2)两步操作,在工程编译时就不再编译2806_RAM_lnk.cmd这个文件。在(3)处可以看到F2806.cmd已经被包括到工程中了。
二、需要在main主函数所在.c文件中声明3个外部变量
三、在main主函数中添加代码
黄色标记的两行就是要添加的代码。
四、编译通过
这回连告警信息也没有了。
五、按debug,写入到flash,会出现下面的画面
重要提示:千万不要在写入flash的过程中断电,否则可能导致flash密钥区写入错误数据,锁死芯片,无法解锁使芯片报废!!!
当需要重新从ram引导时,只需要下面两句注释掉,并把cmd文件换回即可。
总结:
TI的C2000级别的dsp与microchip的dspic33系列dsp有很大的区别,单从程序启动的加载方式看就有非常多的不同之处。TI的芯片更复杂,引导方式也非常多,而microchip的芯片引导就相对简单多了,即使不是对dspic33的存储结构非常了解,也能很快的运行一个应用程序。但是TI的dsp内部可以运行RTOS(实时操作系统),对复杂的中断情况的调度处理更得心应手,而这是microchip所不具备的。
TI的引导方式更像是PC的引导,首先芯片上电后通过厂家固化的ROM(PC的BOIS或UEFI)可以选择用户程序的载入方式,然后可以直接从ram运行程序或从flash运行(ram类似PC的内存,flash更像PC的硬盘系统分区),还可以通过各种通讯方式引导系统(串口,SPI,CAN,IIC等方式)。这对于新手来说并不友好,而且需要不同的cmd文件,更会使初学者陷入迷茫之中,稍有不慎就可能无法正确运行程序。而microchip有图形化的代码生成器,大大降低了初学者的学习门槛,是其优点之一。