大家好,又见面了,我是你们的朋友全栈君。
DSP开发,使用CCS软件建立工程以及烧录
1 概述
实验的代码已经上传。
1.1 资源概述
开发板: 普中DSP开发板
CCS版本:6.1.3
主控芯片型号:TMS320F28335
1.2 DSP介绍
德州仪器DSP在电机控制领域使用非常多,在最近20年接近霸主的存在,计算能力屌爆早期的arm,典型的型号有2407和2812。但是最近两年arm上升势头非常明显,差距越来越小,而且在外设方面完爆DSP。加上中美贸易战,导致中国很多公司开始去美国化,在新一代的产品中不再选用德州仪器的DSP,而是选择ST的ARM芯片或者国产的一些arm芯片。但是旧的基于DSP平台开发的产品还是要维护,新的平台也需要从dsp上迁移过来,所以有必要熟悉DSP的应用。
2 工程建立步骤
1,在需要建立的工程的文件夹内新建一个工程文件夹,此文件夹名字以及所在路径不能包含中文名。
2,打开CCS软件,在弹出的Workspace内指向刚才建立的文件夹。
3,建立新工程
4,填入工程的相关信息,器件型号,工程名字,路径以及工程类型。进行第4步,在选择编译器的时候,需要特别注意,尽量使用与原工程相同或者相近版本的编译器,否则将会出现不可预知的错误。
5,新建后的工程,只包含两个文件以及一个文件夹,文件为系统必须的头文件路径,RAM连接的配置文件28335_RAM_Ink.cmd。
cmd文件可以在工程选项里边进行选择。
6,在工程文件夹下建立4个文件夹,其中LIB拷贝TI官方的库C文件,头文件以及汇编文件。这里的C文件用到哪些拷贝哪些,缺失或者多余将会导致报错,报错的类型是变量没有定义或者被重复定义。头文件需要全部进行拷贝,即使那些看起来风马牛不相及的文件,因为这些文件在系统初始化或者中断向量表中均有引用。(stm32的arm工程只需要拷贝需要的文件)。
Lib->include文件夹的头文件
Lib->source文件夹的库函数文件,IQmath.lib为数学函数库,官方已经封装好。本例程中没有使用到复杂的数学计算,也可以不要。
user里边放置main.c文件,Hardware里边放置和硬件相关的文件,这里放置LED.c和LED.h。添加完后整个工程的结构是这样的
7,增加头文件路径,选中工程,右键,点击Properties。
选择头文件路劲,其中workspace是相对路径,库文件必须在工程文件夹下,工程建立完成后即使挪动工程也不会导致头文件路径失效,browse是绝对路径,必须确保库文件路径不发生变化,否则将导致报错,variables是环境变量定义的库函数路径。还不知怎么使用。
8,编译工程,没有错误和警告,编译完成后在工程树下可以看到生成了可供烧录的out文件。
烧录用的.OUT文件
9,烧录下载,这里和arm不同,这里只是烧录到了DSP的RAM,而不是FLASH。当断电或者重启时,程序将丢失,重新引导Flash里边的程序,如果要烧录到Flash需要进行另外的操作。点击烧录后会弹出对话框,配置调试的参数。
点击YES,在新弹出的对话框中填入文件名,并确认
10,选择仿真器和芯片型号型号,插入仿真器,点击右侧的 Test Connection。
若正常,在最后的几行将会弹出仿真器连接成功提示信息
11,再点击下载调试按钮,将会打开下载调试界面,可以单步调试添加断点等。
4 烧录到flash中
4.1 通过增减文件实现
1,增加C文件,Memcopy.c
2,增加cmd文件28335.cmd,屏蔽旧的cmd文件28335_RAM_Ink.cmd,CMD文件为分配内存用。
3,main函数中增加初始化操作代码;
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
4,编译下载,程序烧录,烧录时间比烧录RAM长很多,这个过程注意不要断电,不要断开仿真下载器,也不要进行复位,否则将可能导致芯片被锁死,无法再次下载程序。另外烧录的密码也不要设置全0,否则芯片将会琐事死。
5,通过指定Cmd文件路径和在工程中增加cmd文件效果是等效的。如果是放在工程里边记得将不用的cmd文件无效掉。
4.2 增加预编译宏
1,增加两套编译参数,复制于Debug。
2,在Flash设置里边增加预编译全局宏。
3,将代码写为宏定义的方式,使用ifdef,endif。在Ram配置里边,没有定义FlashProg,因此为灰色,在Flash配置里边有定义,此段代码将会被编译。
4,在配置参数配置过程中,不要使用Release,此种方式将会进行极简的优化,在闪灯的程序中,直接跳过了Delay函数,导致LED灯常亮。这里的Delay函数用的是简单的循环,被编译器优化了,而用系统的Systick实现的延时函数不会出现这个问题。
while(1)
{
LED1_TOGGLE;
LED7_TOGGLE;
delay();
}
5,选择工程右键,可以选择不同的编译模式
5 独立下载工具
5.1 Uniflash
TI官方提供了独立的下载工具Uniflash,可以对下载进行更多的设置,如设置密码,擦除选项,导出out或者bin文件等。
另外官网提供一个较低版本的Uniflash(3.4.1),这个版本感觉更加好用一些,且支持XDS100 V1.0,上面那个版本是不支持的。这个软件相对于C2PROG的最大好处是支持芯片的单独擦除工作。
当芯片为28379D双核芯片时,需要选择对应的CPU下载文件,CPU01和CPU02,下载两次。设置保持默认即可。
使用此软件进行烧录时,需要注意烧录完成后,需要拔出仿真器,否则程序可能无法正常运行。可能是不会对其自动复位。
而下面讲的C2PROG却不会有这个问题,下完后就自行跑起来了。
5.2 C2prog
支持C2prog通过串口进行下载,支持out文件。这个下载器下载速度比官方提供的UNIFLASH还要快。
boot跳线设置,不同的DSP拨码方式不相同。制作单板硬件时,通常时将前面三个直接拉到高,GPIO84通过跳线或者拨码进行设置。
注意使用串口下载时必须使用下述的端口,其它的端口会显示不能连接。不同的DSP对应的脚位也不同,具体参考数据手册。
串口说明,一般来说电脑端或者USB转串口线都是公头,开发板端是母头,2和3的定义不同,恰好交叉。使用USB转串口线可以直插开发板通讯,如果是台式机自带串口连接开发板则需要使用直连线而不是交叉线。
C2PROG这个软件支持使用仿真器通过JTAG下载DSP程序。
支持的仿真器类型XDS系列的仿真器基本都支持
双核F28379D需要分别选择对应的内核和烧录程序进行下载,因为两个CPU有各自独立的CPU内核。
烧录CPU1
烧录CPU2
6 程序源码
6.1main()函数
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "leds.h"
/******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,通过循环占用CPU,达到延时功能 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/
void delay(void)
{
Uint16 i;
Uint32 j;
for(i=0;i<32;i++)
for (j = 0; j < 100000; j++);
}
/******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/
void main()
{
InitSysCtrl();
LED_Init();
while(1)
{
LED1_TOGGLE;
delay();
}
}
6.2 leds.c文件
特别需要注意的是,库函数中有一个叫led.c和led.h的文件,因此取名时一定要取个不一样的名字。
#include "leds.h"
/******************************************************************************* * 函 数 名 : LED_Init * 函数功能 : LED初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/
void LED_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟
//LED1端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
//LED2端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;
GpioCtrlRegs.GPCDIR.bit.GPIO67=1;
GpioCtrlRegs.GPCPUD.bit.GPIO67=0;
//LED3端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;
GpioCtrlRegs.GPCDIR.bit.GPIO66=1;
GpioCtrlRegs.GPCPUD.bit.GPIO66=0;
//LED4端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;
GpioCtrlRegs.GPCDIR.bit.GPIO65=1;
GpioCtrlRegs.GPCPUD.bit.GPIO65=0;
//LED5端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;
GpioCtrlRegs.GPCDIR.bit.GPIO64=1;
GpioCtrlRegs.GPCPUD.bit.GPIO64=0;
//LED6端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
GpioCtrlRegs.GPADIR.bit.GPIO10=1;
GpioCtrlRegs.GPAPUD.bit.GPIO10=0;
//LED7端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;
GpioCtrlRegs.GPADIR.bit.GPIO11=1;
GpioCtrlRegs.GPAPUD.bit.GPIO11=0;
GpioDataRegs.GPCSET.bit.GPIO68=1;
GpioDataRegs.GPCSET.bit.GPIO67=1;
GpioDataRegs.GPCSET.bit.GPIO66=1;
GpioDataRegs.GPCSET.bit.GPIO65=1;
GpioDataRegs.GPCSET.bit.GPIO64=1;
GpioDataRegs.GPASET.bit.GPIO10=1;
GpioDataRegs.GPASET.bit.GPIO11=1;
EDIS;
}
6.3 leds.h文件
#ifndef _LEDS_H_
#define _LEDS_H_
#include "DSP2833x_Device.h" // DSP2833x 头文件
#include "DSP2833x_Examples.h" // DSP2833x 例子相关头文件
#define LED1_OFF (GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON (GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)
#define LED2_OFF (GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON (GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)
#define LED3_OFF (GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON (GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)
#define LED4_OFF (GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON (GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)
#define LED5_OFF (GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON (GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)
#define LED6_OFF (GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6_ON (GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO10=1)
#define LED7_OFF (GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7_ON (GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7_TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO11=1)
void LED_Init(void);
#endif /* LED_H_ */
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/125882.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...