收藏 分享(赏)

汇编 定时器 DSP.doc

上传人:hwpkd79526 文档编号:7541112 上传时间:2019-05-21 格式:DOC 页数:21 大小:400KB
下载 相关 举报
汇编 定时器  DSP.doc_第1页
第1页 / 共21页
汇编 定时器  DSP.doc_第2页
第2页 / 共21页
汇编 定时器  DSP.doc_第3页
第3页 / 共21页
汇编 定时器  DSP.doc_第4页
第4页 / 共21页
汇编 定时器  DSP.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、汇编实验报告定时器一 工作原理1.时钟部分1.1 C55x 时钟发生器的原理和配置方法TMS320VC5509A 的时钟发生器从 CLKIN 引脚输入,在内部修改这个信号(通过一个数字锁相环,PLL),来产生希望频率的输出时钟。时钟发生器将这个输出时钟(即 CPU 时钟)送给 CPU、外设和其他C55 的内部模块。也可以用可编程的时钟分频器对 CPU 时钟分频,在 CLKOUT 引脚上输出。时钟发生器有一个时钟模式寄存器 CLKMD,用来控制和监视时钟发生器。通过修改该寄存器可以触发两种主要的操作模式:1) 旁路模式。PLL 被旁路掉,输出时钟的频率就等于输入时钟频率除以1、2、4。因为 PL

2、L 模块关闭,因此该模式可以用来降低功耗。2)锁定模式。输入时钟既可以乘以或除以一个系数来获得期望的输出频率,并且输入时钟相位与输入信号锁定。本实验采用该模式。2.定时器部分2.1 通用定时器介绍及其控制方法2.1.1 定时器的工作时钟 DSP 内部的 CPU 时钟,本实验采用该方式。 引脚 TIN/TOUT 利用定时器控制寄存器(TCR)中的字段 FUNC 可以确定时钟源和 TIN/TOUT 引脚的功能。2.1.2 控制方法介绍预定标计数寄存器(PSC)由输入时钟驱动,PSC 在每个输入时钟周期减 1;当其减到 0 时,TIM 减 1,当 TIM 减到 0,定时器向 CPU发送一个中断请求(

3、TINT)或向 DMA 控制器发送同步事件。定时器发送中断信号或同步事件信号的频率可用下式计算:通过设置定时器控制寄存器(TCR)中的自动重装控制位 ARB,可使定时器工作于自动重装模式:当 TIM 减到 0,重新将周期寄存器(TDDR,PRD)的内容复制到计数寄存器(PSC,TIM)中,继续定时。本实验的具体设置见后面寄存器设置部分。2.2 定时器的使用 初始化定时器 停止/启动定时器 DSP 复位后定时器寄存器的值3.中断部分3.1 中断定义由硬件或软件驱动的信号,使 DSP 将当前的程序挂起,执行另一个称为中断服务子程序(ISR)的任务。3.2 TMS320C55x 的中断系统C55x

4、支持 32 个 ISR。有些 ISR 可以由软件或硬件触发,有些只能由软件触发。3.3 DSP 处理中断的步骤(1)接收中断请求。软件和硬件都要求 DSP 将当前程序挂起1PRD1TTIN入入(2)响应中断请求。CPU 必须响应中断。如果是可屏蔽中断,响应必须满足某些条件。如果是不可屏蔽中断,则 CPU 立即响应。(3)准备进入中断服务子程序。CPU 要执行的主要任务有: 完成当前指令的执行,并冲掉流水线上还未解码的指令 自动将某些必要的寄存器的值保存到数据堆栈和系统堆栈 从用户实现设置好的向量地址获取中断向量,该中断向量指向中断服务子程序(4)执行中断服务子程序。CPU 执行用户编写的 IS

5、R。ISR 以一条中断返回指令结束,自动恢复步骤(3)中自动保存的寄存器值。3.4 中断向量表4.汇编程序4.1 链接命令文件ISR 序 号 硬 件 中 断优 先 级 向 量 名 向 量 地 址 ISR 功 能 0 1( 最 高 ) RESTIV( IV0) IVPD:0h 复 位 ( 硬 件 或 软 件 ) 1 2 NMI( I1) IP:8h 硬 件 不 可 屏 蔽 中 断 ( NMI) 或 软 件 中 断 1 2 4 IV2 IVPD:10h 硬 件 或 软 件 中 断 3 6 I3 IP:18h 硬 件 或 软 件 中 断 4 7 IV4 IVPD:20h 硬 件 或 软 件 中 断

