要求:
基于TI公司的TMS320F2812 DSP芯片,依次点亮8个数码管,要求每个数码管显示的内容为用户规定的8位数,循环往复。
原理:
数码管采用共阴极型。数据由2812模块的低八位输入,锁存器的控制信号由2812模块输出,但经由CPLD模块(复杂可编程逻辑器件)译码后再控制对应的八个锁存器,如下图所示:
步骤:
1.新建CCS工程:
申明:鄙人使用的CCS版本为10.0.0(各版本间差异不是很大,可以参考本文)。
第一步打开CCS后弹出下面窗口:
这是CCS的默认工作空间,可以自己更改(这个路径需要记住,后续有用),(如不想在每次打开软件时弹出可勾选左下角选项),设置好后Launch进入。
第二步新建工程文件:
在主界面左上角选中project里的New CCS project选项,
在弹出的窗口中选择TMS320F2812芯片,Connection是连接器选项,根据自己需求选择,命名Project name时尽量不要用中文(使用CCS时都不要用中文,注释除外,防止报错),而后选择新建一个Empty Project(空白工程),也可以选择with main.c(含有main.c文件)的工程,Finish完成。
2.配置工程文件:
新建工程后所有文件如上图,此时关于TMS320F2812的配置文件是没有的,需要用户自己编程或导入,这里我选择导入文件。所需文件链接:https://pan.baidu.com/s/1myaEmWbziLS869FqkwcTDg?pwd=CCS1 提取码:CCS1
百度网盘下载后,其中source文件夹全是2812常用的.c文件,include文件夹全是2812常用的.h文件(一般.h文件不用修改),这里我们只需要修改source文件夹的LED.c文件里的内容(也就是main.c)。将图中三个文件下载到自己的设备后复制三个文件(这三个文件可以留在设备里以后都能用上),进入创建的CCS工作空间的工程文件。将 复制的三个文件粘贴到工程文件中,CCS会自动识别到软件中,这里选择删除2812-RAM-lnk.cmd文件。
3.编译目标文件:
在CCS中双击LED.c打开编译面板(如果你导入的是我分享的文件,代码和我就是一样的)。
1.定义 该项目要用到的.h文件:
#include "DSP28_Device.h"
这一行包含特定于设备的头文件,其中包含TMS320F2812微控制器所需的定义和声明。
2.定义CPLD模块和八个LED:
#define CPLDport2000 (volatile unsigned int *) 0x2000//CPLD的地址
#define LED1 (volatile unsigned int *) 0x3000 //LED1的地址
#define LED2 (volatile unsigned int *) 0x3001 //LED2的地址
#define LED3 (volatile unsigned int *) 0x3002 //LED3的地址
#define LED4 (volatile unsigned int *) 0x3003 //LED4的地址
#define LED5 (volatile unsigned int *) 0x3004 //LED5的地址
#define LED6 (volatile unsigned int *) 0x3005 //LED6的地址
#define LED7 (volatile unsigned int *) 0x3006 //LED7的地址
#define LED8 (volatile unsigned int *) 0x3007 //LED8的地址
一系列#define语句定义CPLD的存储器地址(地址为0x2000)和八个LED(LED1至LED8)(地址为0x3000至0x3007)。每个地址都被定义为一个指向易失性无符号整数的指针,这表明内存位置可以在程序控制之外改变,并且不应该被编译器优化。
3.对工程进行初始化(在main函数中进行):
InitSysCtrl();//初始化系统函数
DINT; //禁止和清除所有CPU中断
InitPieCtrl();//初始化PIE
IER = 0x0000;//禁止CPU中断
IFR = 0x0000;//禁止CPU中断
InitPieVectTable();//初始化中断向量表
*CPLDport2000=0x0;//将CPLD的端口2000清零
*LED1=0x0;//以下是8个数码管清零
*LED2=0x0;
*LED3=0x0;
*LED4=0x0;
*LED5=0x0;
*LED6=0x0;
*LED7=0x0;
*LED8=0x0;
4.编译循环函数(在main函数中进行):
for(;;)
{
//实现显示并循环“19100233”
*LED1=0x14;//第一个数码管给数据1
delay(800000);
*LED2=0xf6;//第二个数码管给数据2
delay(800000);
*LED3=0x14;//第三个数码管给数据3
delay(800000);
*LED4=0x77;//第四个数码管给数据4
delay(800000);
*LED5=0x77;//第五个数码管给数据5
delay(800000);
*LED6=0xb3;//第六个数码管给数据6
delay(800000);
*LED7=0xb6;//第七个数码管给数据7
delay(800000);
*LED8=0xb6;//第八个数码管给数据8
delay(800000);//设置延迟时间
*LED1=0x0;
*LED2=0x0;
*LED3=0x0;
*LED4=0x0;
*LED5=0x0;
*LED6=0x0;
*LED7=0x0;
*LED8=0x0;
delay(800000);
}
5.定义延迟函数:
//延时函数:通过增加i的值来消耗时间,从而达到延迟的效果
void delay(Uint32 k)
{
Uint32 i;
for(i=0;i<k;i++) ;
}
纠错:
编译好工程文件后,右键单击工程文件,在弹出的窗口中点击Build Project运行文件。
然后就会悲催的发现报错了:
一..h文件报错:
Description Resource Path Location Type
#1965 cannot open source file "DSP28_Device.h" DSP28_Adc.c /test.01/source line 20 C/C++ Problem
这个问题是我们建立工程时没有申明.h的位置,.c文件不知道那里是头了。
解决方法:
依次进入右键单击工程文件>>Properties>>Build>>C2000 Compiler>>Include Options>>右上角加号>>Workspace>>工程文件>>选择include,而后OK就行。
二..stack报错:
warning #10210-D: creating ".stack" section with default size of 0x400; use the -stack option to change the default size
意思是说,工程中的.stack段使用的是默认的大小0x400,可以使用-stack选项来改变这个默认大小。
解决方法:
依次进入右键单击工程文件>>Properties>>Build>>C2000 Linker>Basic Options>>设置为0x300(或更小),而后OK就行。
再次运行问题解决。