首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

[教程]TI C54xx DSP 十天学会-[实验一 新手上路]

[教程]TI C54xx DSP 十天学会-[实验一 新手上路]

十天学会TI C54xx DSP<br /><font size="2"><span style="background-color:#ffffff "><span style="color:#000000 ">初学者编写的第一个程序通常是控制XF引脚的变化,然后用示波器测量XF脚波形或观察与相接的LED。这个程序也常常用来测度一下DSP能否正常工作。</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">实验1.1 最简单的程序:控制XF引脚周期性变化</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">实验目的:通过简单的程序了解DSP程序的结构,熟悉CCS开发环境。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*最简单的程序:TestXF1.asm</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*循环对XF位置1和清0,用示波器可以在XF脚检测到电平高低周期性变化</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*常用于检测DSP是否工作。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.mmregs ;预定义的寄存器</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.def CodeStart ;定义程序入口</span></span>标记<br /><br /><span style="background-color:#ffffff "><span style="color:#000000 "></span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.text ;程序区</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">CodeStart: ;程序入口</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">SSBX XF ;XF置1</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RPT #999 ;重复执行1000次空指令产生延时</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">NOP</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RSBX XF ;XF清0</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RPT #999 ;重复执行1000次空指令产生延时</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">NOP </span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">B CodeStart ;跳转到程序开头循环执行</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.end </span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">NOP指令执行时间为一个时钟周期,设DSP工作频率是50MHz,可以估算出XF引脚电平的变化频率约为:50M/2000=25kHz</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">在没有示波器的情况下,就要将程序1.1稍作改进,增加延时,用一个延时子程序将XF脚电平变化频率降到肉眼可分辨的程度,就可以用LED来显示电平的变化,程序如下:</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">实验1.2 子程序调用</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">实验目的:学习子程序的调用</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*TestXF2.asm</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*对TestXF1.asm稍作改进,用延时子程序设置较长的延时,</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*可以用试验板上的LED看到XF引脚电平的变化</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.mmregs ;预定义的寄存器</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.def CodeStart ;定义程序入口标记</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 "></span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.text ;程序区</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">CodeStart: ;程序入口</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">SSBX XF ;XF置1</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">CALL Delay ;调用延时程序</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RSBX XF ;XF清0</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">CALL Delay ;调用延时程序</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">B CodeStart ;跳转到程序开头循环执行</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">**************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*延时子程序:Delay</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*用两级减一计数器来延时。调整AR1和AR2的大小LED闪烁的频率不同</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">**************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">Delay: </span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">STM #999,AR1 ;循环次数1000</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">LOOP1: STM #4999, AR2 ;循环次数5000</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">LOOP2: BANZ LOOP2,*AR2- ;如果AR2不等于0,AR2减1,再判断</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">BANZ LOOP1,*AR1- ;如果AR1不等于0,AR1减1,跳转到LOOP1</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RET</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.end</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 "></span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">**************************************************************</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*注意这种延时方法并不精确,需要精确定时必须用</span></span>定时器<span style="background-color:#ffffff "><span style="color:#000000 ">。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*按此法延时的近似公式为:4*(AR2+1)*(AR1+1)*时钟周期</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*当DSP工作在50MHz(时钟周期20ns),AR1=999, AR2=4999时</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">*延时约为400ms,则LED闪烁的周期为800ms,频率1.25Hz</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">**************************************************************</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">设计指导:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">1.源</span></span>代码<span style="background-color:#ffffff "><span style="color:#000000 ">书写格式</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">1.每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序标签时的名称。指令区位于标号区之后,以空格或TAB格开。如果没有标号,也必须在指令前面加上空格或TAB,不能顶格。注释区在标号区、程序区之后,以分号开始。注释区前面可以没有标号区或程序区。另外还有专门的注释行,以*打头,必须顶格开始。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">2.一般区分大小写,除非加编译参数忽略大小写。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">3.标点符号有时不注意会打成中文全角字符导致错误。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">书写格式的要求在很多DSP书里都没有提,初学者往往只把书上的代码输入进去,编译时得到错误的提示,而不知所措。其中最容易犯的错误指令顶格写,不过一般经提示后不会犯第二次。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">有些格式CCS并没有做要求,但注意养成良好的代码书写风格,增加代码的可读性。以上两个例子的书写风格可作参考,但不是硬性规定:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">1.标号区占3个TAB的间隔,即12个字符</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">2.指令中的指令码占两个TAB间隔,然后是操作数。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">3.每一行的尾注能对齐的尽量对齐</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">4.标明一段程序功能的注释以*号打头顶格写,如果功能说明的注释较多,用分格线框起来。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">此外其它</span></span>编程<span style="background-color:#ffffff "><span style="color:#000000 ">语言的编程风格也可以借用过来,比如标示符命名规则、程序说明的要求等。如果项目组有规定,则按规定执行。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">本书的代码尽量保持一定的风格,不过读者可以发现前面的代码注释较多,后面随着学习的深入,一般不会对每一条指令加注释,只注明程序段的功能。另外代码贴到word里后,格式有些错位,无法一一纠正。</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">2.链接配置文件</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">一个完整的DSP程序至少包含三个部分:程序代码、中断向量表、链接配置文件(*.cmd)。这里介绍一下链接配置文件文件,对本次试验影响不大的中断向量表将在后文介绍。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">连接配置文件的确定了程序链接成最终可执行代码时的选项,其中有很多条目,实现不同方面的选项,其中最常用的也是必须的有两条:1.存贮器的分配 2.标明程序入口。以本次实验为例,下面的简单的链接配置文件就够用了:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">/* TestXF.cmd */</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">-e CodeStart /*程序入口,必须在程序中定义相应的标号*/</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">MEMORY {</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">page 0:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">RAM: org=0100h len=0F00h /*定义程序存贮区,起始0100H,长度0F00H*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">}</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">SECTIONS{</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.text:&gtRAM page 0 /*将.text段映射到page0的param区*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">}</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">由于每个程序都需要一个链接配置文件,可以编写一个满足通常需要的链接配置文件。作为本手册通用的链接配置文件如下,可以满足本书大部分程序的需要。在未特别指明的情况下使用这个通用的链接配置文件:</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">/* 5402.cmd */</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">-e CodeStart /*程序入口,必须在程序中定义相应的标号*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">-m map.map /*生成</span></span>存储器<span style="background-color:#ffffff "><span style="color:#000000 ">映射报告文件 */</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">MEMORY {</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">AGE 0:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">VECT: org=0080h len=0080h /*中断向量表*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">ARAM: org=100h len=0F00h /*代码区*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">AGE 1:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">DARAM: org=1000h len=1000h /*数据区*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">}</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">SECTIONS {</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.text :&gt; PARAM PAGE 0 /*代码段*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.vectors :&gt; VECT PAGE 0 /*中断向量表*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">STACK :&gt; DARAM PAGE 1 /*堆栈*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.bss :&gt; DARAM PAGE 1 /*未命名段*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">.data :&gt; DARAM PAGE 1 /*数据段*/</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">}</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">更多参考:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">1.关于代码书写格式:SPRU102: TMS320C54x Assembly Language Tools User&#39;s Guide,3.5 Source Statement Format</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">2.关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools User&#39;s Guide,7.5 Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive</span></span><br /><br /><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">练习:</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">1、试一下不按规定格式书写代码会产生什么样的编译错误。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">2、试一下将链接配置文件中的MEMORY,SECTIONS改成小写会出现什么样的编译错误。</span></span><br /><br /><span style="background-color:#ffffff "><span style="color:#000000 ">3.修改程序1.2中AR1,AR2的值,观察LED闪烁频率</span></span> </font><span style="color:#000000 "><font size="2">*注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。</font></span><br /><br />

[教程]TI C54xx DSP 十天学会-[实验一 新手上路]

十天学会TI C54xx DSP初学者编写的第一个程序通常是控制XF引脚的变化,然后用示波器测量XF脚波形或观察与相接的LED。这个程序也常常用来测度一下DSP能否正常工作。实验1.1 最简单的程序:控制XF引脚周期性变化实验目的:通过简单的程序了解DSP程序的结构,熟悉CCS开发环境。**************************************************************最简单的程序:TestXF1.asm*循环对XF位置1和清0,用示波器可以在XF脚检测到电平高低周期性变化*常用于检测DSP是否工作。*************************************************************.mmregs ;预定义的寄存器.def CodeStart ;定义程序入口标记.text ;程序区CodeStart: ;程序入口SSBX XF ;XF置1RPT #999 ;重复执行1000次空指令产生延时NOPRSBX XF ;XF清0RPT #999 ;重复执行1000次空指令产生延时NOP B CodeStart ;跳转到程序开头循环执行.end NOP指令执行时间为一个时钟周期,设DSP工作频率是50MHz,可以估算出XF引脚电平的变化频率约为:50M/2000=25kHz在没有示波器的情况下,就要将程序1.1稍作改进,增加延时,用一个延时子程序将XF脚电平变化频率降到肉眼可分辨的程度,就可以用LED来显示电平的变化,程序如下:实验1.2 子程序调用实验目的:学习子程序的调用**************************************************************TestXF2.asm*对TestXF1.asm稍作改进,用延时子程序设置较长的延时,*可以用试验板上的LED看到XF引脚电平的变化*************************************************************.mmregs ;预定义的寄存器.def CodeStart ;定义程序入口标记.text ;程序区CodeStart: ;程序入口SSBX XF ;XF置1CALL Delay ;调用延时程序RSBX XF ;XF清0CALL Delay ;调用延时程序B CodeStart ;跳转到程序开头循环执行***************************************************************延时子程序:Delay*用两级减一计数器来延时。调整AR1和AR2的大小LED闪烁的频率不同**************************************************************Delay: STM #999,AR1 ;循环次数1000LOOP1: STM #4999, AR2 ;循环次数5000LOOP2: BANZ LOOP2,*AR2- ;如果AR2不等于0,AR2减1,再判断BANZ LOOP1,*AR1- ;如果AR1不等于0,AR1减1,跳转到LOOP1RET.end***************************************************************注意这种延时方法并不精确,需要精确定时必须用定时器。*按此法延时的近似公式为:4*(AR2+1)*(AR1+1)*时钟周期*当DSP工作在50MHz(时钟周期20ns),AR1=999, AR2=4999时*延时约为400ms,则LED闪烁的周期为800ms,频率1.25Hz**************************************************************设计指导:1.源代码书写格式源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下:1.每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序标签时的名称。指令区位于标号区之后,以空格或TAB格开。如果没有标号,也必须在指令前面加上空格或TAB,不能顶格。注释区在标号区、程序区之后,以分号开始。注释区前面可以没有标号区或程序区。另外还有专门的注释行,以*打头,必须顶格开始。2.一般区分大小写,除非加编译参数忽略大小写。3.标点符号有时不注意会打成中文全角字符导致错误。书写格式的要求在很多DSP书里都没有提,初学者往往只把书上的代码输入进去,编译时得到错误的提示,而不知所措。其中最容易犯的错误指令顶格写,不过一般经提示后不会犯第二次。有些格式CCS并没有做要求,但注意养成良好的代码书写风格,增加代码的可读性。以上两个例子的书写风格可作参考,但不是硬性规定:1.标号区占3个TAB的间隔,即12个字符2.指令中的指令码占两个TAB间隔,然后是操作数。3.每一行的尾注能对齐的尽量对齐4.标明一段程序功能的注释以*号打头顶格写,如果功能说明的注释较多,用分格线框起来。此外其它编程语言的编程风格也可以借用过来,比如标示符命名规则、程序说明的要求等。如果项目组有规定,则按规定执行。本书的代码尽量保持一定的风格,不过读者可以发现前面的代码注释较多,后面随着学习的深入,一般不会对每一条指令加注释,只注明程序段的功能。另外代码贴到word里后,格式有些错位,无法一一纠正。2.链接配置文件一个完整的DSP程序至少包含三个部分:程序代码、中断向量表、链接配置文件(*.cmd)。这里介绍一下链接配置文件文件,对本次试验影响不大的中断向量表将在后文介绍。连接配置文件的确定了程序链接成最终可执行代码时的选项,其中有很多条目,实现不同方面的选项,其中最常用的也是必须的有两条:1.存贮器的分配 2.标明程序入口。以本次实验为例,下面的简单的链接配置文件就够用了:/* TestXF.cmd */-e CodeStart /*程序入口,必须在程序中定义相应的标号*/MEMORY {page 0RAM: org=0100h len=0F00h /*定义程序存贮区,起始0100H,长度0F00H*/}SECTIONS{.text:&gtRAM page 0 /*将.text段映射到page0的param区*/}由于每个程序都需要一个链接配置文件,可以编写一个满足通常需要的链接配置文件。作为本手册通用的链接配置文件如下,可以满足本书大部分程序的需要。在未特别指明的情况下使用这个通用的链接配置文件:/* 5402.cmd */-e CodeStart /*程序入口,必须在程序中定义相应的标号*/-m map.map /*生成存储器映射报告文件 */MEMORY {PAGE 0:VECT: org=0080h len=0080h /*中断向量表*/PARAM: org=100h len=0F00h /*代码区*/PAGE 1ARAM: org=1000h len=1000h /*数据区*/}SECTIONS {.text :&gt; PARAM PAGE 0 /*代码段*/.vectors :&gt; VECT PAGE 0 /*中断向量表*/STACK :&gt; DARAM PAGE 1 /*堆栈*/.bss :&gt; DARAM PAGE 1 /*未命名段*/.data :&gt; DARAM PAGE 1 /*数据段*/}更多参考:1.关于代码书写格式:SPRU102: TMS320C54x Assembly Language Tools User&#39;s Guide,3.5 Source Statement Format2.关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools User&#39;s Guide,7.5 Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive练习:1、试一下不按规定格式书写代码会产生什么样的编译错误。2、试一下将链接配置文件中的MEMORY,SECTIONS改成小写会出现什么样的编译错误。3.修改程序1.2中AR1,AR2的值,观察LED闪烁频率 *注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。