6、5 8 I5 IP:28h 硬 件 或 软 件 中 断 6 10 IV6 IVPD:30h 硬 件 或 软 件 中 断 7 1 I7 IP:38h 硬 件 或 软 件 中 断 8 12 IV8 IVPD:40h 硬 件 或 软 件 中 断 9 14 I9 IP:48h 硬 件 或 软 件 中 断 10 15 IV10 IVPD:50h 硬 件 或 软 件 中 断 1 16 I1 IP:58h 硬 件 或 软 件 中 断 12 18 IV12 IVPD:60h 硬 件 或 软 件 中 断 13 19 I13 IP:68h 硬 件 或 软 件 中 断 14 2 IV14 IVPD:70h 硬 件

7、或 软 件 中 断 15 23 I15 IP:78h 硬 件 或 软 件 中 断 16 5 IV16 IVPH:80h 硬 件 或 软 件 中 断 17 9 I17 IP:8h 硬 件 或 软 件 中 断 18 13 IV18 IVPH:90h 硬 件 或 软 件 中 断 19 17 I19 IP:98h 硬 件 或 软 件 中 断 20 20 IV20 IVPH:A0h 硬 件 或 软 件 中 断 21 21 I21 IP:8h 硬 件 或 软 件 中 断 2 24 IV2 IVPH:B0h 硬 件 或 软 件 中 断 23 25 I23 IP:8h 硬 件 或 软 件 中 断 24 3 B

8、ERIV(I24) IVPD:C0h 总 线 错 误 中 断 或 软 件 中 断 25 26 DLOGI(I25) IP:8h Dat Log中 断 或 软 件 中 断 26 27( 最 低 ) RTSIV(I26) IVPD:0h 实 时 操 作 系 统 中 断 或 软 件 中 断 27 SI27 IP:8h 软 件 中 断 28 SIV28 IVPD:E0h 软 件 中 断 29 SI29 IP:E8h 软 件 中 断 30 SIV30 IVPD:F0h 软 件 中 断 31 SI31 IP:F8h 软 件 中 断 31 TMS320C55x 链接器有两个功能强大的指令,即 MEMORY

9、和SECTIONS。MEMORY 指令允许用户定义一个目标系统的存储器映射,可以命名存储器的各个部分,并且指定开始地址和大小。SECTIONS 指令告诉链接器合成输入段为输出段,并且告诉链接器把这些输出段放在存储器的某个位置。4.2 中断向量表及中断程序a) 程序中应包含中断向量表,VC5509A 默认向量表从程序区0 地址开始存放,根据IPVD 和IPVH 的值确定向量表的实际地址。b) 向量表中每项为8 个字,存放一个跳转指令,跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即CPU 复位操作完成后自动进入执行的程序入口。c) 服务程序在服务操作完成后,清除相应中断标

10、志,返回,完成一次中断服务。 4.3 汇编源程序(见后)二 寄存器配置1. 时钟模式寄存器(CLKMD),I/O 端口地址 0x1c00MOV #0x5467,PORT(#CLKMD);0101 0100 0110 0111工作在锁定模式下,输出时钟频率如下:PLLMULT/PLLDIV*输入频率=20*20M=400M;具体配置如下黑体部分:位 字 段 说 明15 Rsvd 保留14 IAI退出 Idle 状态后,决定 PLL 是否重新锁定0 PLL 将使用与进入 Idle 状态之前相同的设置进行锁定1 PLL 将重新锁定过程13 IOB处理失锁0 时钟发生器不中断 PLL, PLL 继续输

11、出时钟1 时钟发生器切换到旁路模式,重新开始 PLL 锁相过程12 TEST 必须保持为 0117 PLL MULT 锁定模式下的 PLL 倍频值, 031(10100)65 PLL DIV 锁定模式下的 PLL 分频值, 03(01)4 PLL ENABLE使能或关闭 PLL0 关闭 PLL,进入旁路模式1 使能 PLL,进入锁定模式32 BYPASS DIV旁路下的分频值00 一分频01 二分频10 或 11 四分频1 BREAKLNPLL 失锁标志0 PLL 已经失锁1 锁定状态或有对 CLKMD 寄存器的写操作0 LOCK锁定模式标志0 时钟发生器处于旁路模式1 时钟发生器处于锁定模式

