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.
;//===========================================================================