IQMATH使用
作者:冷眼心热
1
IQmath库
为了应用IQmath,首先要从TI官方网站下载IQmath库,文档名称为SPRC087。我们主要应用库里面的:IQmath.cmd,IQmathLib.h,IQmath.lib。新建一个工程,将IQmath.lib,IQmath.cmd添加到工程,同时在main()函数之前增加语句:#include
“IQmathLib.h”。注意:rts2800.lib和DSP281x_Headers_nonBIOS.cmd也要加到工程里面。
当然也可以不用IQmath.cmd文件,而用自己的CMD文件,只要在你的CMD里面添加以下代码即可:
MEMORY
{
PAGE 0:
BOOTROM (RW) : origin = 0x3ff000 , length =
0x000fc0
RAMH0 (RW) :
origin = 0x 3f8000 , length =
0x002000
}
SECTIONS
{
IQmathTables : load = BOOTROM , type = NOLOAD ,
PAGE=0
IQmath : load = RAMH0 ,
PAGE=0
}
以上代码的红色部分可以适当修改。IQmathTables段必须设置为NOLOAD型
(by:superchengmin)
2
IQ实例
注释:1
最后一句等效前面三句;
2 temp =
AdcRegs.ADCRESULT0;此句中AdcRegs.ADCRESULT0类型为Uint16,此处插一句
//---------------------------------------------------------------------------
// For Portability, User Is Recommended To Use Following Data Type
Size
// Definitions For 16-bit and 32-Bit Signed/Unsigned
Integers:
//
#ifndef DSP28_DATA_TYPES
#define
DSP28_DATA_TYPES
typedef int
int16;
typedef long
int32;
typedef
unsigned int Uint16;
typedef
unsigned long Uint32;
typedef
float float32;
typedef long
double float64;
#endif
这里看到typedef unsigned int Uint16在C语言中占16位,而_iq类型为typedef long
_在C中占32位,赋值以后只改变temp低16位;
3 temp = _IQ16toIQ(temp);
//#define _IQ16toIQ(A)
((GLOBAL_Q >= 16) ? ((long) A
<< (GLOBAL_Q - 16)):((long) A
>> (16 -
GLOBAL_Q)))
Result = _IQmpy(AdcFsVoltage,
temp);
3
IQ使用效率
建议如果对某一浮点变量使用IQ运算,中间不要再转换成浮点:
使用IQmath算正弦效率很高,其内部采用查表方式,例如正弦有512个Q30正弦值,这样在进行正弦计算时可以保证一个周期最多可以取512个点,相当于对频率为f的正弦信号使用频率为最高为fs=512*f的取样信号进行取样,根据采样定理,fs>2f,即原信号每个周期采样两点以上,即可无失真恢复原信号,实际工程上要想恢复原信号每个周期应当多于两点以上,但是每周期最多可采512点完全可以无失真的恢复原信号。
==========================================================================
对程序中常出现的EINT、DINT、ERTM、DRTM的理解
作者:小世界
一、参考DSP281x_Device.h
#define EINT asm(" clrc INTM")
//INTM置0,开中断
#define DINT asm(" setc INTM")
//INTM置1,关中断
#define ERTM asm(" clrc DBGM")
//使能调试事件
#define DRTM asm(" setc DBGM")
//禁止调试事件
二、参考《TMS320C28x DSP CPU和指令集参考指南》中对INTM和DBGM的解释(译的不好,凑合看吧。。。)
1、DBGM
Bit 1:调试启用屏蔽位。当DBGM置位时,仿真器无法在实时状态下访问内存或寄存器。调试器无法更新其窗口。
在实时调试模式中,若DBGM =
1,则CPU忽略停止请求或硬件断点,直到DBGM清零。DBGM并不阻止CPU停止在软件断点。这点的一个影响可以在实时调试模式中看到。如果你在实时调试模式中单步执行一个指令,并且这条指令置位DBGM,CPU继续执行指令,直到DBGM被清零。
当你给TI调试器“实时”命令时(进入实时模式),DBGM强制为0。令DBGM =
0确保了允许调试和测试直接内存访问 (DT-DMAs);内存和寄存器的值可传递到主处理器,用于更新调试器窗口。
CPU在执行中断服务程序(ISR)之前将DBGM置位。当DBGM =
1时,来自主处理器和硬件断点的停止请求被忽略。如果你想要单步执行程序或在对时间要求不严格的ISR中设置断点,那么你必须在ISR的开始处增加一条CLRC
DBGM指令。
DBGM主要用在时间要求严格的程序代码部分的仿真,来阻止调试事件。DBGM使能或禁止调试事件,如下:
0 调试事件使能。
1 调试事件禁止。
当CPU响应中断时,DBGM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后DBGM置位。当由中断返回时,DBGM由堆栈中恢复。
此位可分别由SETC DBGM指令和CLRC
DBGM指令复位和清零。DBGM在中断操作期间被自动置位。复位时,DBGM置位。执行ABORTI
(中止中断)指令也可以将DBGM置位。
2、INTM
Bit 0:中断全局屏蔽位。此位从全局上使能或禁止所有可屏蔽CPU中断(那些可由软件阻止的中断):
0
可屏蔽中断被全局使能。为了被CPU认可,则可屏蔽中断也必须被中断使能寄存器(IER)局部使能。
1 可屏蔽中断被全局禁止。即使一个可屏蔽中断被IER局部使能,也不会被CPU认可。
INTM对非可屏蔽中断没有影响,包括硬件复位或软件复位中断NMI。此外,当CPU在实时仿真模式下被停止时,由IER和DBGIER使能的中断将被响应,即使INTM设置为禁止可屏蔽中断。
当CPU响应中断时,INTM的当前值存储到堆栈中(当ST1存储在堆栈中时),然后INTM置位。当由中断返回时,INTM由堆栈中恢复。
此位可分别由SETC INTM指令和CLRC
INTM指令复位和清零。复位时,INTM置位。INTM的值不会引起中断标志寄存器(IFR)、中断使能寄存器(IER)或调试中断使能寄存器(DBGIER)的改变。