代码合成过程.doc_第1页
代码合成过程.doc_第2页
代码合成过程.doc_第3页
代码合成过程.doc_第4页
代码合成过程.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

4、 代码合成过程: 首先要进行配置文件的改写。为了使代码更加清晰,内存安排更加合理,我在配置文件中的第二段新开了一段DATAS,专门用于保存数据,如循环缓冲区、AD初始化数据等等。配置文件具体如下: -m ad.map-o ad.out-e resetsMEMORY PAGE 0: VEC:origin=0x1c00, length=0x0080 PROG:origin=0x1d00,length=0x1000 PAGE 1: STACKS:origin=0x0200, length=0x0300 DATAS:origin=0x0500, length=0x0500SECTIONS vectors: VEC PAGE 0 prog: PROG PAGE 0 stack_section: STACKS PAGE 1 firdata: DATAS PAGE 1其中PAGE0专门存放代码,PAGE1专门存放数据。 步骤2:写好配置文件之后,就要开始写中断向量表了。只要把中断向量表中的定时中断改写成:B jumpNopNop并且将第一项AD中断改成:ReteNopNopNop即可将中断向量表保存在名为int的文件中,后缀名为.asm。 步骤3:配置文件中,-e resets表示从resets标号开始执行程序。starts标号所指向的代码和jump指向的中断服务程序都保存在timer.asm文件中。在timer文件中,首先进行了常量的定义,只要把原滤波实验中FIR滤波的缓冲区的定义和中断试验中中断向量地址定义和AD初始化状态字定义拼在一起即可。 FIR滤波器中只需保存输入数据向量,所以只用开辟一个buferdatax而不需要原来代码中的buferdatay。由于对AD初始化要用端口写指令portw,而portw的源操作数必须是内存数,所以要开辟两个空间保存AD初始化状态字。最终滤波之后的DA输出数据也要用portw指令,所以也要分配一个空间保存输出数据。D_temp用于保存临时读入数据,将在关闭AD使能时从任意其他地址读入的数据(数据本身无意义)保存在这个内存单元中。分配完空间后,就要进行代码的拼接和改写。首先进行寄存器的重命名: .asg ar5,ORIGIN ;将AD输出,即采样值对应的寄存器设为原始数据 .asg ar3,INPUT ;保存输入信号 .asg ar4,OUTPUT ;保存用于输出的信号这样寄存器名字有实际意义,便于进行使用。 然后,将中断实验中的中断向量表设置、开中断、AD初始化、定时器初始化拼接在一起组成主程序,随后进入死循环,等待中断。 将中断程序拼在以上程序的后面。一旦产生中断,在允许中断的情况下,就会进入中断服务程序。 整个代码合成过程中,我并没有遇到太大的问题,只是在合成的过程中,特别注意了有些被改名了的变量。而且最开始,我并没对寄存器进行重命名,所以在改写代码的时候特别麻烦。为了简便和可读性,我将ar3到ar5都重新命名。然后要调整循环缓冲区的大小,并且特别注意不要忘记缓冲区长度的设置(也就是BK的值),否则可能会导致程序跑飞。5、 软件流程和硬件描述以及核心代码叙述:(1)软件流程如下:(2)硬件描述:1、 定时器: 定时器状态寄存器:寄存器0-15位总共16位。第三位是时钟中断屏蔽位。要将此位屏蔽关闭。 定时器硬件构成: PRD是一个4位寄存器,TDDR是一个16为寄存器。两个寄存器都用于存放分频比。每次向计时器状态寄存器写入开始计时指令后,TDDR就会被装入新的值,并且将此值装入到减法计数器PSC中。每来一个CPU时钟时(只要计时器没有停止工作),就把PSC自减1.当PSC减到0时,就会想TIM高位产生借位信号,使之自减1,同时重新装载TDDR中的数值。而TIM的初值是由PRD设置的,当TIM被减到0时,就会通过TINT产生定时中断 2、AD:W/!RXF AD的地址为7FFFFH,也就是只要地址线上出现这个地址,CS就会变成低电平,AD被选中。REFP是AD参考电压,也就是AD的量程。AIN进行模拟信号输入,AD内部对其采样保持,然后进行模数转换。当转换完成后,就会从INT端口发出中断。这时,由于RD接XF,而XF由CPU中状态寄存器的一位是相同的,所以要想读使能,就必须用软件将XF置成低电平。这样,再发出读信号,就可以从数据线上读出AD数据。而读完后要软件关闭RD。核心代码叙述: 首先要进行配置文件的改写。这已经在上一部分叙述过。 写好配置文件之后,就要开始写中断向量表了。因为-e resets表示从resets标号开始执行程序。 Resets为中断向量表的第一项。进入resets之后,在执行完栈指针初始化后跳转到starts。开始执行滤波器代码。将中断向量表放在vectors段中。Jump和starts为同一工程中另外文件中的地址标号。栈的大小为200h。由于DSP中压栈是从高地址向低地址压栈,所以要将堆栈指针指向栈空间首地址+栈空间大小的内存,这样压栈时的数据才能落在栈空间内。Tint为时钟中断,只要产生此中断而且CPU允许中断,则无条件跳转到中断服务程序。另外,除了列出的中断向量以外,后面的中断向量全部略去。中断向量表的设置如下:.sect vectors .ref jump .ref starts .def resetsk_stack_size .set 200k_stack .usect stack_section,k_stack_sizesystem_stack .set k_stack+k_stack_sizeresets: bd starts stm #system_stack,spnmi: rete nop nop nopsint17 .space 4*16sint18 .space 4*16sint19 .space 4*16sint20 .space 4*16sint21 .space 4*16sint22 .space 4*16sint23 .space 4*16sint24 .space 4*16sint25 .space 4*16sint26 .space 4*16sint27 .space 4*16sint28 .space 4*16sint29 .space 4*16sint30 .space 4*16 int0: rete nop nop nopint1: rete nop nop nopint2: rete nop nop nop tint0: b jump nop Nop将中断向量表保存在名为int的文件中,后缀名为.asm。 starts标号所指向的代码和jump指向的中断服务程序都保存在timer.asm文件中。(1)在timer文件中,首先要进行常量的定义(滤波器系数略去):;以下为各个常量的定义;k_bufsize .set 16 ;缓冲区大小,必须比a大k_a .set 15 ;fir滤波器相应系数的个数k_cir .set k_bufsize ;循环缓冲区大小k_cr0_send .set 0080h;AD的第一个寄存器的初始化状态字,设置为软件触发k_cr1_send .set 0100h;AD的第二个寄存器的初始化状态字,设置使用内部时钟k_iptr .set 000111000b07;中断向量表首地址的高9位k_temp .set 1111111b;用于按位与保存PMST低7位(2)然后进行数据空间的分配:;各个数据的空间分配;buferdatax .usect firdata,k_bufsize*2 ;循环缓冲区,用于存放滤波器相关的输入数据out_data .usect firdata,1 ;AD输出信号,即输入计算机的采样信号d_cr0_send .usect firdata,1;保存AD初始化状态字1d_cr1_send .usect firdata,1;保存AD初始化状态字2d_temp .usect firdata,1 ;用于保存临时读入的数据 FIR滤波器中只需保存输入数据向量,所以只用开辟一个buferdatax而不需要原来代码中的buferdatay。由于对AD初始化要用端口写指令portw,而portw的源操作数必须是内存数,所以要开辟两个空间保存AD初始化状态字。最终滤波之后的DA输出数据也要用portw指令,所以也要分配一个空间保存输出数据。D_temp用于保存临时读入数据,将在关闭AD使能时从任意其他地址读入的数据(数据本身无意义)保存在这个内存单元中。(3) 分配完空间后,就要进行代码的拼接和改写。首先进行寄存器的重命名: .asg ar5,ORIGIN ;将AD输出,即采样值对应的寄存器设为原始数据 .asg ar3,INPUT ;保存输入信号 .asg ar4,OUTPUT ;保存用于输出的信号这样寄存器名字有实际意义,便于进行使用。(4)设置中断向量表的首地址。这个地址的高九位放在PMST寄存器中,而低七位由产生外部中断时,随之一起产生的中断类型码乘以4得出。starts: ;设置中断向量表首地址高九位; ldm pmst,a and #k_temp,a or #k_iptr,a stl a,pmst(5) 打开外部中断。外部中断有两级控制,一个是DSP内核外的中断屏蔽寄存器,他可以对外部可屏蔽中断按位进行屏蔽。另一级是DSP内的状态寄存器的中断屏蔽位。 ;打开外部时钟中断; stm #0008h,imr nop nop rsbx intm ;软件将CPU内部外部中断使能位打开 nop ssbx frct ;对小数整数位置1 nop nop (6)对AD进行初始化,以及各个地址寄存器值的初始化stm #d_temp,ar2 ;将临时单元地址放在ar2 ;将AD初始化状态字放入相应的内存单元,为AD初始化做准备 stm #d_cr0_send,ar1 st #k_cr0_send,*ar1+ st #k_cr1_send,*ar1 stm #d_cr0_send,ar1 stm #out_data,ORIGIN ;设置滤波器循环缓冲区 stm #k_cir,bk;循环缓冲区大小 stm #1,ar0 ;循环缓冲区步长 stm #buferdatax,INPUT;将循环缓冲区首地址放在INPUT寄存器内 RPT #k_a-1; STM #0, *INPUT+0% ;输入信号的初始状态全为0 ;对AD初始化 portr 0FFFFh,*ar2 ;使AD的CS不使能 nop nop nop portw *ar1+,07FFh ;写入AD的寄存器CR0 rpt #8 nop portw *ar1,07FFh ;写入AD的寄存器CR1 portr 0FFFFh,*ar2 ;使AD的CS不使能 rpt #10 nop Nop在这之后,AD已经开始工作。(7) 对定时器进行初始化:;设计采样频率为8000Hz stm #0010h,tcr ;停止定时器的工作 stm #01F3h,prd ;设置PRD分频比.01F4h= 500d stm #082Eh,tcr ;设置TDDR分频比为15,TSS清零,装载两个分频计数器并开始计时. ;总分频为7500,原始时钟频率为60MHz,所以分得8000Hz nop nop Tcr的最低十六进制位和prd整个寄存器的乘积就是分频比。 最后一条指令将两个分频比的值装入到分频寄存器中,并且开始计时。 (8)进行完上述步骤之后,就要进如循环,不断等待定时中断的到来。每进行一个计时周期,就会产生一个定时中断。 wait: nop nop b wait(9) 一旦产生中断,在允许中断的情况下,就会进入中断服务程序。 首先要打开AD的读使能。然后从AD(AD地址为7FFFH)读一个采样数据。之后,为了防止溢出,要先清除掉高六位,用这个数据进行滤波。 rsbx xf ;AD读使能,为接下来的读数做准备,同时开始下一次转换 rpt #5 nop portr 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论