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

[复制链接]
519|9
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:]
老橘树下的桥头 发表于 2026-3-23 14:25 | 显示全部楼层
APM32E103RCT6 基于 Cortex-M3 内核,无硬件 FPU 单元,所有浮点运算需通过软件库模拟实现,运算效率远低于带 FPU 的 M4/M7 内核。开发时编译器会自动调用浮点模拟库,无需手动开启 FPU 编译选项;若需提升浮点效率,可优化算法改用整型运算,或更换带 FPU 的 APM32F4 系列。
总结
APM32E103RCT6 无硬件 FPU,浮点运算靠软件模拟;
无需配置 FPU 相关选项,效率低时可优化算法或换芯片;
区别于带 FPU 的 M4 内核,这是 M3 内核的核心特征。
葡萄又绿江南岸 发表于 2026-3-23 09:44 | 显示全部楼层
APM32E103RCT6 内核为 Cortex-M3,本身无硬件 FPU 单元,仅支持软件浮点运算。若需浮点计算,需在极海 SDK 中启用软浮点库(如 arm_cortexM3lf_math.lib),编译时选择软浮点编译选项。需注意:软浮点运算效率低于硬件 FPU,复杂浮点算法(如 FOC)需优化代码,或考虑带 FPU 的 APM32F4 系列。
总结
APM32E103RCT6 无硬件 FPU,仅支持软件浮点运算;
需启用 SDK 软浮点库并配置对应编译选项;
软浮点效率低,复杂算法需优化或换 F4 系列。
四十四次日落 发表于 2026-3-17 14:59 | 显示全部楼层
APM32E103RCT6 搭载的 ARM Cortex-M3 内核无硬件 FPU(浮点运算单元),所有浮点运算需通过软件库模拟实现,运算效率远低于带 FPU 的 M4/M7 内核。若需处理浮点数据,需启用编译器浮点库(如 - mfloat-abi=soft),或手动将浮点运算转为整型运算优化;需注意其浮点运算延迟较高,复杂浮点场景建议算法层面简化计算逻辑。
总结
核心点:该芯片无硬件 FPU,浮点运算依赖软件模拟;
优化方向:启用浮点库或转为整型运算,降低运算延迟。
野玫瑰 发表于 2026-3-26 11:41 | 显示全部楼层
APM32E103RCT6 基于 Cortex-M3 内核,无硬件 FPU(浮点运算单元):所有浮点运算需通过软件库模拟完成,运算效率远低于带 FPU 的 Cortex-M4/M7 内核。若需处理浮点数据,需启用编译器的软浮点库(-mfloat-abi=soft),或优化算法改用定点运算,避免频繁浮点计算导致程序运行效率大幅下降。
总结
APM32E103RCT6 无硬件 FPU,浮点运算依赖软件模拟;
可启用软浮点库或改用定点运算优化浮点处理效率。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

122

帖子

1

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