12、2. 定时器包括 4 个寄存器2.1 定时器预定标寄存器 PRSCMOV #0x0002,PORT(#PRSC0);0000 0000 0000 0010位 字 段 数 值 说 明1510 Rsvd 保留96 PSC 0hFh 预定标计数寄存器54 Rsvd 保留30 TDDR 0hFh 当 PSC 重新装入时,将 TDDR 的内容复制到 PSC 中2.2 主计数寄存器 TIMMOV #0x0000,PORT(#TIM0);0位 字 段 数 值 说 明150 TIM 0000hFFFFh 主计数寄存器2.3 主周期寄存器 PRDMOV #0x1fff,PORT(#PRD0);0001 1111

13、 1111 1111PRD0=0X1FFF;TDDR=0X0010;中断信号频率:内部时钟频率:400MTINT 频率=400M/(8M*5)=10hz;改变该寄存器的初始值,可以改变灯亮灭快慢。位 字 段 数 值 说 明150 PRD 0000hFFFFh 主周期寄存器。当 TIM 必须重新装入时,将 PRD 的内容复制到 TIM 中2.4 定时器控制寄存器 TCR设置定时器寄存器前,关闭定时器MOV #0x04f0,PORT(#TCR0);0000 0100 1111 0000设置完成后,开启定时器MOV #0x00e0,PORT(#TCR0);0000 0000 1110 0000具体配

14、置如下黑体部分:位 字 段 数 值 说 明15 IDLEEN 01定时器的 Idle 使能位。定时器不能进入 idle 状态如果 idle 状态寄存器中的 PERIS=1,定时器进入idle 状态14 INTEXT 01时钟源从内部切换到外部标志位定时器没有准备好使用外部时钟源定时器准备使用外部时钟源13 ERRTIM 01定时器错误标志没有监测到错误,或 ERRTIM 已被读取出错1211 FUNCFUNC=00bFUNC=01bFUNC=10bFUNC=11b定时器工作模式选择位TIN/TOUT 为高阻态,时钟源是内部 CPU 时钟TIN/TOUT 为定时器输出,时钟源是内部 CPU 时钟

15、TIN/TOUT 为通用输出,引脚电平反映的是DATOUT 位的值 TIN/TOUT 为定时器输入,时钟源是外部时钟10 TLB 01定时器装载位TIM、PSC 不重新装载将 PRD、TDDR 分别复制到 TIM、PSC 中9 SOFT 在调试中遇到断点时定时器的处理方法8 FREE76 PWID00011011定时器输出脉冲的宽度1 个 CPU 时钟周期2 个 CPU 时钟周期4 个 CPU 时钟周期8 个 CPU 时钟周期5 ARB 01自动重装控制位ARB 清 0每次 TIM 减为 0,PRD 装入 TIM 中,TDDR 装入 PSC 中4 TSS 01定时器停止状态位启动定时器停止定时

16、器3 C/P 01定时器输出时钟/脉冲模式选择输出脉冲。脉冲宽度由 PWID 定义,极性由POLAR 定义输出时钟。引脚上信号的占空比为 50%。2 POLAR 01时钟输出极性位正极性负极性1 DATOUT 01当 TIN/TOUT 作为通用输出引脚,该位控制引脚上的电平低电平高电平0 Rsvd 0保留3.中断相关寄存器 定时器中断属于可屏蔽中断需要设置以下寄存器:因为采用定时器 0 中断,中断向量地址 0x20h;5000 系列 dsp 的中断向量可以重新定位。但是它只能被重新定位 Page0 范围内的任何空间;(在 cmd 文件中给出)3.1 IVPD(dsp 向量的中断向量指针)3.2

17、 IVPH(主机向量的中断向量指针)3.3 IER0(中断使能寄存器)3.4 IEF0(中断标志寄存器)3.5 DBIER0(调试中断寄存器)汇编指令:位 /寄 存 器 描 述 INTM 中 断 模 式 位 。 该 位 全 局 使 能 /禁 止 可 屏 蔽 中 断 IER0和 IER1 中 断 使 能 寄 存 器 。 每 个 可 屏 蔽 中 断 , 都 在 这 两 个 寄 存 器 里 中 的 一 个 里 , 有 一 个 使能 位 DBIER0和IE1 调 试 中 断 使 能 寄 存 器 。 每 个 可 屏 蔽 中 断 , 都 可 以 用 这 两 个 寄 存 器 里 中 的 一 个 里 的一 个