document.body.oncopy=function(){
event.returnValue=false;
var t=document.selection.createRange().text;
var s="参考地址:http://www.hfdzbbs.com/read-htm-tid-314.html";
window.clipboardData.setData('Text', t+'\r\n'+s);
}

[教程]TI C54xx DSP 十天学会-[实验一 新手上路]

十天学会TI C54xx DSP初学者编写的第一个程序通常是控制XF引脚的变化,然后用示波器测量XF脚波形或观察与相接的LED。这个程序也常常用来测度一下DSP能否正常工作。实验1.1 最简单的程序:控制XF引脚周期性变化&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;实验目的:通过简单的程序了解DSP程序的结构,熟悉CCS开发环境。**************************************************************最简单的程序:TestXF1.asm*循环对XF位置1和清0,用示波器可以在XF脚检测到电平高低周期性变化*常用于检测DSP是否工作。*************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mmregs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;预定义的寄存器&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.def&amp;nbsp;&amp;nbsp; CodeStart&amp;nbsp;&amp;nbsp; ;定义程序入口标记&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.text&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;程序区CodeStart:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;程序入口&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSBX&amp;nbsp;&amp;nbsp; XF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;XF置1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RPT&amp;nbsp;&amp;nbsp; #999&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;重复执行1000次空指令产生延时&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RSBX&amp;nbsp;&amp;nbsp; XF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;XF清0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RPT&amp;nbsp;&amp;nbsp; #999&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;重复执行1000次空指令产生延时&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NOP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeStart&amp;nbsp;&amp;nbsp; ;跳转到程序开头循环执行&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.end&amp;nbsp;&amp;nbsp; NOP指令执行时间为一个时钟周期,设DSP工作频率是50MHz,可以估算出XF引脚电平的变化频率约为:50M/2000=25kHz在没有示波器的情况下,就要将程序1.1稍作改进,增加延时,用一个延时子程序将XF脚电平变化频率降到肉眼可分辨的程度,就可以用LED来显示电平的变化,程序如下:实验1.2 子程序调用实验目的:学习子程序的调用**************************************************************TestXF2.asm*对TestXF1.asm稍作改进,用延时子程序设置较长的延时,*可以用试验板上的LED看到XF引脚电平的变化*************************************************************&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.mmregs&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;预定义的寄存器&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.def&amp;nbsp;&amp;nbsp; CodeStart&amp;nbsp;&amp;nbsp; ;定义程序入口标记&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.text&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;程序区CodeStart:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;程序入口&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSBX&amp;nbsp;&amp;nbsp; XF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;XF置1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CALL&amp;nbsp;&amp;nbsp; Delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;调用延时程序&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RSBX&amp;nbsp;&amp;nbsp; XF&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;XF清0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CALL&amp;nbsp;&amp;nbsp; Delay&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ;调用延时程序&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;B&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CodeStart&amp;nbsp;&amp;nbsp; ;跳转到程序开头循环执行***************************************************************延时子程序:Delay*用两级减一计数器来延时。调整AR1和AR2的大小LED闪烁的频率不同**************************************************************Delay:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;STM&amp;nbsp;&amp;nbsp; #999,AR1&amp;nbsp;&amp;nbsp; ;循环次数1000LOOP1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; STM&amp;nbsp;&amp;nbsp; #4999, AR2 ;循环次数5000LOOP2:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BANZ&amp;nbsp;&amp;nbsp; LOOP2,*AR2- ;如果AR2不等于0,AR2减1,再判断&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BANZ&amp;nbsp;&amp;nbsp; LOOP1,*AR1- ;如果AR1不等于0,AR1减1,跳转到LOOP1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RET&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.end&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;***************************************************************注意这种延时方法并不精确,需要精确定时必须用定时器。*按此法延时的近似公式为:4*(AR2+1)*(AR1+1)*时钟周期*当DSP工作在50MHz(时钟周期20ns),AR1=999, AR2=4999时*延时约为400ms,则LED闪烁的周期为800ms,频率1.25Hz**************************************************************设计指导:1.源代码书写格式源代码的书写有一定的格式,初学者往往容易忽视。简单归纳如下:1.每一行代码分为三个区:标号区、指令区和注释区。标号区必须顶格写,主要是定义变量、常量、程序标签时的名称。指令区位于标号区之后,以空格或TAB格开。如果没有标号,也必须在指令前面加上空格或TAB,不能顶格。注释区在标号区、程序区之后,以分号开始。注释区前面可以没有标号区或程序区。另外还有专门的注释行,以*打头,必须顶格开始。2.一般区分大小写,除非加编译参数忽略大小写。3.标点符号有时不注意会打成中文全角字符导致错误。书写格式的要求在很多DSP书里都没有提,初学者往往只把书上的代码输入进去,编译时得到错误的提示,而不知所措。其中最容易犯的错误指令顶格写,不过一般经提示后不会犯第二次。有些格式CCS并没有做要求,但注意养成良好的代码书写风格,增加代码的可读性。以上两个例子的书写风格可作参考,但不是硬性规定:1.标号区占3个TAB的间隔,即12个字符2.指令中的指令码占两个TAB间隔,然后是操作数。3.每一行的尾注能对齐的尽量对齐4.标明一段程序功能的注释以*号打头顶格写,如果功能说明的注释较多,用分格线框起来。此外其它编程语言的编程风格也可以借用过来,比如标示符命名规则、程序说明的要求等。如果项目组有规定,则按规定执行。本书的代码尽量保持一定的风格,不过读者可以发现前面的代码注释较多,后面随着学习的深入,一般不会对每一条指令加注释,只注明程序段的功能。另外代码贴到word里后,格式有些错位,无法一一纠正。2.链接配置文件一个完整的DSP程序至少包含三个部分:程序代码、中断向量表、链接配置文件(*.cmd)。这里介绍一下链接配置文件文件,对本次试验影响不大的中断向量表将在后文介绍。连接配置文件的确定了程序链接成最终可执行代码时的选项,其中有很多条目,实现不同方面的选项,其中最常用的也是必须的有两条:1.存贮器的分配 2.标明程序入口。以本次实验为例,下面的简单的链接配置文件就够用了:/* TestXF.cmd */-e CodeStart&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*程序入口,必须在程序中定义相应的标号*/MEMORY {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;page 0:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbspRAM: org=0100h len=0F00h&amp;nbsp;&amp;nbsp; /*定义程序存贮区,起始0100H,长度0F00H*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}SECTIONS{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.text:&amp;gtRAM page 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*将.text段映射到page0的param区*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}由于每个程序都需要一个链接配置文件,可以编写一个满足通常需要的链接配置文件。作为本手册通用的链接配置文件如下,可以满足本书大部分程序的需要。在未特别指明的情况下使用这个通用的链接配置文件:/* 5402.cmd */-e CodeStart&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*程序入口,必须在程序中定义相应的标号*/-m map.map&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*生成存储器映射报告文件 */MEMORY {&amp;nbsp;&amp;nbspAGE 0:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VECT: org=0080h&amp;nbsp;&amp;nbsp; len=0080h&amp;nbsp;&amp;nbsp; /*中断向量表*/&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbspARAM: org=100h&amp;nbsp;&amp;nbsp; len=0F00h&amp;nbsp;&amp;nbsp; /*代码区*/&amp;nbsp;&amp;nbspAGE 1:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DARAM: org=1000h&amp;nbsp;&amp;nbsp; len=1000h&amp;nbsp;&amp;nbsp; /*数据区*/}SECTIONS&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;.text&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;gt; PARAM&amp;nbsp;&amp;nbsp; PAGE 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*代码段*/&amp;nbsp;&amp;nbsp;.vectors&amp;nbsp;&amp;nbsp; :&amp;gt; VECT&amp;nbsp;&amp;nbsp; PAGE 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*中断向量表*/&amp;nbsp;&amp;nbsp;STACK&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;gt; DARAM&amp;nbsp;&amp;nbsp; PAGE 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*堆栈*/&amp;nbsp;&amp;nbsp;.bss&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;gt; DARAM&amp;nbsp;&amp;nbsp; PAGE 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*未命名段*/&amp;nbsp;&amp;nbsp;.data&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :&amp;gt; DARAM&amp;nbsp;&amp;nbsp; PAGE 1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*数据段*/&amp;nbsp;&amp;nbsp;}更多参考:1.关于代码书写格式:SPRU102: TMS320C54x Assembly Language Tools User&amp;#39;s Guide,3.5 Source Statement Format2.关于链接配置文件:SPRU102: TMS320C54x Assembly Language Tools User&amp;#39;s Guide,7.5 Linker Command Files,7.7 The MEMORY Directive,7.8 The SECTIONS Directive练习:1、试一下不按规定格式书写代码会产生什么样的编译错误。2、试一下将链接配置文件中的MEMORY,SECTIONS改成小写会出现什么样的编译错误。3.修改程序1.2中AR1,AR2的值,观察LED闪烁频率 *注:部份文章为网上收录供大家共同学习参考之用,并不代表本站意见。如存在版权问题请马上通知我们,我们将马上删除。

document.body.oncopy=function(){
event.returnValue=false;
var t=document.selection.createRange().text;
var s=&quot;参考地址:http://www.hfdzbbs.com/read-htm-tid-314.html&quot;;
window.clipboardData.setData('Text', t+'\r\n'+s);
}
返回列表