ImageVerifierCode 换一换
格式:DOCX , 页数:31 ,大小:2.58MB ,
资源ID:7314662      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7314662.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(DSP实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

DSP实验报告.docx

1、DSP实验报告 实验一:CPU 定时器实验一:实验目的 1、熟悉 F2812 的 CPU 定时器; 2、掌握 F2812 的 CPU 定时器的控制方法;3、学会使用 CPU 定时器中断方式控制程序流程。二:实验设备计算机,CCS 3.1 版软件,DSP 硬件仿真器,E300 实验箱,2812CPU 板。三:实验原理样例实验是采用 CPU 定时器来定时使 LED 亮灭的。F2812 的 CPU 定时器不同于事件管理器模块(EVA、EVB)中的通用定时器(GP)。F2812 的 CPU共有三个定时器,其中,CPU 定时器 1 和 2 被保留用作实时操作系统 OS(例如 DSPBIOS),CPU 定

2、时器0 可以供用户使用。 定时器的一般操作如下:将周期寄存器 PRDH:PRD 中的值装入 32 为计数器寄存器 TIMH:TIM。然后计数器寄存器以 F281x 的 SYSCLKOUT 速率递减。当计数器减到 0 时,就会产生一个定时器中断输出信号(一个中断脉冲)。下图为 CPU 定时器的内部结构: 四:实验步骤 1 、 F2812CPU 板的 JUMP1 的 1 和 2 脚短接,拨码开关 SW1 的第二位置 ON;其余置 OFF。 2 、 E300 底板的开关 SW4 的第 2 位置 ON,其余位置 OFF。其余开关设置为 OFF。 3 、 运行 CCS 软件,调入样例程序,装载并运行;(

3、进入 CCS 界面后需要点“Debug-Connect”)4 、 加载“. e300_03_cpu_timerDebugExample_281x_cpu_timer.out”;5 、 单击“Debug Animate”运行,可观察到灯 LED1LED8 的变化规律:6 、单击“Debug Halt”,暂停程序运行,LED 灯停止闪烁;单击“Debug Run”,运行程序,LED 灯又开始按上述规律变化;五:实验程序及结果修改后程序如下:/*;*;* 北京达盛科技有限公司;* 研 发 部;*;* ;*/*- 文件信息 - ;* ;* 文件名称 : Example_DSP281x_e300_swi

4、tch.c ;* 适用平台 : DSP E300 实验箱;;* CPU类型 : DSP TMS320F2812 ;* 软件环境 : CCS3.1 ;* 试验接线 : 1、F2812CPU板上: JUMP1的1和2脚短接, 拨码开关SW1的第二位置ON;* 2、E300底板的开关SW4的第2位置ON,其余置OFF。;* 试验现象 : 设置好CCS的环境,打开本工程,编译、下载、运行。; 观察LED1LED8灯亮灭的变化。;* 地址译码说明:基地址:0x2000,当底板片选CS1为低时,分配有效。;* CPU的数据空间: 基地址+0x2200 拨码开关 input 8位;* CPU的数据空间: 基

5、地址+0x2200 LED灯 output 8位*/ /*头文件*/#include DSP281x_Device.h / DSP281x Headerfile Include File#include DSP281x_Examples.h / DSP281x Examples Include File/*定义函数说明*/ Prototype statements for functions found within this file.interrupt void cpu_timer0_isr(void);void ConfigCpuTimer(struct CPUTIMER_VARS *T

6、imer, float Freq, float Period);/*主程序*/void main(void)/ PLL, WatchDog, enable Peripheral Clocks/ This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl();/ Disable CPU interrupts DINT;/ Initialize the PIE control registers to their default state. InitPieCtrl(); / Disable CPU inter

7、rupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;/ Initialize the PIE vector table with pointers to the shell Interrupt / Service Routines (ISR). InitPieVectTable();/ Interrupts that are used in this example are re-mapped to/ ISR functions found within this file. EALLOW; / This is

8、 needed to write to EALLOW protected registers PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; / This is needed to disable write to EALLOW protected registers InitCpuTimers(); / For this example, only initialize the Cpu Timers/ Configure CPU-Timer 0 to interrupt every second:/ 100MHz CPU Freq, 1 second

