[APM32E1] 请教关于apm32E103RCT6的FPU的问题,我还没弄清楚。

[复制链接]
110|5
2shift 发表于 2025-11-2 20:47 | 显示全部楼层 |阅读模式
我之前的工程是用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的朋友给看一下,我计算的老是不对,不知道哪里还有问题,谢谢!
水之呢喃 发表于 2025-11-3 09:47 | 显示全部楼层
这个也没有实验过。
帮楼主顶一下帖子吧
Gfan 发表于 2025-11-3 10:44 | 显示全部楼层

关于E103的FPU功能,您可以参考一下这篇文章噢
如何利用APM32E103的FPU单元提升浮点运算效率
 楼主| 2shift 发表于 2025-11-3 10:51 | 显示全部楼层
这个是利用极海的函数库,我把这个库加到工程里面,编译报错。极海的这个库,怎么没有除法。
 楼主| 2shift 发表于 2025-11-3 14:03 | 显示全部楼层
不好意思,刚看出问题来,我把结果赋值弄错了,jieguo.fdat=FPU->F_FPO;这一句,应该改成:jieguo.d32t=FPU->F_FPO;就可以了。我验算了加法和除法,结果都对。
Gfan 发表于 2025-11-4 11:33 | 显示全部楼层
2shift 发表于 2025-11-3 14:03
不好意思,刚看出问题来,我把结果赋值弄错了,jieguo.fdat=FPU->F_FPO;这一句,应该改成:jieguo.d32t=FPU ...

好咧,解决了就好~有时候真的就是一些细节问题[em:3:]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

122

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部