我之前的工程是用st的标准库做的,想换成apmE103RCT6,结果我编写了一个简单程序验证浮点计算的时候,老是不对,请大家帮忙找找原因,谢谢各位了。程序运行96Mhz。
我是这么适配的,如下:
#define FPU_BASE 0x40024000 //apm32E103的FPU的内存首址
#define FPU ((FPU_TypeDef *)FPU_BASE) //定义一个结构体,用指针指向FPU地址
#define RCC_AHBPeriph_FPU ((uint32_t)0x00000008) //这是允许FPU时钟的数据
///下面是FPU结构体的定义
typedef struct
{
__IO uint32_t F_CTRL;
__IO uint32_t F_ISTS;
__IO uint32_t F_FPO;
__IO uint32_t F_FPI1;
__IO uint32_t F_FPI2;
__IO uint32_t F_IM;
} FPU_TypeDef;
//到这里为止,关于FPU的一些定义已经做完,下面就是程序部分,我只写出和FPU有关的程序部分,如下:
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FPU,ENABLE); //允许FPU时钟;
//下面是操作FPU的程序,我做了一个除法,
FPU->F_CTRL=0;
FPU->F_IM|=0x00000003; //屏蔽中断,采用查询标志位方式。
FPU->F_CTRL=22; //除法操作对应的数据
FPU->F_CTRL<<=1;
FPU->F_CTRL|=0x01; // 启动计算
//++++本来是我用一个float和U32的共用体给操作数赋值,但是怎么都不对,我直接改成了立即数,结果还是不对。
//第一个操作数赋值
FPU->F_FPI1=0x40;
FPU->F_FPI1<<=8;
FPU->F_FPI1|=0x48;
FPU->F_FPI1<<=8;
FPU->F_FPI1|=0xf5;
FPU->F_FPI1<<=8;
FPU->F_FPI1|=0xc3;
//第二个操作数赋值
FPU->F_FPI2=0x40;
FPU->F_FPI2<<=8;
FPU->F_FPI2|=0x48;
FPU->F_FPI2<<=8;
FPU->F_FPI2|=0xf5;
FPU->F_FPI2<<=8;
FPU->F_FPI2|=0xc3;
//++++++++++++++++++++++//
__NOP();__NOP();__NOP();__NOP();__NOP();
while((FPU->F_ISTS&0x00000001)==0); //等待计算完成
jieguo.fdat=FPU->F_FPO; //这里知道计算结果
麻烦做个FPU的朋友给看一下,我计算的老是不对,不知道哪里还有问题,谢谢! |
|