9、Period (in uSeconds) ConfigCpuTimer(&CpuTimer0, 100, 1000000); StartCpuTimer0();/ Enable CPU INT1 which is connected to CPU-Timer 0: IER |= M_INT1;/ Enable TINT0 in the PIE: Group 1 interrupt 7 PieCtrlRegs.PIEIER1.bit.INTx7 = 1;/ Enable global Interrupts and higher priority real-time debug events: E

10、INT; / Enable Global interrupt INTM ERTM; / Enable Global realtime interrupt DBGM/ IDLE loop. Just sit and loop forever (optional): for(;) if(CpuTimer0.InterruptCount1) asm( nop ); asm( nop ); *(int *)0x2200=0x00FE; else if(CpuTimer0.InterruptCount2) asm( nop ); asm( nop ); *(int *)0x2200=0x00FD; el

11、se if(CpuTimer0.InterruptCount3) asm( nop ); asm( nop ); *(int *)0x2200=0x00FB; else if(CpuTimer0.InterruptCount4) asm( nop ); asm( nop ); *(int *)0x2200=0x00F7; else if(CpuTimer0.InterruptCount5) asm( nop ); asm( nop ); *(int *)0x2200=0x00EF; else if(CpuTimer0.InterruptCount6) asm( nop ); asm( nop

12、); *(int *)0x2200=0x00DF; else if(CpuTimer0.InterruptCount7) asm( nop ); asm( nop ); *(int *)0x2200=0x00BF; else CpuTimer0.InterruptCount = 0; interrupt void cpu_timer0_isr(void) CpuTimer0.InterruptCount+; / Acknowledge this interrupt to receive more interrupts from group 1 PieCtrlRegs.PIEACK.all =

13、PIEACK_GROUP1;/=/ No more./=实验图像如下图:六:总结在实验过程中,我发现只需要改动其中部分程序即可实现要求,如:其中0x2200=0x00*是按照十六进制进行控制的,0为亮灯,1为灭灯,间隔一段时间会使亮灯的状态发生改变,一个周期结束后又重新开始循环,在上面的类似几条语句中,可以根据自己的喜好进行设置,使亮灯的效果发生改变。 实验二:外部中断实验一:实验目的 1. 掌握中断技术,学会外部中断的处理方法2. 掌握中断对程序的流程控制,理解 DSP 对中断的响应时序二:实验设备计算机,CCS3.1 版本软件,DSP 仿真器,E300 实验箱,2812CPU 板(新的)三

14、:实验原理 1. 中断在 F2812 中的应用原理介绍:( 更加详细的内容请参看 F2812 的数据手册 )中断在 F2812 中有内部中断源和外部中断源,内部中断源包括一些片上外设产生的中断和软件产生的中断。外部中断源包括经由外部中断引脚产生的中断。1) 在 F2812 中,中断有两种分类方法:第一种是按照是否可屏蔽, 第二种是按照中断产生方式。 a) 按照是否可屏蔽分类,分为可屏蔽和不可屏蔽。 所谓屏蔽是指 DSP 可以接受这个中断,但是却不作任何反映,也就是说对应的中 断服务指令被屏蔽了,从而得不到执行,这种中断就叫做可屏蔽中断,相反的,如果一个中断只要产生,那么就必须有中断服务指令相应

15、,这种中断叫做不可屏蔽中断。 b) 按照中断产生的方式可以分为软件中断和硬件中断。软件中断是指由指令产生的中断,硬件中断是指由外部中断源产生或者片上外设产生。 c) 这两种分类方法之间有一定的联系,具体如下: 第一:凡是软件中断必定是不可以屏蔽的。原因很简单,软件中断是由软件产生,假如你想屏蔽它,那么干脆就别写这条指令,因此完全没有必要为软件中断设置是否可屏蔽机制。 第二:硬件中断中有一些是可以屏蔽的,有一些不能屏蔽。软件设计人员一般比较喜欢从可屏蔽性去考虑中断,而硬件设计人员喜欢从产生方式去考虑中断。在以下的讨论中,我们以2812 为例,介绍中断的相关细节内容。 我们首先从应用的角度提出一个