18、 位 定 义 为 时 间 临 界 的 MOV #0x0d00,mmap(IVPD)MOV #0x0d00,mmap(IVPH)MOV #0x10,mmap(IER0) MOV #0x10,mmap(DBIER0) MOV #0xffff,mmap(IFR0) ;中断标志寄存器清零三 应用举例本实验要实现的功能是:在定时器中断到来时,改变实验板上led 灯的亮灭状态,同时,在中断服务程序中,设置了一个变量,可以控制亮灭的时间长短。实现过程:(1)对处理器及一些寄存器的初始化,包括时钟,定时器,中断等.def start.global ldbs.global ncountlbds .set 0x4

19、00001TIM0 .set 0x1000 PRD0 .set 0x1001 TCR0 .set 0x1002 PRSC0 .set 0x1003 CLKMD .set 0x1c00 ;时钟控制器地址;自定义 ncount .usect “vars“,1 .sect “TimerStart“start:;处理器初始化BCLR C54CMBCLR AR0LCBCLR AR1LCBCLR AR2LCBCLR C54CM.C54CM_offBCLR ARMS.ARMS_off ;ncount 初始化MOV #0,*(#ncount);灯亮 初始状态 AMAR *(#lbds),XAR3 MOV #0

20、,*AR3 BSET INTM ;Initialization of Interrupt MOV #0X0d00,mmap(IVPD)MOV #0x0d00,mmap(IVPH)MOV #0x0010,mmap(IER0) MOV #0x0010,mmap(DBIER0) MOV #0xffff,mmap(IFR0);Initialization of ClkMOV #0 5467h,PORT(#CLKMD) ;Initialization of Timer0MOV #0x04f0,PORT(#TCR0)MOV #0x0000,PORT(#TIM0)MOV #0x1fff,PORT(#PRD0

21、) MOV #0x0002,PORT(#PRSC0)MOV #0x00e0,PORT(#TCR0)loop: B loop.end(2)中断服务程序的编写。本实验只是简单地通过定时器定时长短来控制 led 灯的亮灭时间。在中断程序中主要完成对 led 等的控制,为了增加可视性,在中断程序中通过一个计数器来延长 led 的亮灭变化。具体程序编写如下:TINT0_Isr:;ncount+MOV *(#ncount),AR0ADD #1,AR0 ;nCount%=16MOV #16,AR1 ;改变该数,可以控制灯亮灭快慢RPT #(16-1) SUBC *AR1,AC0,AC0MOV HI(AC0)

22、,*AR3 ;AR3余数 BCC TINT0_Isr_end,AR3 = #0L1: BCLR INTM ;开中断 NOPRETI TINT0_Isr_end:AMAR *(#400001h),XAR3 XOR #1,*AR3 MOV #0,*(#ncount) ;商 B L1 (3)cmd 文件的编写,完成对目标存储器结构的定位和各控制段的构成和地址分配。本实验中 timer.cmd 文件具体安排如下:main.obj-o timer.out-m timer.mapMEMORYDARAM: o=0x100, l=0x07f00 /*On-chip DRAM*/SARAM: o=0x10000

23、, l=0x30000 /*On-chip SRAM*/VECT : o=0x0d000, l=0x100SECTIONS.vars : DARAM.vectors : VECT TimerInit : SARAMTimerStart : SARAM在上面介绍原理及寄存器时,已经把该程序的具体硬件结构和寄存器配置详细说明,在此就不在赘述。实验程序流程图如下:四 系统演示及调试4.1实验调试及结果 指示灯在定时器的定时中断中按照设计定时闪烁。通过改变ncount以及定时器的定时时间可以控制闪烁。 在对程序编译时,总出现“Remarks”错误,这是CCS中最轻级别的提示,不影响程序的正常运行。 在

24、汇编语言中写入.mmregs 语句后,就可以省去对存储器映射寄存器的定义,而且在 TI 的文档中也有寄存器名和对应地址的表,用的时候直接用即可。 出现如下错误:Illegal directive or mnemonic(非法指令) 汇编指令不能直接顶头写,需要与行首有一定间隔。 用途1:使用定时器和中断服务程序可以完成许多需要定时完成的任务,比如DSP 定时启动A/D 转换,日常生活中的计时器计数、空调的定时启动和关闭等。 用途2:在调试程序时,有时需要指示程序工作的状态,可以利用指示灯的闪烁来达到,指示灯灵活的闪烁方式可表达多种状态信息。4.2 对实验的扩展 SIN信号发生器的实现1)采用查

