打印
[AT32F435]

AT32F435 开启FPU浮点单元的奇怪问题!

[复制链接]
4293|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
showmyself|  楼主 | 2024-1-6 12:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在官方的AN0037应用笔记上,提到开启FPU需要先检查system_at32f4xx.c文件文件中的void SystemInit (void)函数,是否有如下代码:
#if defined (__FPU_USED) && (__FPU_USED == 1U)
SCB->CPACR |= ((3U << 10U * 2U) | /* set cp10 full access */ -----------------1
(3U << 11U * 2U) ); /* set cp11 full access */
#endif


我检查过了,确实有这个代码,但是上述红色代码部分是灰色的,表示没有启用,应用笔记也没提到是灰色的如何启用。
在已经勾选Keil中“single precision”的前提下,上述红色代码仍然是灰色的。
我研究了一下,应该是__FPU_USED这个宏没用定义。于是在工程中自己手动添加了一个__FPU_USED全局宏,编译之后提示重定义了。

于是我在core_cm4.h这个文件中找到:
#if defined ( __CC_ARM )
  #if defined __TARGET_FPU_VFP
    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) -------------------2
      #define __FPU_USED       1U
    #else
      #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
      #define __FPU_USED       0U
    #endif
  #else
    #define __FPU_USED         0U-------------------3
  #endif


这里有对__FPU_USED定义,所以提示重定义了。
但是以上红色部分2也是灰色的,也没有启用,所以__FPU_USED 被定义成了0,也就是上述的3.
这也能解释为什么以上红色部分代码1是灰色的,导致FPU没有启用。

但是很奇怪的是__FPU_PRESENT这个宏,明明在at32f435_437.h中是有定义的,不知道为什么没执行 __FPU_USED       1U,
反而执行了__FPU_USED         0U?

感觉好乱,前后都自相矛盾!
手册写的太简单了,根本没什么用!
谁能给个正确的配置流程?
谢谢!

使用特权

评论回复
沙发
muyichuan2012| | 2024-1-9 13:00 | 只看该作者
因为那个宏是keil上开启FPU时编译器自动开启的。代码里看不到那个宏的开启,当然是灰色。
要看FPU是否有工作,你只需比较keil上开启和关闭FPU就可以了。

使用特权

评论回复
板凳
showmyself|  楼主 | 2024-1-9 20:18 | 只看该作者
muyichuan2012 发表于 2024-1-9 13:00
因为那个宏是keil上开启FPU时编译器自动开启的。代码里看不到那个宏的开启,当然是灰色。
要看FPU是否有工 ...

谢谢!了解了!

使用特权

评论回复
地板
两只袜子| | 2024-1-11 09:24 | 只看该作者
检查编译选项,在Keil中你是否已经勾选了“Enable FPU”选项。

使用特权

评论回复
5
两只袜子| | 2024-1-11 09:38 | 只看该作者
检查链接脚本还有启动文件

使用特权

评论回复
6
药无尘| | 2024-2-6 09:52 | 只看该作者
需要编译器开启FPU的

使用特权

评论回复
7
前功尽弃| | 2024-6-20 16:25 | 只看该作者
我这边413的是把宏定义给他改成1了

使用特权

评论回复
8
nuan11nuan| | 2024-8-10 11:49 | 只看该作者
在Keil MDK中开启FPU浮点单元,可以通过以下步骤进行配置:在项目窗口中,右键点击你的项目名称,然后选择 Options for Target 'YourTargetName'。或者,你可以直接点击工具栏上的 Options for Target 按钮(齿轮图标)。在弹出的 Options for Target 对话框中,选择 C/C++ 标签页。在 Define 文本框中,添加以下宏定义(如果还没有的话): __FPU_PRESENT=1    __FPU_USED=1

使用特权

评论回复
9
hight1light| | 2024-8-10 16:19 | 只看该作者
你应该能够在Keil MDK中成功启用FPU浮点单元。启用FPU后,你的代码将能够利用硬件浮点运算,从而提高浮点运算的性能

使用特权

评论回复
10
tiakon| | 2024-8-10 16:30 | 只看该作者
确保 ARM_MATH_CM4 或相应的宏定义(根据你的MCU型号)也被定义

使用特权

评论回复
11
一切D都好| | 2024-8-10 21:17 | 只看该作者
切换到 Target 标签页。在 Floating Point Hardware 下拉菜单中,选择 Use FPU。在 Floating Point ABI 下拉菜单中,选择 Hard 或 SoftFP,具体取决于你的需求和硬件支持

使用特权

评论回复
12
hhdhy| | 2024-8-11 09:22 | 只看该作者
切换到 Asm 标签页。在 Define 文本框中,添加与 C/C++ 标签页相同的宏定义:__FPU_PRESENT=1 __FPU_USED=1

使用特权

评论回复
13
teaccch| | 2024-8-12 11:00 | 只看该作者
一般是需要在keil里配置就好了

使用特权

评论回复
14
星星点点didi| | 2024-8-12 19:05 | 只看该作者
其实你应直接用例程,直接用其开发环境来操作就好了

使用特权

评论回复
15
wamed| | 2024-8-14 10:14 | 只看该作者
一般来说都是在keil里进行配置的,不然启动不了

使用特权

评论回复
16
呐咯密密| | 2024-8-14 10:18 | 只看该作者
勾选single precision”之后应该就直接开启了,不需要额外操作了

使用特权

评论回复
17
gra22ce| | 2024-8-14 17:30 | 只看该作者
官方的例程里没有开启浮点单元的操作吗?

使用特权

评论回复
18
eleg34ance| | 2024-8-15 13:26 | 只看该作者
都是编译器开启的,要是没开启,就使用不了FPU哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

123

帖子

1

粉丝