16、简单的问题如下:当用户按下一个按键,产生一个中断,那么 DSP 是如何跳转到相应的中断服务指令,执行完中断服务指令以后,它又是如何返回正常的程序执行呢? 2) 简单的讲,DSP 的中断控制器发现一个中断以后,它就会把下一个将要执行的指令地址保存起来,然后跳到中断服务指令处执行,执行完以后,再把刚才保存的地址重新装入执行寄存器,然后正常执行。 那么,DSP 是如何知道服务指令在哪里放着呢?这就要从 DSP 的中断实现机制来讲。F2812 使用了一个叫做中断向量表的结构,里面保存着不同中断的服务指令入口地址。下表是 F2812 的中断向量表组织结构。 在该表中,编号越低,优先级越高。硬件中断中,用

17、户可以自定义仅有 PDPINTA/B,INT1:2,其它的硬件中断都已经指定给了 DSP 的片上外设,比如编号为 INT5.1 的中断,T4PINT,它是片上定时器中断或者软件中断,当片上定时器 4 到计数点后,就会产生一个中断,相应就会执行这个地址里面的东西。 仅有中断向量表,DSP 似乎还是不能够找到中断服务指令的地址。事实上,DSP 内部有一个中断控制器,它能够识别每一个编号的中断,所以一旦中断发生后,中断控制器就可以根据编号在相应的中断向量表里面找中断服务指令的地址。 3) 现在大家比较清楚了上面我们提出问题的答案了。更进一步讲,系统对中断的处理不是这么简单,因为,系统里面有套中断处理

18、机制,必须判别中断是否已经被屏蔽,如果屏蔽,那么就不会得到响应。在处理中断时,系统使用了两个主要的寄存器,中断标志寄存器(IFR),中断屏蔽寄存器(IMR)。对于非可屏蔽中断和复位信号,系统直接相应,没有什么判断处理,也就不设计这两个寄存器。IFR 的位描述如下图所示。这个寄存器的每一位对应一个中断,相应的中断发生后,这个位就会被置位。显然,这里面没有 NMI 和 RESET 对应的标志位。IER 的位描述如下图所示:和 IFR 是一一对应的。IER 的值完全由程序员控制,假如你想屏蔽掉某个中断,那么你就需要对 IMR 的相应中断位置位。对于可屏蔽中断的处理过程如下图所示:中断源产生一个中断请

19、求,在这个过程中,如果是可屏蔽中断,那么它必定在 IFR 里占一席之地,此时对 IFR 相应的位置位。如果是不可屏蔽中断,直接进入中断服务程序。中断服务程序要做的事情后面会讲到。如果是可屏蔽的,那么接下来下来系统要确认是否可以执行。如下图。 在这个阶段,系统会检查如下条件:第一:检查所有同时发生的中断的优先级,高优先级首先得到相应。第二:检查 ST1 中的中断模式位(INTM),如果该位为 1,所有中断全部被屏蔽。INTM 是一种快速屏蔽所有可屏蔽中断的方法。第三:检查 IER 中相应中断的屏蔽位,如果置位,则不能得到执行。如果以上三条检查都通过,那么系统进入中断服务程序。具体内容如下。第一:

20、把程序计数器(PC)压栈。第二:把相应中断向量的地址装入程序计数器(PC)。第三:从中断向量地址中取到跳转指令,同时对相应中断的 IFR 位清零,执行跳转指令。第四:执行中断服务指令直到一个返回语句。第五:正常返回,把栈里的内容弹出重新装入 PC。第六:继续执行正常指令。 需要注意一点,对于不可屏蔽中断在中断服务程序执行过程中,系统要检查是不是 RESET,NMI 或者 INTR 软件中断,如果是这几个中的任何一个,系统都要立即屏蔽所有可屏蔽中断,然后再继续执行。 在系统设计中要注意,有几种情况可以让程序跑飞。在程序设计中要用编程策略保证正确的程序执行顺序。第一种:如果中断服务指令的执行时间大

