问答

汇集网友智慧,解决技术难题

21ic问答首页 - 发现一个AT32开启FPU(浮点单元)的奇怪问题!

发现一个AT32开启FPU(浮点单元)的奇怪问题!

showmyself2024-01-06

在官方的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?

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

回答 +关注 14
1052人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册