25、表法,从AD输出任意幅度,任意频率的正弦波与余弦波。在中断中,写查表变换函数:C程序如下:(中断服务程序)uiData = SIN_TableTable_Index; /读表uiData = uiData=256)Table_Index-=256; /索引溢出*P_INT_Clear = 0x0400; /清中断标志2)正弦表的产生 数的定标许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择。 在DSP 世界中,由于DSP芯片的限制,经常使用定点小数运算。所谓定点小数,实际上就是用整数来进行小数

26、运算。下面先介绍定点小数的一些理论知识,然后以C语言为例,介绍一下定点小数运算的方法。在TI C5000 DSP系列中使用16比特为最小的储存单位,所以我们就用16比特的整数来进行定点小数运算。 现在进入二进制。我们的定点小数用16位二进制表达,最高位是符号位,那么有效位就是15位。小数点之后可以有0 - 15位。我们把小数点之后有n位叫做Qn,例如小数点之后有12位叫做Q12格式的定点小数,而Q0就是我们所说的整数。 Q12 的正数的最大值是 0 111 . 111111111111,第一个0是符号位,后面的数都是1,那么这个数是十进制的多少呢,很好运算,就是 0x7fff / 212 =

27、7.999755859375。对于Qn格式的定点小数的表达的数值就它的整数值除以2n。在计算机中还是以整数来运算,我们把它想象成实际所表达的值的时候,进行这个运算。 反过来把一个实际所要表达的值x转换Qn型的定点小数的时候,就是x*2n了。例如 0.2的Q12型定点小数为:0.2*212 = 819.2,由于这个数要用整数储存,所以是819 即 0x0333。因为舍弃了小数部分,所以0x0333不是精确的0.2,实际上它是819/212 =0.199951171875。 下面是MATLAB产生cos表的过程: pi=3.1415926; aa=1:256; bb=cos(pi/256*aa);

28、 BB=1,bb; CC=BB*215;%共257个数据 Q150 50 100 150 200 250 300-4-3-2-101234x 104将MATLAB产生的数据导出,存放在SIN_Table中。3)DA转换原理利用专用的数模转换芯片,可以实现将数字信号转换成模拟量输出的功能。在ICETEKVC5509-A 板上,使用的是TLV7528 数模芯片,它可以实现同时转换四路模拟信号输出,并有10 位精度,转换时间0.1s。其控制方式较为简单:首先将需要转换的数值通过数据总线传送到TLV7528 上相应寄存器,再发送转换信号,经过一个时间延迟,转换后的模拟量就从TLV7528 输出引脚输出

29、。2TLV7528 与TMS320VC5509A 的连接:由于TMS320VC5509A DSP 没有数模转换输出设备,采用外扩数模转换芯片的方法。在ICETEKVC5509-A 板上选用的是TLV7528。TLV7528 的转换寄存器被映射到了DSP的I/O 空间,地址是0-3,控制转换由I/O 端口4 的写信号控制,这部分在硬件上由译码电路(GAL 芯片)完成。在TLV7528 的输出端,为了增加输出功率,经过一级运放再输出到板上插座上。4)汇编程序大致编写步骤如下:(1) 变量初始化.ref SIN_TableDA_DATA_1 .set 0x400006Table_Index .int

30、 1uiStep .int 1(2) 中断服务程序.sect “TimerInit“.ref index ;在 main 中定义,在该模块中使用的变量.def TINT0_Isr ;定义中断程序标识,方便其它模块(中断向量表)调用.ref COSOFF.ref uiStepTINT0_Isr:MOV *(#index),AR0 ;更新 indexADD #uiStep,AR0 MOV AR0,T0 AMAR *(#0x400006),XAR3 ;启动 da 转换MOV T0,*AR3 ;取表中数送到 da 口AND #0X100,AR3 ;判断索引溢出 BCC TINT0_Isr_end,AR3=#0 L1: BCLR INTM ;开中断 NOPRETI TINT0_Isr_end:MOV #0,*(#uiStep) ;索引溢出,清零 B L1 .end上述程序由于时间原因,暂时写到这里,在不断改进中。5)预期实验结果可通过示波器或模拟示波器观察:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报