21、于同一中断的最小发生周期,而在中断服务指令执行的过程中,所有中断都没有屏蔽。在这种情况下,一个中断服务指令还没有执行完而又新到达了一个中断,而新的中断又得到执行的允许,这种情况会使程序执行错误。第二种:如果同时发生的中断数超过一个固定的值,那么,就会有中断丢失。第三种:如果发生了中断,而被屏蔽掉了,那么 IFR 种的相应中断位将不会清零,这对于后来的中断处理有影响吗?整个中断执行的流图如下。4) 明确了这些问题,那么就可以自由使用中断。 F2812 支持 3 个外部可屏蔽中断,即 XINT1、XINT2、XINT13。XINT13 和一个非屏蔽中断 XNMI复用。这些外部中断中的每一个可以选择

22、下降沿或上升沿触发,还可以使能或不使能(包括 XNMI)。可屏蔽中断还包括一个 16 位自由运行的增计数器,当一个有效的中断边沿被检测到时,复位成 0。本计数器用于给中断提供一个精确的时间标记。 下面给出的是外部中断 2 控制寄存器各位的定义: F2812DSP 的中断为低电平边沿触发。按键盘时,键盘产生的低电平脉冲,通过 CPLD 分配给 F2812 的XINT2 引脚,每按一次,产生一个低电平脉冲,用来控制实验箱上 LED 灯的亮灭。2. 实验流程框图 如下: 四:实验步骤 1. 2812CPU 板 JUMP1 的 1 和 2 脚短接,拨码开关 SW1 的第二位置 ON; 2. E300

23、板上的开关 SW4 的第二位置 ON,其余 OFF;SW5 开关全部置 ON;其余开关全部置 OFF。 3. 运行 Code Composer Studio (CCS)(ccs3.1 需要“DEBUGConnect” ) 4. 打开系统项目文件 e300.test normal DSP281x_examples e300_05_int e300_int.pjt; 5. 编译全部文件并装载 DebugExample_281x_int.out; 6. 单击“DebugGo Main”跳到主程序的开始; 7. 单击“DebugRUN”运行程序。 8. 点击 E300 底板上的任意键盘,观察 LED

24、灯的变化情:每按一次 “键盘”按键,LED1-LED8 奇偶数灯亮灭就变化一次. 9. 单击“DebugHalt”暂停程序运行,反复按 “键盘”按键,LED1-LED8 灯亮灭不变化. 10. 关闭所有窗口,本实验完毕.五:实验程序及结果 修改后实验程序如下:/*;*;* 北京达盛科技有限公司;* 研 发 部;*;* ;*/*- 文件信息 - ;* ;* 文件名称 : Example_DSP281x_int.c ;* 适用平台 : DSP E300 实验箱;;* CPU类型 : DSP TMS320F2812 ;* 软件环境 : CCS3.1 ;* 试验接线 : 1、F2812CPU板的JUM

25、P1的1和2脚短接,拨码开关SW1的第二位置ON;* 2、E300底板的开关SW4的第2位置ON,其余置OFF。;* 3.将LED1-LED8全部拨到靠近键盘的位置,以便于LED灯能够正确指示到中断信息;* 试验现象 : 设置好CCS的环境,打开本工程,编译、下载、运行。;* 观察LED1LED8灯亮灭的变化。;* 地址译码说明:基地址:0x2000,当底板片选CS1为低时,分配有效。;* CPU的数据空间: 基地址+0x0200 拨码开关 input 8位;* CPU的数据空间: 基地址+0x0200 LED灯 output 8位;* 外部中断用XINT2,由CPLD分配,中断信号由键盘按键

26、产生。;* 中断下降沿触发。*/ /*头文件*/#include DSP281x_Device.h / DSP281x Headerfile Include File#include DSP281x_Examples.h / DSP281x Examples Include FileUint16 show=0x00aa; /定义欲显示值Uint32 Xint1InterruptCount;/*主程序*/void init_xint2(void);interrupt void xint2_isr();void main(void) / PLL, WatchDog, enable Peripher

27、al Clocks/ This example function is found in the DSP281x_SysCtrl.c file. InitSysCtrl(); / Disable CPU interrupts DINT;/ Initialize PIE control registers to their default state./ The default state is all PIE interrupts disabled and flags/ are cleared. InitPieCtrl(); / Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000;/ Initialize the PIE vector table with pointers to the shell Interrupt / Service Routines (ISR). InitPieVectTable(); EALLOW; / This is needed to write to EALLOW protected registers PieVectTable.XINT2 = &xint2_isr; EDIS; init_xint2(); /

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1