` 可能苦于对DSP的理解甚少,看起TL提供的例程总感觉高大上,但自己又摸不透,这种滋味真难受。不过,既然拿了板子就物尽其用,索性一步一步建立一个汇编工程来从头开始写汇编代码来了解一下DSP 。以下内容纯属楼主愚见,高手莫嘲。言归正传开始本文内容。 (一)汇编工程建立
打开CCS软件并依次点击如下菜单:“File-New-CCS Project” 图5-1
弹出如下图示的对话框。 图5-2
具体的参数设置如图5-3所示 图5-3
点击“Finish”即完成工程创建。新建的项目如图5-4所示 图5-4
可以看出来新建的工程中没有源文件,因为刚才建立工程的时候我们选择了空工程。 在工程上右键单击鼠标,添加源文件。 图5-5
选择“Source File”会弹出源文件类型对话框,此处可以指定源文件类型,可以引用CCS自带的源文件模板。不过由于我们要建立汇编源文件,此处Template一处我们选择None,在Source File一栏填入文件名及后缀。(特别提示:一定要带上后缀,汇编后缀我们填asm即可) 图5-6
单击Finish完成汇编文件的创建。至此,工程已经创建完毕,接下来开始写代码。 (二)汇编文件的编写
要想开始着手编写汇编文件的确得看不少资料,首当其冲的便是《TMS320C6000 Assembly Language Tools v7.6 User's Guide》该文档详细介绍了汇编工具链的使用。内容庞大,但一劳永逸。想使用汇编的朋友还是需要下功夫多看看。此处,楼主也是知道甚少,努力学习中! 在汇编文档的开始,使用global伪指令定义一个全局的符号“start”这个start类似于c文件中的main函数的符号,指定程序入口时使用。当然,名字可以自拟,只要不与关键字冲突都可以,接下来需要指定程序的入口地址。 在工程上右键单击鼠标,打开工程属性。 图5-7
依次展开 Build-C6000 Linker-Advanced Options找到Symbol Management选项图5-8
在右侧Specify program entry point for the output module一栏中填入入口地址的符号start。Start是在源文件中定义的全局符号。完成后单击OK。 (三)设置GPIO控制LED
控制底板LED需要将对应的管脚设置为通用的GPIO功能,即在对应的功能控制寄存器中写入0x8。由于底板的LED于GPIO对应关系如下: D6-GPIO0[5] D7-GPIO0[0] D9-GPIO0[1] D10-GPIO0[2] 所以需要将GPIO0[0]/GPIO0[1]/GPIO0[2]/GPIO0[8]都设置为GPIO功能,该功能对应寄存器PINMUX1(地址为0x01C14124) 图5-9
将上图中红色圈圈对应的位写入8h(十六进制)即可。 代码如下:
- ;设置底板LED控制引脚为GPIO功能
- mvkl 0x01C14124,a20 ;PINMUX1
- mvkh 0x01C14124,a20
- mvkl ((0x8<<28)|(0x8<<24)|(0x8<<20)|(0x8<<8)),b20
- mvkh ((0x8<<28)|(0x8<<24)|(0x8<<20)|(0x8<<8)),b20
- stw b20,*a20
复制代码
大家都知道,通用GPIO既可以作为输入也可以作为输出,这里为了控制LED肯定是要用作输出功能,因此需要配置DIR01(地址0x01E26010)寄存器。 图5-10
配置也很简单,把对应位置0即可使GPIO为输出。
- ;设置GPIO为输出
- mvkl 0x01E26010,a20 ;DIR01
- mvkh 0x01E26010,a20
- mvkl 0X0,b20
- mvkh 0X0,b20
- stw b20,*a20
复制代码
配置完GPIO接下来便可控制LED的亮灭了。GPIO的数据寄存器OUT_DAT01控制对应的GPIO01。 图5-11
程序中我们每次点亮2颗LED,延时一段时间后熄灭,再点亮另外两颗,如此循环。 (四)烧写程序注意事项
程序的烧写方法与TL6748提供的方法一致,只不过生成ais文件的时候我们需要把PSC选项使能,因为默认情况下GPIO是非使能状态,因此需要使能GPIO才能进行操作。 勾选Configure PSC 图5-12
切换至PSC选项卡 图5-13
确保Enable LPSC选项中PSC1对应的一栏有数字3,即表明GPIO已经使能。至于为什么是3而不是1呢?有图有真相,请见图5-14 图5-14
小结 终于自己点亮了LED,累啊!好多的内容需要看,资料才是最好的教材,希望大家也认真阅读。 【本文完!】 附完整的ASM源码:
- .title "led.asm"
- .global start
- .text
- start:
- ;设置底板LED控制引脚为GPIO功能
- mvkl 0x01C14124,a20 ;PINMUX1
- mvkh 0x01C14124,a20
- mvkl ((0x8<<28)|(0x8<<24)|(0x8<<20)|(0x8<<8)),b20
- mvkh ((0x8<<28)|(0x8<<24)|(0x8<<20)|(0x8<<8)),b20
- stw b20,*a20
- ;设置GPIO为输出
- mvkl 0x01E26010,a20 ;DIR01
- mvkh 0x01E26010,a20
- mvkl 0X0,b20
- mvkh 0X0,b20
- stw b20,*a20
- led1:
- ;点亮D6,D7,熄灭D9,D10
- mvkl 0x01E26014,a20 ;OUT_DATA01
- mvkh 0x01E26014,a20
- mvkl 0X00000021,b20
- mvkh 0X00000021,b20
- stw b20,*a20
- nop 4
- ;延时
- mvkl 0xffffff,b1
- mvkh 0xffffff,b1
- loop1:
- sub b1,1,b1
- [b1]b loop1
- nop 5
- led2:
- ;点亮D9,D10,熄灭D6,D7
- mvkl 0x01E26014,a20 ;OUT_DATA01
- mvkh 0x01E26014,a20
- mvkl 0X00000006,b20
- mvkh 0X00000006,b20
- stw b20,*a20
- nop 4
- ;延时
- mvkl 0xffffff,b1
- mvkh 0xffffff,b1
- loop2:
- sub b1,1,b1
- [b1]b loop2
- nop 5
- b led1
- nop 5
- .end
复制代码
--------------------华---丽---的---分---割---线--------------------
声明:本文内容及观点为楼主主观意识的产物,褒贬纯属个人意见,不存在黑谁捧谁,严格遵循试用规则。如有冒犯多多包涵,实在看不下去可以私信沟通,不要让法院给俺寄传票!^_^
`
|