1.在窗口的空白處右鍵——New——CCS Project,出現下面窗口:
2.在窗口中輸入自己芯片型號,這里以TMS320F28335為例;
3.在窗口中點擊,選擇自己的仿真器型號,這里以
Texas Instruments XDS100v2 USB Debug Probe為例;
4.在窗口輸入工程名firstasm;
5.在窗口選擇編譯器版本,這里選Tl v16.9.6.LTS;
6.在窗口中選擇Empty Assembly-only Project之后點擊Finsh之后可以在Project Explorer窗口中看到我們剛建立的空工程:
7.接着添加工程源文件:點擊工程名——右鍵——New——Source File,出現下面窗口:
8.在中輸入源文件名main.asm;
9.在中選擇None——點擊Finish;
下面是關鍵步驟,讓工程編譯成功關鍵:
首先分析:工程建立好后會自動將28335_RAM_lnk.cmd文件放到工程中,這個CMD文件是將DSP配置為boot to SARAM的引導模式(即我們通常調試DSP的模式)。該CMD文件中:
。。。
BEGIN : origin = 0x000000, length = 0x000002 /* Boot to M0 will go here */
。。。
/* Setup for "boot to SARAM" mode:
The codestart section (found in DSP28_CodeStartBranch.asm)
re-directs execution to the start of user code. */
codestart : > BEGIN, PAGE = 0
。。。
上面這兩句語句指明了程序入口地址為0x00 0000,且入口標簽為code_start。要滿足上面的條件有兩種解決方式:
方式一:將文件DSP28_CodeStartBranch.asm(注意這個文件的代碼在文章末位有)添加到工程中,之后在main.asm中添加如下語句即可,代碼如下:
.global _c_int00
_c_int00:
NOP
NOP
ESTOP0
方式二:直接在main.asm中添加代碼:
code_start:
NOP
NOP
ESTOP0
附錄:DSP28_CodeStartBranch.asm的代碼:
;// TI File $Revision: /main/1 $
;// Checkin $Date: August 18, 2006 13:45:55 $
;//###########################################################################
;//
;// FILE: DSP2833x_CodeStartBranch.asm
;//
;// TITLE: Branch for redirecting code execution after boot.
;//
;// For these examples, code_start is the first code that is executed after
;// exiting the boot ROM code.
;//
;// The codestart section in the linker cmd file is used to physically place
;// this code at the correct memory location. This section should be placed
;// at the location the BOOT ROM will re-direct the code to. For example,
;// for boot to FLASH this code will be located at 0x3f7ff6.
;//
;// In addition, the example DSP2833x projects are setup such that the codegen
;// entry point is also set to the code_start label. This is done by linker
;// option -e in the project build options. When the debugger loads the code,
;// it will automatically set the PC to the "entry point" address indicated by
;// the -e linker option. In this case the debugger is simply assigning the PC,
;// it is not the same as a full reset of the device.
;//
;// The compiler may warn that the entry point for the project is other then
;// _c_init00. _c_init00 is the C environment setup and is run before
;// main() is entered. The code_start code will re-direct the execution
;// to _c_init00 and thus there is no worry and this warning can be ignored.
;//
;//###########################################################################
;// $TI Release: DSP2833x Header Files V1.01 $
;// $Release Date: September 26, 2007 $
;//###########################################################################
;***********************************************************************
WD_DISABLE .set 1 ;set to 1 to disable WD, else set to 0
.ref _c_int00
.global code_start
;***********************************************************************
;* Function: codestart section
;*
;* Description: Branch to code starting point
;***********************************************************************
.sect "codestart"
code_start:
.if WD_DISABLE == 1
LB wd_disable ;Branch to watchdog disable code
.else
LB _c_int00 ;Branch to start of boot.asm in RTS library
.endif
;end codestart section
;***********************************************************************
;* Function: wd_disable
;*
;* Description: Disables the watchdog timer
;***********************************************************************
.if WD_DISABLE == 1
.text
wd_disable:
SETC OBJMODE ;Set OBJMODE for 28x object code
EALLOW ;Enable EALLOW protected register access
MOVZ DP, #7029h>>6 ;Set data page for WDCR register
MOV @7029h, #0068h ;Set WDDIS bit in WDCR to disable WD
EDIS ;Disable EALLOW protected register access
LB _c_int00 ;Branch to start of boot.asm in RTS library
.endif
;end wd_disable
.end
;//===========================================================================
;// End of file.
;//===========================================================================