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,填入工程的相關信息,器件型號,工程名字,路徑以及工程類型。
工程信息
5,新建後的工程,只包含兩個文件以及一個文件夾,文件爲系統必須的頭文件路徑,RAM連接的配置文件。
工程文件
6,在工程文件夾下建立4個文件夾,其中LIB拷貝TI官方的庫C文件,頭文件以及彙編文件。這裏的C文件用到哪些拷貝哪些,缺失或者多餘將會導致報錯,報錯的類型是變量沒有定義或者被重複定義。頭文件需要全部進行拷貝,即使那些看起來風馬牛不相及的文件,因爲這些文件在系統初始化或者中斷向量表中均有引用。(stm32的arm工程只需要拷貝需要的文件)。
建立文件夾
Lib->include文件夾的頭文件
頭文件清單
Lib->source文件夾的庫函數文件,IQmath.lib爲數學函數庫,官方已經封裝好。本例程中沒有使用到複雜的數學計算,也可以不要。
庫函數文件
user裏邊放置main.c文件,Hardware裏邊放置和硬件相關的文件,這裏放置LED.c和LED.h。添加完後整個工程的結構是這樣的
工程結構
7,增加頭文件路徑,選中工程,右鍵,點擊Properties。
Properties
選擇頭文件路勁,其中workspace是相對路徑,庫文件必須在工程文件夾下,工程建立完成後即使挪動工程也不會導致頭文件路徑失效,browse是絕對路徑,必須確保庫文件路徑不發生變化,否則將導致報錯,variables是環境變量定義的庫函數路徑。還不知怎麼使用。
頭文件路勁
8,編譯工程,沒有錯誤和警告,編譯完成後在工程樹下可以看到生成了可供燒錄的out文件。
編譯結果
燒錄用的BIN文件
bin文件
9,燒錄下載,這裏和arm不同,這裏只是燒錄到了DSP的RAM,而不是FLASH。當斷電或者重啓時,程序將丟失,重新引導Flash裏邊的程序,如果要燒錄到Flash需要進行另外的操作。點擊燒錄後會彈出對話框,配置調試的參數。
對話款
點擊YES,在新彈出的對話框中填入文件名,並確認
對話框
10,選擇仿真器和芯片型號型號,插入仿真器,點擊右側的 Test Connection。
仿真器
若正常,在最後的幾行將會彈出仿真器連接成功提示信息
仿真器連接成功
11,再點擊下載調試按鈕,將會打開下載調試界面,可以單步調試添加斷點等。在這裏插入圖片描述

4 燒錄到flash中

1,增加C文件
在這裏插入圖片描述
2,增加cmd文件28335.cmd,屏蔽舊的cmd文件28335_RAM_Ink.cmd
文件處理
3,main函數中增加初始化操作代碼;

	MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);

	InitFlash();

4,編譯下載,程序燒錄,燒錄時間比燒錄RAM長很多,這個過程注意不要斷電,不要斷開仿真下載器,也不要進行復位,否則將可能導致芯片被鎖死,無法再次下載程序。

5 獨立下載工具

TI官方提供了獨立的下載工具Uniflash,可以對下載進行更多的設置,如設置密碼,擦除選項,導出out或者bin文件等。
下載工具

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_ */

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章