IQmath 应用总结 在 F2812 的 ROM 中,有 3K× 16 位被保留用于存放数学公式表以及未来的开发。主要应用于高速度和高精度的实时计算,比同等程度的ANSIC C 语言效率更高,同时可以节省用户更多的设计和调试时间。在此我对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 = 0x3f8000 , length = 0x002000 } SECTIONS { IQmathTables : load = BOOTROM , type = NOLOAD , PAGE=0 IQmath : load = RAMH0 , PAGE=0 } 以上代码的红色部分可以适当修改。IQmathTables 段必须设置为NOLOAD 型。 2 IQmath 应用 完成以上几步之后就可以在你的主函数里应用IQmath 提供的函数进行计算了。建议在应用之前把IQmathLib.h 浏览一下,了解各个函数是怎样实现的。下面举一个简单的例子: #include "DSP281x_Device.h" #include "IQmathLib.h" #define PI 3.14159 _iq sinout_iq; float sinout_flt; void main(void) { InitSysCtrl(); InitXintf(); DINT; IER=0X0000; IFR=0X0000; sinout_iq=_IQ29sin(_IQ29mpy(_IQ29(0.25),_IQ29(PI))); sinout_flt=_IQ29toF(sinout_iq); for(;;){} } 上述代码的功能是计算sin(π /4)的值,然后赋给sinout_flt,计算结果如图2.1 所示。 图 2.1 实例计算结果 sinout_iq 值的格式为_iq29 类型(也就是long 型,参见IQmathLib.h),所以要通过函数_IQ29toF(sinout_iq)转化为float 类型,才是我们需要的最终结果。 除个别函数外,一般情况下,计算公式里的所有变量都为一个iq 类型,如上述主函数的第6 行语句,全为_iq29 类型。函数的具体讲解请参考IQmath 手册,在此不再啰嗦。 3 Q 格式的选择 IQmath 一共提供了30 种 Q 格式,具体选择哪种格式要兼顾...