学院:电子工程学院
学号:1202121013
姓名:赵海霞
指导教师:苏涛
DSP 实验课大作业设计
一 实验目的
在DSP 上实现线性调频信号的脉冲压缩、动目标显示(MTI )和动目标检测(MTD),并将结果与MATLAB 上的结果进行误差仿真。
二 实验内容
2.1 MATLAB 仿真
设定带宽、脉宽、采样率、脉冲重复频率,用MATLAB 产生16个脉冲的LFM ,每个脉冲有4个目标(静止,低速,高速),依次做
2.1.1 脉压
2.1.2 相邻2脉冲做MTI ,产生15个脉冲
2.1.3 16个脉冲到齐后,做MTD ,输出16个多普勒通道 2.2 DSP 实现
将MATLAB 产生的信号,在visual dsp 中做脉压,MTI 、MTD ,并将结果与MATLAB 作比较。
三 实验原理
3.1 线性调频
线性调频脉冲压缩体制的发射信号其载频在脉冲宽度内按线性规律变化即用对载频进行调制(线性调频)的方法展宽发射信号的频谱,在大时宽的前提下扩展了信号的带宽。
若线性调频信号中心频率为0f ,脉宽为τ,带宽为B ,幅度为A ,μ为调频斜率,则其表达式如下:
]2
1
2cos[)()(20t t f t rect A t x μπτ+??=;)(为矩形函数rect
在相参雷达中,线性调频信号可以用复数形式表示,即
)]2
1
2(exp[)()(20t t f j t rect A t x μπτ+??=
在脉冲宽度内,信号的角频率由220μτπ-f 变化到2
20μτ
π+f 。
3.2 脉冲压缩原理
脉冲雷达信号发射时,脉冲宽度τ决定着雷达的发射能量,发射能量越大,
作用距离越远;在传统的脉冲雷达信号中,脉冲宽度同时还决定着信号的频率宽度B ,即带宽与时宽是一种近似倒数的关系。脉冲越宽,频域带宽越窄,距离分辨率越低。
脉冲压缩的主要目的是为了解决信号的作用距离和信号的距离分辨率之间的矛盾。为了提高信号的作用距离,我们就需要提高信号的发射功率,因此,必须提高发射信号的脉冲宽度,而为了提高信号的距离分辨率,又要求降低信号的脉冲宽度。
脉冲压缩网络实际上就是一个匹配滤波器网络,在接收机中设置一个与发射信号频率相匹配的压缩网络,使经过调制的宽脉冲的发射信号变成窄脉冲,因此保持了良好的距离分辨力。根据匹配滤波理论,脉压可以在频域与时域中进行。 频域脉压即对回波信号进行FFT 变换,在频域中实现回波信号与脉压系数相乘,最后将结果进行IFFT 转换为时域信号。
时域脉压即直接对将回波信号与脉压信号进行线性卷积,去掉暂态点后的数据就是脉压的结果。
()00()()*()s t s t h t KR t t ==-
3.3 MTI (动目标显示)原理
动目标显示(MTI )本质含义是:基于回波多普勒信道的提取而区分运动目标和固定目标(包括低速运动的杂波等)。从应用上讲,该技术是利用MTI 滤波器滤除相应杂波,从而提高目标检测性能。
雷达辐射的高频脉冲能量被各种地形地物等固定物体和飞机等运动物体反射时,由于前者回波信号相对于发射信号的相位差是固定的,而后者的回波信号相对于发射信号的相位差是变化的,于是经相位检波后,固定目标视频信号的幅度不变,而运动目标视频信号的幅度按多普勒频率的余弦关系变化,把视频信号延时一个重复周期后,和未延时信号加以对消,就可以消除固定目标而只选择运动目标。因此,若将同一距离单元在相邻重复周期内的相检输出作相减运算,则固定目标的回波将被完全对消,慢速杂波也将得到很大程度衰减,只有运动目标回波得以保留。显然这样便可将固定目标,慢速杂波与运动目标区别开来,这就是动目标显示(MTI )的基本原理。
最常用的MTI 滤波器是抑制地物杂波的滤波器。因为地物杂波多普勒频移为零或很小,主要集中在0频附近。在频率为0处,滤波器频率响应应有凹口。所以地物杂波在通过MTI 滤波器后将受到很大的抑制。零频杂波(地杂波)的MTI 滤波器应在零频及其周期出现点处形成凹口。最常用的零频MTI 滤波器是二项式滤波器,其中最为典型的是一次和二次相消器。
一次相消器(二脉冲对消)输入数据是一个基带复数样本,这些是同一个距离单元由顺序脉冲返回的,形成一个有效的采样间隔PRF T 1=的离散时间序列)(n x 。其时域方程为:)1()()(--=n x n x n y ,传输函数为:11)(--=z z H ,它是一个单零点系统,零点的位置在1=z ,频率响应为:
)2
cos 2(sin 2sin 21)(T
j T T e e H t j j ωωωωω+=-=-。其在零频有一凹口,可用来抑制
噪声,但同时把静态目标也给对消掉,因此用MTI 一次相消器检测不出静目标。
3.4 MTD (动目标检测)原理
仅对雷达回波信号进行动目标显示(MTI )是不够的,气象杂波(如云雨等)
和箔条杂波受气流和风力的影响,会相对雷达而动,其频谱中心不是固定在0频附近,而是在某个频率区间内变化的, 抑制此类杂波用普通的MTI 滤波器是不行的,而MTD 滤波器则可以抑制此类杂波。如图1所示:
图1 动目标显示滤波器和多普勒滤波器组的特性 根据最佳线性滤波理论,在杂波背景下检测运动目标回波,除了杂波抑制滤波器外,还应串接有对脉冲串信号匹配的滤波器。实际工作中,采用一组相邻且部分重叠的滤波器组覆盖整个多普勒频率范围,这就是窄带多普勒滤波器组。N 个相邻的多普勒滤波器组的实现是由N 个输出的横向滤波器(N 个脉冲和N-1根迟延线)经过各脉冲不同的加权并求和后形成的。该滤波器的频率覆盖范围为0到r f ,r f 为雷达工作重复频率。MTD 就是用窄带多普勒滤波器组实现脉冲串信号匹配的一种技术。下图给出MTD 的实现方法。
图2 横向滤波器
横向滤波器有N-1根延迟线,每根延迟线的延迟时间为r T ,设加在第k 个横向滤波器的第i 个抽头的加权值为
2/,,0,1,...,1j ki N i k W e i N π-==-
假设输入序列为()0,1,,1x n i i N -=-,第k 个横向滤波器完成的运算
是
11
2/,0
()()()N N j ki N i k i i y k W x n i x n i e π---===-=-∑∑
上式就是DFT 的表述式,当N 是2的乘方的时候,便可以使用FFT 算法来快速实现。用FFT 实现N 个滤波器组,FFT 算法运算量大约在2(/2)log N N 个乘
法,而使用横向滤波器N 组横向抽头的分别加权的方法,需要()2
1N -次乘法,在N 比较大时,可以明显节省运算量。
利用MTD 可分辨不同速度的目标,其速度分辨力为
/2d v f λ?=?
其中1/d r f NT ?=为多普勒频率分辨力。
若信号的多普勒频率满足:d r d f nf f =+?,其中1n ≥,0d r f f <则会出现多普勒频率模糊现象,即速度模糊。
四 实验步骤
以下是该实验中设定的几个参数
BandWidth=2.0e6----------------------------------------------带宽 TimeWidth=42.0e-6--------------------------------------------脉宽 Fs=2.0e6---------------------------------------------------采样率 PRT=240e-6-------------------------------------------脉冲重复周期 TargetDistance=[3000 8025 8025 11600]-------------------目标距离 TargetVelocity=[50 0 -120 213]---------------------------目标速度 假设接收到的回波数是16个,噪声为高斯随机噪声。
4.1 在MATLAB 中产生线性调频信号。
4.2 根据目标距离得出目标回波在时域的延迟量,根据目标速度得出多普勒相移,从而在MATLAB 中产生4个目标的16个回波串(接收到的回波含噪声)。
4.3 由匹配滤波理论产生对应于目标回波的滤波系数(脉压系数),在时域中做线性卷积,实现匹配滤波(时域脉压);在频域中做回波信号和脉压系数的FFT ,点乘后作逆FFT ,实现频域脉压。两者进行比较,讨论其差别。
4.4 对16个去暂态点后的脉冲串按接收顺序进行排列,用一次相消器(一种滤波方式)实现MTI 。
4.5 做16通道的FFT ,实现MTD 。
4.6 在DSP 中对MATLAB 产生的回波数据和脉压系数进行处理,实现频域脉压。导入DSP 的回波数据为时域数据,而脉压系数为频域数据。将导入DSP 的时域回波数据进行一次FFT 变换到频域,然后将其与频域脉压系数进行点积,得到频域脉压结果。对该结果再做一次逆FFT ,将频域转换成时域。在这一步中需要调用库函数fft_flp32.asm 。该子程序可实现8192点复数的FFT 功能。由于C 语言中无法实现复数运算,因此,对8192个复数按照实部虚部交替的顺序进行重排列,用长度为16384的数组来存放时域回波数据。频域相乘后,做乘积结果的逆FFT ,得到脉压结果。做逆FFT ,仍需调用库函数fft_flp32.asm ,此时要通过FFT 子程序实现逆FFT 的功能,要对频域的数据进行处理,才能达到这一目的。
4.7 对脉压后的数据按照脉冲号重排,相邻序列的数据相减(滑动对消),实现MTI 。
4.8 调用子程序fft_16.asm ,做16通道FFT ,实现MTD 。入口参数为16通
道的脉压数据。
五 实验结果及讨论
5.1 脉压、MTI 、MTD 结果分析: 5.1.1 脉压结果及其分析:
1000
2000
3000
4000
5000
6000
7000
8000
-4-2024总回波信号的实部,闭锁期为0
010002000300040005000600070008000
50
100
150X: 124Y: 41.51
时域脉压结果的幅度,有暂态点
X: 191Y: 120.7
X: 238Y: 81.91X: 2591Y: 56.05
X: 2044Y: 39.84
X: 2638Y: 83.72
由于雷达在发射时不能接收,故最大无遮挡距离(闭锁期)为:
863*10*42*10630022
c R m τ-===,而第一个目标的距离为3000m ,因此在
闭锁区内,被遮挡一部分,所以在目标功率相同的情况下,第一个目标的回波功率明显小于另两个,第一个脉冲的幅度远小于另二个脉冲的幅度。
第二个脉冲的幅度一直在变化,是因为第二个脉冲是两个在同一个距离门的两个回波信号的矢量叠加。第二个脉冲为功率为1的定目标与功率为0.25多普勒频移为雷达发射频率的0.25倍的运动信号的叠加,所以可以看到第二个脉冲的幅度以雷达发射周期的四倍为周期变化。
01000
20003000400050006000700080009000
50
100
150
X: 124Y: 41.51
频域脉压结果的幅度,有
前暂态点和后暂态点
X: 191Y: 120.7
X: 238Y: 81.91
X: 2044Y: 39.84
X: 2111Y: 80.61
010002000300040005000600070008000
0.5
1
x 10
-13
红色为时域频域脉压的差别
从图中可以看出,时频域脉压结果差别很小,相对误差停留在1013-量级上。理论上两者计算结果应该是一样的,之所以存在误差主要是由于Visual DSP 和MATLAB 两种处理工具的精度不同也导致误差出现。
5.1.2 MTI 结果及其分析
100
200
300
400
500
5
10
15
050
100
150
200
MTI result
X: 155Y: 11Z: 165.9
X: 108Y: 11Z: 67.89X: 41Y: 10Z: 31.07
雷达的距离分辨力为8
6
3*107522*2*10c R m B ?===。以第一个目标为例,对应的
横坐标为41,由于MATLAB 的坐标是从1开始的,因此,第一个目标对应的距离为(411)*3000R m -?=
图中一个脉冲第一个是速度50,功率是1,但是第一个脉冲有一部分功率损失在闭锁期了,故幅度较小;第二个目标被对消,因为第二个目标的速度为零,而其它目标的相减结果不为零,这是因为运动目标回波信号是以普勒频率为频率的余弦信号,因此相同功率下速度大的目标在MTI 处理后的结果幅度较大。第三个是速度120,功率是0.25;第四个是学号产生的速度213,功率是1。因此,第四个脉冲的幅度最大,其次是第三个脉冲,其次是第一脉冲。 5.1.3 MTD 结果及其分析
100
200
300
400
500
-10
-5
5
10
0500
1000
1500
X: 154Y: -7Z: 947.5
MTD result
X: 107Y: -5Z: 635.8
X: 107Y: 0Z: 1326
X: 40Y: 2
Z: 641.4
X 轴代表多普勒通道,Y 轴代表距离单元,Z 轴代表做MTD 后的幅度信息。 由图可算出各目标速度,以第一个目标为例:对应的纵坐标为2,在第二个多普勒通道上,而每个多普勒通道代表的速度是24.888,因此,第一个目标对应的速度为:2*24.88=49.76。第四个目标产生了速度模糊。这是由于其速度为213,大于临界速度199,故产生速度模糊
5.2 模糊分析,改变重频
因为窄带多普勒滤波器组的频率覆盖范围为0到r f ,所以当d r f f >时,将产
生速度模糊,对应的多普勒通道将和多普勒频移为()d r f f -对应的多普勒通道相
同,因此分辨不清目标的真实速度。这时,只要将PRF 变大,由/2d v f λ?=? 其中1/d r f NT ?=为多普勒频率分辨力,即可计算出合适的PRF 。经计算,只需将雷达脉冲重复周期PRT 由240改为196即可解除模糊。 5.3 DSP 结果与Matlab 结果对比,误差分析。
5.3.1 MATLAB 和DSP 脉冲压缩的结果分别如下图所示
010002000300040005000600070008000
50100
150dsp frequence press result X: 108Y: 120.7
X: 41Y: 41.51
X: 155Y: 81.91
X: 521Y: 38.71
X: 1068Y: 78.03
010002000300040005000600070008000
50
100
150X: 108Y: 120.7
matlab frequence press result X: 41Y: 41.51
X: 155Y: 81.91
X: 635Y: 83.9X: 2028Y: 80.61
X: 2508Y: 56.05
020*******
50
100
150
X: 108Y: 120.7
matlab frequence press result X: 41Y: 41.51
X: 155
Y: 81.91
200400600
50
100
150X: 41Y: 41.51
dsp frequence press result
200
400
600
024
68
x 10
-6
abs error
020*******
2
468x 10
-8
compare error
由上图可知,DSP 和MATLAB 脉压结果基本一样。DSP 和MA TLAB 的脉冲压缩结果的误差(绝对值)数量级为610-,脉冲压缩相对误差的数量级为810-,结果是正确的,且满足精度要求
5.1.2 MATLAB 和DSP 做MTI 的结果分别如下图所示
200
400
600
5
10
15
050100
150200
dsp MTI result
X: 108Y: 5
Z: 68.77
X: 155Y: 7
Z: 163.4
X: 41Y: 14Z: 30.16
200
400
600
5
10
15
050
100
150
200
X: 108Y: 3
Z: 70.22
matlab MTI result
X: 155Y: 12Z: 165
X: 41Y: 12Z: 30.23
200
400
600
5
10
15
00.5
1
1.5
2
x 10-5
mti abs error
200
400
600
5
10
15
00.5
1
1.5
x 10-7
mti compare error
由图可知,MATLAB 和DSP 做MTI 的结果基本一致DSP 做MTI 结果的误差(绝对值)数量级为510-,误差(相对值)数量级为710-,可见DSP 做MTI 的结果是正确的,且满足精度要求。
5.1.3 MATLAB 和DSP 做MTD 的结果如下图所示
200
400
600
-10
10
05001000
1500
X: 154Y: -7Z: 947.5
dsp MTD result
X: 305
Y: 4
Z: 4.505
X: 107Y: 0
Z: 1326
X: 40Y: 2
Z: 641.40
200
400
600
-10
10
05001000
1500X: 154Y: -7Z: 947.5
matlab MTD result
X: 329Y: 6
Z: 3.292
X: 107Y: 0
Z: 1326
X: 40Y: 2
Z: 641.4
200
400
600
10
20
0.20.40.6
0.8
1x 10
-4
mtd abs error
200
400
600
010
20
02
4
6
8
x 10-8
mtd compare error
MTD 绝对误差在数量级410-上,相对误差在810-数量级上。
MATLAB 和DSP 的MTD 结果稍有差别是由于两种工具处理数据的精度不一样,MATLAB 用CPU 处理数据,DSP 则用DSP 核处理数据。
六 实验思考题及心得
6.1 MTI 结果中看不到静止目标
从时域角度分析,静止目标在任何时刻产生的多普勒相移都是一样的,用脉压串进行相减,自然会消掉静止目标;从频域角度来看,一次相消器会抑制零频响应,而静态目标频率为0,所以经MTI 滤波后会消失。所以MTI 结果中看不到静止目标。
6.2 速度模糊
由于多普勒相移以π2产生周期变化,所以由于雷达发射脉冲串频率较低,间隔较大而测得的同一目标相移变化超过π2时,雷达无法通过目标回波的相移计算准确的目标多普勒速度,产生的速度不定性称作速度模糊。根据多普勒速度
与相移关系可算得试验中雷达可测的有效的最大速度为2
λ
r f =RF PRT c ?2≈398
米/秒<400米/秒,将程序中第四个目标速度设置为400米/秒,则在MTI 动目标显示图中,没有该目标,就是产生了速度模糊,而且目标在两个目标回波中产生的相移正好为π2的倍数,则使得雷达误认为该目标为静止目标。
6.3 MTD 速度/多普勒通道的含义
MTD 的核心是线性MTI 加窄带多普勒滤波器组,对雷达回波的处理包括杂波处理和脉冲串信号匹配。MTI 实现的功能即是使杂波得到抑制而让各种速度的运动目标信号通过,而MTD 滤波器则要实现回波脉冲串的相位特性相参积累。而此滤波器应为梳齿行滤波器,齿的间隔为脉冲重复频率,齿的位置取决于回波信号的多普勒频移。实际情况中,多普勒频移不能预知,因此采用一组相邻且部分重叠的滤波器组,覆盖整个多普勒频率范围,这就是窄带多普勒滤波器组,多普勒通道数目即为该窄带多普勒滤波器组数目。实现的功能即是实现回波信号的相参积累,进一步滤除气象杂波等MTI 滤波器不能消除的杂波部分。 实验心得
通过这次试验,我对雷达信号处理的基本过程和相关理论以及线性调频,匹配滤波,MTI ,MTD ,多普勒频移,快、慢时间采样有了一定程度的理解。对FFT ,采样,频谱泄露等数字信号处理技术有了更感性的认识,收获颇丰。最后非常感谢老师在实验中的耐心指导,让我顺利完成每个实验,充实度过每个实验课。
大作业提示:
在DSP 环境下编程实现对回波信号的脉压,MTI 和MTD 处理。 MATLAB 程序内容:
提供了脉压,MTI ,MTD 的实现方法,同时生成数据文件以供DSP 程序中使用。 流程说明:
做脉压处理时,导入DSP 的回波数据应为时域数据,脉压系数为频域数据。这些数据是在MA TLAB 程序中生成的。在DSP 中,对回波数据进行FFT 处理将其变换到频域后,将其与频域系数进行点积,对点乘结果再做一次逆FFT ,将频域结果转换到时域,在这一步中需要调用函数fft_flp32.asm ,其功能是实现输入数据的FFT 变换。这里要求同学们利用FFT 程序实现IFFT 的功能。具体方法请大家自己查找。这个库函数的入口参数包括(输入数据,缓存区1,缓存区2,输出结果)(说明:原库函数中的入口参数比是6个而不是现在的四个,为了方便同学们调用,所以库函数调用的时候稍做了修改,希望你们以后再调库函数的时候注意)。所谓缓存就是在程序中再开辟一个存储空间,和输入数据的大小一样。所需的程序和旋转因子表都和这个文档放在同一个文件夹内了。
在做MTD 的时候调用的函数是fft_16.asm 。
程序中的参数由个人学号末三位来定,具体说明见matlab 程序注释。可以自由改变参数,观察结果有何不同。
本实验雷达的距离分辨率为m F c
ct R s
s 7522===
δ 该雷达的多普勒分辨率为Hz
N f f r 42.260==δ
对应的径向速度为:s
m 88.242
)
(=?=f v δλδ 在MATLAB 中通过fftshift 将零频移到中间,同时调整坐标,使得X 轴从0到480,Y 轴从-8到8,通道0对应速度为0。
练习五实验报告
一、实验目的
编写C语言,练习读写数据
二、实验内容
编写C程序,产生1000个随机浮点数(随机类型和参数自行确定),建立一个磁盘文件,把所有随机数依序、按照相应格式写入文件;关闭文件。再打开此文件,从文件中把数据读入,计算其均值、方差,并写入另一个文件中
三、实验过程
3.1 C语言函数产生1000个随机浮点数
3.2 建立磁盘文件并将随机浮点数依次写入文件rand.dat,并关闭文件
3.3 打开rand.dat文件,并把数据读入
3.4 计算所读入数据的均值及方差
3.5 建立新的磁盘文件result.dat并将将所计算均值和方差写入该文件,关闭文件。
四、试验程序如下
#include
#include
#include
#include
#define N 1000
int i;
float mean=0.0;
float var=0.0;
int data[N];
int data1[N];
FILE *fp;
void main()
{
for(i=0;i { data[i]=rand(); } fp=fopen("rand.dat","rb"); fread(data1,4,N,fp); fclose(fp); for(i=0;i { mean+=data1[i]; } mean=mean/N; for(i=0;i { var+=(data1[i]-mean)*(data1[i]-mean); } var=var/N; fp=fopen("result.dat","w"); fprint(fp,"mean=%f\nvar=%f\n",mean,var); fclose(fp); } 五、问题讨论 此练习中,计算机和DSP各自起什么作用?如果DSP脱离计算机,此程序还能运行吗? 答:在DSP中进行了文件建立、读写操作和数学计算,并将数据处理结果送到计算机终端。对于DSP来说,它并不具备通用微机的强大的文件系统和人机界面,所以DSP将数据传回了通用微机所在的调试平台,并在Debug文件建立数据文件。所有的文件操作都是有DSP来完成,但是数据文件却是建在微机上。如果DSP脱离了计算机,DSP创建的文件将没有终端存放,那么这个程序将无法运行。 练习六实验报告 调试器和EZ-KIT板的性能比较 二、实验内容 把练习二改为执行5次、10次,在软仿真环境下运行,并用记录执行的时间;然后,再在EZ KIT板上执行此程序,记录执行时间。 三、实验过程 3.1 在练习二程序中主程序加for循环函数,循环次数5次,编译、运行、 记录执行时间; 3.2 将循环次数改为10次,编译、运行、记录执行时间; 3.3 连接 EK KIT板,设置运行环境,程序循环次数分别设置5、10次,编 译后运行,分别记录执行时间(通过Cycle Counters); 3.4 比较数据 四、实验结果 软件调试器时间:程序运行5次:22s 程序运行10次:41s EK KIT硬件调试时间(Cycle Counters): 程序运行5次:程序运行前 1855393473 程序运行后 1855899752 程序运行10次:程序运行前 1793396145 程序运行后 1794408256 五、时间差异比较及原因 5.1 EK KIT硬件调试时间运算 运行5次(1855899752-1855393473)*1.67ns=0.85ms 运行10次(1794408256-1793396145)*1.67ns=1.69ms 5.2 从运行时间比较来看,DSP运行硬件环境EK KIT板子运行时间比较软 件调试器运行时间有大幅度减少,节省了大量时间。 5.3 之所以EK KIT比较软件调试器速度有这么大的提高,是因为DSP硬件 板子是专门用于数字信号处理的工具,采用数据总线、程序总线分离的结构方式,采用流水技术,大大提高了指令的执行速度和效率。总之,DSP硬件较之计算机有更利于指令加快运算速度的结构和技术设计,所以才有更快的运算速度。 实验九中断响应、标志查询 VisualDSP Debug中提供了Interrupts来模仿在程序的执行过程中产生随机外部中断。 Interrupts 模仿在程序的执行过程中产生随机外部中断(IRQ0~3)和可编程I/O (Flag0~3),这对调试中断服务程序、执行条件指令非常有用。对于外部中断IRQ0~3采取中断服务程序方式,对于可编程I/O采取查询方式。 二、实验步骤 1.编写C语言程序调试外部中断 #include #include #include #include #pragma align 4 section ("data2a") float data1[10] = { #include "data1.dat" //读取文件data1.dat }; #pragma align 4 section ("data2a") float data2[10] = { #include "data2.dat" //读取文件data2.dat }; #pragma align 4 section ("data2a") float result[10]; //为计算结果分配内存 int n = 0; int en_flag = 0; void initial(void); //声明函数 void irq0_isr(void); //声明函数 void main(void) { initial(); //初始化寄存器函数 // irq0_isr() 外部IRQ0中断服务子程序,在子程序中断中置en标志位 interrupt(SIGIRQ0,irq0_isr); // intR0的中断使能 __builtin_sysreg_write(__IMASKH,0x00000200); // 打开全局中断使能 __builtin_sysreg_write(__SQCTLST,SQCTL_GIE); while(1) { while(en_flag==1) //当检测到标志位为1时 { en_flag = 0; //标志位清0 result[n] = data1[n] + data2[n]; //两数组按顺序相加 n++; //数组下标指向下一个数 } if(n==10) { break; } //跳出while循环 } } void initial() { //配置系统配置寄存器SYSCON 外部总线接口寄存器 __builtin_sysreg_write(__SYSCON,0x279e7); //设置外部中断触发方式为边沿触发,关闭定时 __builtin_sysreg_write(__INTCTL,0x0); } void irq0_isr() { en_flag = 1; //标志位置1 } 2.添加外部中断IRQ0 3.设置断点在while(en_flag==1)内 4.运行程序,记录数据 5.编写C语言程序调试可编程I/O #include #include #include #include void initial(void); //声明函数 int flag1; void main(void) { initial(); //初始化寄存器函数 while(1) { //查询flag flag1=__builtin_sysreg_read(__SQSTAT); //SQSTAT程序控制状态寄存器 flag1=flag1&0x00020000; while(flag1!=0x00000000) //当flag1为高时 { flag1=__builtin_sysreg_read(__SQSTAT); flag1=flag1&0x00020000; } flag1=__builtin_sysreg_read(__SQSTAT); flag1=flag1&0x00020000; while(flag1!=0x00020000) //当flag1为低时 { flag1=__builtin_sysreg_read(__SQSTAT); flag1=flag1&0x00020000; } } while(1) { int i=0,k=0; for(i=0;i<10000;i++) { i=0; k=i; } } } void initial() { __builtin_sysreg_write(__SYSCON,0x279e7); __builtin_sysreg_write(__INTCTL,0x0); //设置外部中断触发方式为边沿触发 __builtin_sysreg_write(__FLAGREG,0); //清除所有FLAG设置} 5.设置FLAG1输入 6.分别设置两个断点在while循环前 7.运行程序,记录数据 三、实验分析 数据记录:(每次停留断点处的指令计数) 第一次断点第二次断点第三次断点第四次断点第四次断点外部中断模 1505 11503 21484 31493 41506 式 FLAG查询 5338 10344 15334 20352 25310 模式 从以上数据可以发现:在外部中断的产生周期设置为10000时,运行程序,平均每隔10000指令周期,就会响应中断服务子程序一次;在FLAG输入设置周期为10000时,分别查询高低电平,运行到每个断点的指令间隔平均为5000,正好是外部中断的一半。 四、思考题 实验一中为什么设触发方式为边沿触发?为什么flag查询的时候时间正好是外部中断的一半? 答:对于该程序的外部触发中断子程序,只需要实现将标志位置1,因此,只需要检测一个上升沿便可执行。对于flag查询,输入的flag信号是占空比为50%的方波,因此,flag查询的时间正好是外部中断的一半。