chenyilin 发表于 2018-10-11 23:20

GD32关于FPU的使用

资料来源于微信公众号“life_and_family”,更多相关资料可以关注下该公众号。在GD32中的F3系列插件有两个版本,最开始的版本是不支持FPU的,后来的升级版才支持,如果现在的版本在targer中找不到下列的选项,那么就重新安装插件。而F4系列插件完全支持FPU。
打开DFU的步骤 1.在选项中找到上述的页面,选择使用use single precision。以下使用的是KEIL5的编译器,其他版本的也是类似。
2.使用F3系列,需要加入两条语句在gd32f3xx.h中加入#define__FPU_PRESENT   1在system_gd32f30x.c中的SystemInit()中加入/* FPU settings */ //如果库中没有这条语句,就需要加上#if (__FPU_PRESENT== 1) && (__FPU_USED == 1)    SCB->CPACR |= ((3UL << 10*2)|(3UL<< 11*2));/* set CP10 and CP11Full Access */#endif
如下图所示使用F4系列在gd32f4xx.h中加入#define__FPU_PRESENT   1
3.重新编译下载烧录即可。4.检查FPU是否打开。a在jlink调试控制界面下,输入语句mem32 0XE000ED881具体看下图,得到为00F0 0000的值,证明FPU已经开启。b.在GD link的调试下在进入仿真阶段后,点击下方memory ,在address 中输入0XE000ED88

出现上述圈中的词证明FPU已经打开。资料来源于微信公众号“life_and_family”,更多相关资料可以关注下该公众号。



gxp6604 发表于 2018-10-12 09:42

这个公众号是官网的么?还是个人的

yanyanyan168 发表于 2018-11-7 09:36

多谢分享            

zeshoufx 发表于 2018-12-4 10:47

谢谢分享,,,,先学习,

zeshoufx 发表于 2019-4-30 18:40

你好,,,按照你说的,,做了,,,没开启成功

lvben5d 发表于 2019-4-30 19:49

我用的是 GD32E103在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1   

戈卫东 发表于 2019-5-2 07:44

lvben5d 发表于 2019-4-30 19:49
我用的是 GD32E103在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1

会HARD FAULT的吧?

lvben5d 发表于 2019-5-2 08:36

本帖最后由 lvben5d 于 2019-5-2 08:54 编辑

戈卫东 发表于 2019-5-2 07:44
会HARD FAULT的吧?
我用的是 GD32E103,进头文件就知道core_cm4.H内核文件里的宏定义OK。keil 5 5.2版本后修改的好处是,你的预编译选择 会影响 代码是暗灰色还是 正常的亮"黑"色。暗灰色表示你的代码没有进入编译!我刚才发现 如果选complier version 5去编译我们的keil5 工程,__TARGET_FPU_VFP,__FPU_PRESENT=1   这样是对的。但是现在估计大多数兄弟用的都是keil 5.2之后的版本,使用complier version 6(编译速度快的飞起),core_cm4.H里会重复定义 #define __FPU_USED0
但是 GD32E103 system_gd32e10x.c文件里
void SystemInit (void)
{
/* FPU settings */
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));/* set CP10 and CP11 Full Access */    这里没有变灰色。   
#endif

......
}

说明在Option for Target "" -> C/C++(AC6) 的预编译   在不同的文件里 产生了不同效果!!!!    complier5   complier6 居然会造成core_cm4.h 文件下面代码的编译内容不一样

#if defined ( __CC_ARM )      //keil5
#if defined __TARGET_FPU_VFP
    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
      #define __FPU_USED       1U               // complier5   会这里亮!!!
    #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
#endif
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#if defined __ARM_PCS_VFP
    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
      #define __FPU_USED       1U
    #else
      #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
      #define __FPU_USED       0U
    #endif
#else
    #define __FPU_USED         0U         // complier6   会这里亮!!!
#endif


百思不得其解, 毕竟先#if 的可是 #ifdefined ( __CC_ARM )    且里面的宏 都有!!唯一的解释是 这个头文件的编译 先于我们 Option for Target "" -> C/C++(AC6)里的预编译了!


lvben5d 发表于 2019-5-2 09:01

本帖最后由 lvben5d 于 2019-5-2 09:09 编辑

core_cm4.h 文件选择 complier 6 的情况下(大家基本现在都选ver 6)!!, 无论如何   #define __FPU_USED         0U都会显示!!    所以大家还是自己查看打开FPU寄存器和asm的地方 是否编译进去。no care 这个core_cm4.h   , 按照楼主的帖子,我在C++/AC6里输入的是全部的__FPU_PRESENT,__FPU_PRESENT=1,__FPU_USED,__FPU_USED=1可以 显示FPU打开。

girllily 发表于 2020-4-10 10:50

大家好,我按照楼主的方法修改了,但还是不能用FPU,一使用float就进入硬件中断错误。有不有实际可运行的工程模板提供借鉴一下呢?

明明很讨厌 发表于 2020-4-10 16:27

附件里有详细的说明

girllily 发表于 2020-4-11 16:15

明明很讨厌 发表于 2020-4-10 16:27
附件里有详细的说明

按照说明的方法配置了,但是FPU一直都开启不了。后面换了一个芯片换成了GD32F307,程序什么都没改,FPU就开启了能使用了。后面百度看到别人说GD32F303有个坑,可能2017年前的芯片就不能FPU,后面的才可以FPU。不确定是不是公司采购买到的303是不是以前库存的了....

木头119 发表于 2022-5-17 18:44

开启成功了,但是修改了主程序加载启动地址就在入栈出栈得时候报硬件错误了,不知道哪里得原因导致得。

陈吉Ch 发表于 2024-11-7 11:29

原贴虽久远,看到还是回一个吧。
如果是使用了FreeRTOS的话,默认会开启单精度浮点运算单元的,在xPortStartScheduler()函数中会调用vPortEnableVFP();,函数内容:vPortEnableVFP:
        /* The FPU enable bits are in the CPACR. */
        ldr.w r0, =0xE000ED88
        ldr        r1,

        /* Enable CP10 and CP11 coprocessors, then save back. */
        orr        r1, r1, #( 0xf << 20 )
        str r1,
        bx        r14
所以,只需要直接找到DSP函数库加入工程,再在要使用的地方包含arm_math.h,就可以调用DSP函数了。
页: [1]
查看完整版本: GD32关于FPU的使用