📄 10-3.asm
字号:
.ref usb_transfer
pcr1 .equ 01900024h
pcr .equ 018c0024h
.global ftranform
.global sinx
.data
sinx: .word 6957,13597,19617,24742,28740,31426,32680,32444,30728,27612,23236,17801
.word 11554, 4780,-2212,-9102,-15578,-21344,-26136,-29736,-31981,-27609,-6947
.word 17814, 32064, 27396, 6564,-18141, -32142, -27180, -6181, 18465, 32216, 26959
.word 5796,-18787,-32285,-26735,-5411, 19106, 32350, 26507,-13377,-32031, 149, 32092
.word 13103,-26681,-24122, 16720, 31026,-3908,-32640,-9571, 28687, 21418,-19843
.word -29612, 7614, 32756, 5912,-30315,-18431, 31898,-4428,-28725, 25014, 10799
.word -32753, 12673, 23671,-29636,-2432, 31379,-20055,-17007, 32243,-6100,-27872
.word 26074, 9186,-32657, 14217, 22469,-32207, 29583,-15605,-4362, 22655,-32253
.word 29472,-15379,-4617, 22841,-32298, 29358,-15151,-4872, 23024,-32340, 29243
.word -14922,-5126, 23207,-32381, 32609,-32738, 32765,-32693, 32519,-32246, 31873
.word -31403, 30836,-30174, 29420,-28575, 27642,-26624, 25525,-24347, 23094,-21770
.word 20379,-18926, 17414,-28889, 32756,-27996, 15863, 448,-16640, 28451,-32768
.word 28456,-16649, 458, 15854,-27990, 32755,-28894, 17423,-1364,-15055, 27509
.word 29310,-453,-28894, 27003, 4081,-30753, 24177, 8537,-32022, 20887, 12829,-32676
.word 17196, 16875,-32702, 13174, 20596,-32100, 8900, 23922,-30881, 4454,32743,1893
.word 32376,-8169, 30792, 14138,-28052,-19576, 24257, 24278,-19551,-28068, 14110
.word 30803,-8139,-32381, 1862, 32742, 4485,-31872,-10663,-17986,-24195,-28904
.word 31821,-32767,-31681,-28633,-23809,-17510,-10126,-2114, 6029, 13798, 20712
.word 26342, 30340,32458,32563,30651, 26839, 21363,-3724,-26422,-32171,-17283
.word 8691, 29091, 30829, 12791,-13452,-31066,-28752,-7994, 17891, 32300, 25989
.word 3007,-21904,-32765,-22607, 2052, 25395, 24756,-16906,-30553, 6428, 32758
.word 4806,-31110,-15474, 25803, 24323,-17462,-30311, 7068, 32735, 4158,-31309
.word -14895,26201,23880,-18012,-18012,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.sect ".datatt"
tt: .word 216,433,649,865,1081,1298,1514,1730,1946,2163,2379,2595,2811,3028,3244,3460
.word 03677,3893,4109,4325,4542,4761,4981,5200,5420,5639,5859,6078,6298,6518,6737
.word 6957, 07176,7396,7615,7835,8054,8274,8493,8713,8933,9152,9375 ,9598,9821
.word 10043,10266,10489, 10712,10935,11158,11380,11603,11826,12049,12272,12494
.word 12717,12940,13163,13386,13609,13831,14057, 14284, 14510,14736,14962,15188
.word 15414,15640,15866,16092,16318,16545,16771,16997,17223,17449,17675, 17901
.word 18127,18353,18579,18809,19038,19268,19497,19726,19956,20185,20414, 20644
.word 20873, 21103, 21332, 21561, 21791,22020,22249,22479,22708,22938,23167, 23396
.word 23629,23862,24094,24327,24560,24792,25025, 25258, 25490, 25723, 25956, 26188
.word 26421,26653,26886,27119,27351,27584,27817,28049,28282,28518,28754, 28990
.word 29226,29462,29698,29934,30169,30405,30641,30877,31113,31349,31585, 31821
.word 32057, 32293, 32529, 32765,33001,33237,33476,33715,33954,34193, 34433, 34672
.word 34911,35150,35389,35629,35868,36107,36346, 36585, 36825, 37064, 37303, 37542
.word 37782,38021,38260,38502,38745,38987,39230,39472,39715,39957, 40200, 40442
.word 40685, 40927, 41170,41412,41655,41897,42140,42382,42625, 42867, 43110, 43352
.word 43604, 43857, 44109, 44361,44614,44866,45118,45371,45623,45875, 46128, 46380
.word 46632,46884,47137,47389,47641,47894,48146, 48398, 48651, 48906, 49162, 49417
.word 49673,49929,50184,50440,50695,50951,51207,51462,51718,51973, 52229, 52485
.word 52740, 52996,53251,53507,53762,54018,54277,54536, 54795, 55054, 55312, 55571
.word 55830, 56089, 56348, 56607,56866,57124,57383,57642,57901,58160, 58419, 58678
.word 58937, 59195, 59195
.bss fft, 16000, 0, 0 ; 为变量fft申请16000个内存空间
.global ft ; 定义全局变量ft
.text
ftranform:
MVC csr,b0 ; 设置全局控制寄存器
AND -2,b0,b0
MVC b0,csr ; 屏蔽所有可屏蔽中断
MVKL pcr1,a10 ; 设置pcr1寄存器
MVKH pcr1,a10
MVKL 3a0ah,b10 ; 设置dx1引脚为低电平
STW b10,*a10
NOP 4 ; 等待较长时间,是为了确保硬件完成设置
NOP 8
NOP 8
MVKL 3a2ah,b10 ; 设置dx1引脚为高电平
STW b10,*a10
NOP 4
NOP 8
NOP 8
MVKL 3a2ah,b10 ; 设置dx1引脚为低电平
STW b10,*a10
NOP 4
NOP 8
NOP 8
MVKL 3a2ah,b10 ; 设置dx1引脚为高电平
STW b10,*a10
NOP 4
NOP 8
NOP 8
MVKL 3a2ah,b10 ; 设置dx1引脚为低电平
STW b10,*a10
NOP 4
NOP 8
NOP 8
MVKL 3a2ah,b10 ; 设置dx1引脚为高电平
STW b10,*a10
NOP 4
NOP 8
NOP 8
MVKL 3a0ah,b10 ; 设置dx1引脚为低电平
STW b10,*a10
NOP 4
MVK 4000, a0 ; 寄存器a0为整个外循环loopout的次数
MVKL fft, a4
MVKH fft, a4
MVKL 0, b3 ; 寄存器b3清0
loopout: ADD b3,1,b3 ; 寄存器b3累加已经执行的外循环loopout的次数
ZERO a5 ; 寄存器a5保存数据的实部
ZERO b5 ; 寄存器b5保存数据的虚部
MVKL sinx, a2
MVKH sinx, a2
MVKL tt, a13
MVKH tt, a13
MVK 250, b4 ; 设置内循环loopin次数为250次
loopin: SUB b4,1,b4 ; 内循环次数减1
LDW *a13++, a6
NOP 5
MPYU b3, a6, b9 ; 寄存器b9 保存 k*t(n)
NOP
LDW *a2++, a6 ; 寄存器a6和b6保存sinx
EXTU b9, 16, 31, b2
EXTU b9, 17, 31, b1
EXTU b9, 18, 18, b9
MVK 487Fh, a8 ; 寄存器a8保存2*pi
MPYU b9, a8, b8
MPY b9, 6h, b7
SHR a6, 16, a6
SHL a6, 4, a6
SHRU b8, 16, b9
ADD b9, b7, b9 ; 寄存器b9 保存 2*pi*k*t (n)
MV b9, b8 ; 寄存器b8 保存 2*pi*k*t (n)
MV b8, a8 ; 寄存器a8 保存 2*pi*k*t (n)
MV a6, b6 ; 开始计算非均匀采样信号的频谱
ZERO b9
|| ZERO a9
MVKL 752h, a3 ; 计算sin(2*pi*t(n)*(k-1)/N))
ADD b9, a3, b9 ; 正弦函数采用泰勒级数计算
|| ADD a9, a3, a9
MPYU b9, b8, b12 ; 计算b9和b8的低16位的乘积
|| MPYU a9, a8, a12 ; 计算a9和a8的低16位的乘积
MPYHSLU b9, b8, b11 ; 计算b9的高16位和b8的低16位乘积
|| MPYHSLU a9, a8, a11 ; 计算a9的高16位和a8的低16位乘积
MPYLUHS b9, b8, b10 ; 计算b9的低16位和b8的高16位乘积
|| MPYLUHS a9, a8, a10 ; 计算a9的低16位和a8的高16位乘积
MPYH b9, b8, b7 ; 计算b9和b8的高16位的乘积
|| MPYH a9, a8, a7 ; 计算a9和a8的高16位的乘积
SHRU b12, 16, b12 ; 对计算后的乘积进行移位累加
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b9
|| ADD a11, a10, a9
ADD b9, b12, b9
|| ADD a9, a12, a9
ADD b9, b7, b9
|| ADD a9, a7, a9
MVKL 0CBCEh, a3 ; 计算(cos(2*pi*t(n)*(k-1)/N)
ADD b9, a3, b9 ; 余弦函数采用泰勒级数计算
MVKL 61Eh, a3 ; 寄存器a3保存级数展开后的系数
ADD a9, a3, a9
MPYU b9, b8, b12 ; 做泰勒级数的乘积
|| MPYU a9, a8, a12
MPYHSLU b9, b8, b11
|| MPYHSLU a9, a8, a11
MPYLUHS b9, b8, b10
|| MPYLUHS a9, a8, a10
MPYH b9, b8, b7
|| MPYH a9, a8, a7
SHRU b12, 16, b12
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b9 ; 求泰勒级数各项的和
|| ADD a11, a10, a9
ADD b9, b12, b9
|| ADD a9, a12, a9
ADD b9, b7, b9
|| ADD a9, a7, a9
MVKL 559h, a3 ; 寄存器a3为泰勒级数的系数
ADD b9, a3, b9
MVKL 7BFCh, a3
MVKLH 0FFFFh, a3
ADD a9, a3, a9
MPYU b9, b8, b12 ; 做泰勒级数的乘积
|| MPYU a9, a8, a12
MPYHSLU b9, b8, b11
|| MPYHSLU a9, a8, a11
MPYLUHS b9, b8, b10
|| MPYLUHS a9, a8, a10
MPYH b9, b8, b7
|| MPYH a9, a8, a7
SHRU b12, 16, b12
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b9 ; 求泰勒级数各项的和
|| ADD a11, a10, a9
ADD b9, b12, b9
|| ADD a9, a12, a9
ADD b9, b7, b9
|| ADD a9, a7, a9
MVKL 0FED2h, a3 ; 寄存器a3为泰勒级数的系数
MVKLH 0, a3
ADD b9, a3, b9
MVKL 0F2h, a3
ADD a9, a3, a9
MPYU b9, b8, b12 ; 做泰勒级数的乘积
|| MPYU a9, a8, a12
MPYHSLU b9, b8, b11
|| MPYHSLU a9, a8, a11
MPYLUHS b9, b8, b10
|| MPYLUHS a9, a8, a10
MPYH b9, b8, b7
|| MPYH a9, a8, a7
SHRU b12, 16, b12
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b9 ; 求泰勒级数各项的和
|| ADD a11, a10, a9
ADD b9, b12, b9
|| ADD a9, a12, a9
ADD b9, b7, b9
|| ADD a9, a7, a9
MVKL 0Dh, a3 ; 寄存器a3为泰勒级数的系数
ADD b9, a3, b9
MVKL 0FFF2h, a3
MVKLH 0, a3
ADD a9, a3, a9
MPYU b9, b6, b12 ; 做泰勒级数的乘积
|| MPYU a9, a6, a12
MPYHSLU b9, b6, b11
|| MPYHSLU a9, a6, a11
MPYLUHS b9, b6, b10
|| MPYLUHS a9, a6, a10
MPYH b9, b6, b7
|| MPYH a9, a6, a7
SHRU b12, 16, b12
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b9 ; 求泰勒级数各项的和
|| ADD a11, a10, a9
ADD b9, b12, b9
|| ADD a9, a12, a9
ADD b9, b7, b9
|| ADD a9, a7, a9
AND b2, b1, b0
[b0] ADD a5, b9, a5
|| [b0] SUB b5, a9, b5
XOR b2, 1, b2
AND b2, b1, b0
[b0] SUB a5, b9, a5
|| [b0] ADD b5, a9, b5
XOR b1, 1, b1
AND b2, b1, b0
[b0] ADD a5, a9, a5
|| [b0] ADD b5, b9, b5
XOR b2, 1, b2
AND b2, b1, b0
[b0] SUB a5, a9, a5
|| [b0] SUB b5, b9, b5
CMPLTU 0, b4, b0 ; 寄存器b4中内容为尚未执行的内循环的次数
[b0] B loopin ; 判断内循环loopin次数是否为0
NOP 5
; 外循环计算傅立叶变换后虚部和实部的平方和
MPYU b5, b5, b12 ; 计算b5的低字节的平方
|| MPYU a5, a5, a12 ; 计算a5的低字节的平方
MPYHSLU b5, b5, b11 ; 计算b5的高字节和低字节的乘积
|| MPYHSLU a5, a5, a11 ; 计算a5的高字节和低字节的乘积
MPYLUHS b5, b5, b10 ; 计算b5的低字节和高字节的乘积
|| MPYLUHS a5, a5, a10 ; 计算a5的低字节和高字节的乘积
MPYH b5, b5, b7 ; 计算b5的高字节的平方
|| MPYH a5, a5, a7 ; 计算a5的高字节的平方
SHRU b12, 16, b12 ; 将计算结果进行移位和累加
|| SHRU a12, 16, a12
SHL b7, 16, b7
|| SHL a7, 16, a7
ADD b11, b10, b5
|| ADD a11, a10, a5
ADD b5, b12, b5
|| ADD a5, a12, a5
ADD b5, b7, b5
|| ADD a5, a7, a5
ADD a5, b5, a5 ; 寄存器a5为计算后的频谱值
STW a5,*a4++ ; 依次保存各个频点的频谱值
NOP 5
; 寄存器b3为已经执行的外循环次数
CMPLTU b3, a0, b1 ; 判断b3的内容是否达到a0的值
[b1] B loopout ; 条件不满足跳到外循环
NOP 5
loop: NOP ; 傅立叶变换结束,得到信号的频谱
B usb_transfer ; 程序跳转到USB程序,将频谱输出到计算机
NOP 5
NOP
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -