CCS |
DSP芯片的编程环境 |
controlSUITE |
初学者建议都装上 TI官方提供的通用:头文件、源文件、cmd文件、gel文件、lib文件及实例程序 如:C:\ti\controlSUITE\device_support\f2833x\v142 |
仿真器 + 开发板 | 公司设计的DSP板(就是所谓的“目标板”)
主要把DSP芯片的型号和使用的仿真器的型号选对即可,具体参考下图
右击项目名称 → NEW → Folder,可以向项目添加新的目录
建议初学者的项目文件目录可设计如下:
为什么这么设计? 因为TI官方提供的这些文件基本上是不需要修改的
右击项目名称 → Properties
注意:DSP2833x_SOURCE 和 MyProgram不需要添加Include路径,只把DSP2833x_INCLUDE添加进去即可
1、路径:C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_headers\cmd下的,DSP2833x_Headers_nonBIOS.cmd
2、路径:C:\ti\controlSUITE\device_support\f2833x\v142\DSP2833x_common\cmd下的,28335_RAM_lnk.cmd
Ctrl+C复制,鼠标选中 DSP2833x_CMD,Ctrl+V粘贴
在TI官方提供的套件里,有两个文件夹包含了我们需要的头文件,一个是DSP2833x_headers,一个是DSP2833x_common
在设计操作GPIO点亮LED灯的程序中,发现DSP2833x_common中的DSP2833x_SWPrioritizedIsrLevels.h、SFO.h和SFO_V5.h并不是必须的,可以都拷贝进去,并不会影响程序的编译。
官网提供的源文件既包含.c文件也包含.asm文件,主要给出了.h文件中声明的函数的具体函数定义,建议用到哪个再去加哪个可能更好。系统初始化需要用肯定要用到的源文件可以先添加,如下图绿色方框所示。
如果想一步到位,把所有的源文件全部拷贝进去,编译会出错.
说是重复定义,不难猜测针对DefaultIsr,源文件你只能从DSP2833x_DefaultIsr.c和DSP2833x_SWPrioritizedDefaultIsr.c选择一个。针对PieVect,源文件你只能从DSP2833x_PieVect.c和DSP2833x_SWPrioritizedPieVect.c选择一个。暂选DSP2833x_DefaultIsr.c和DSP2833x_PieVect.c,删DSP2833x_SWPrioritizedDefaultIsr.c和DSP2833x_SWPrioritizedPieVect.c
删除后,编译成功!
当前使用的源文件如下图所示:
将关于TMS320F28335芯片的DSP编程通用文件整理到压缩包DSP28335基础软件包.rar。
后续若需要新建项目,可拷贝下图的前三个文件到项目的目录下直接使用。
文件夹:DSP2833x_SWPrioritized(一般不用),则是包含之前删除的两个.c文件。
要快速完成一个GPIO点LED灯的功能,可以分为三小步。
#include "DSP28x_Project.h"
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
// 上述就是基本的初始化,你可以暂时不用理解每一步具体是什么意思
}
以下原理图为例
一个RGBLED灯的三个管脚分别连接在主芯片TMS320F28335的GPIO58 GPIO59 GPIO61上,从原理图中可以看出,只要在对应的GPIO输出低电平,就可以点亮对应颜色的LED灯。但在输出之前低电平之前,需要对GPIO进行配置。
配置GPIO有两个比较关键的寄存器
一个是MUX寄器,一个芯片IO复用2~4种功能是很常见的,MUX用来配置GPIO使用的功能是什么,以GPIO61为例,我们查看数据手册
当我们往这个寄存器的第26位和第27位,写入00时,GPIO61就被配置成了通用的I/O啦,
不用担心把位操作错了,代码如下:
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
一个是DIR寄存器,DIR是Direction的缩写,方向寄存器,DIR用来配置GPIO的输入/输出方向,还是以GPIO61为例,我们查看数据手册
从GPIO63到GPIO32都是一样的,在对应位写0就配置成输入,写1就配置成输出。我们配置成输出,代码如下:
GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
除此之外,还有PUD和QSEL寄存器,暂时没吃透,后面用到可能就自然理解啦
1、直接往里面写
GpioDataRegs.GPBDAT.bit.GPIO61 = 1;
GpioDataRegs.GPBDAT.bit.GPIO61 = 0;
2、用SET和CLEAR(置位/清零)
GpioDataRegs.GPBSET.bit.GPIO61 = 1;
GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1;
3、TOGGLE(翻转)
GpioDataRegs.GPBTOGGLE.bit.GPIO61 = 1;
GpioDataRegs.GPBTOGGLE.bit.GPIO61 = 1;
在DSP28x_usDelay(1000);处设3个断点,应该可以观察到不同颜色的LED被交替点亮。
#include "DSP28x_Project.h"
void Gpio_setup(void);
void main(void)
{
InitSysCtrl();
DINT;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
Gpio_setup();
for(;;){
GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1;
GpioDataRegs.GPBSET.bit.GPIO59 = 1;
GpioDataRegs.GPBSET.bit.GPIO61 = 1;
DSP28x_usDelay(1000);
GpioDataRegs.GPBSET.bit.GPIO58 = 1;
GpioDataRegs.GPBCLEAR.bit.GPIO59 = 1;
GpioDataRegs.GPBSET.bit.GPIO61 = 1;
DSP28x_usDelay(1000);
GpioDataRegs.GPBSET.bit.GPIO58 = 1;
GpioDataRegs.GPBSET.bit.GPIO59 = 1;
GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1;
DSP28x_usDelay(1000);
}
}
void Gpio_setup(void){
EALLOW; // 配置GPIO时必须的操作,解保护
GpioCtrlRegs.GPBPUD.bit.GPIO58 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO58 = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO59 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO59 = 1;
GpioCtrlRegs.GPBPUD.bit.GPIO61 = 1;
GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO61 = 1;
EDIS; // 配置GPIO时必须的操作,开保护
}
//===========================================================================
// No more.
//===========================================================================