打印

GD32关于FPU的使用

[复制链接]
8368|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenyilin|  楼主 | 2018-10-11 23:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
资料来源于微信公众号“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是否打开。ajlink调试控制界面下,输入语句mem32 0XE000ED88  1具体看下图,得到为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 | 只看该作者
谢谢分享,,,,先学习,

使用特权

评论回复
5
zeshoufx| | 2019-4-30 18:40 | 只看该作者
你好,,,按照你说的,,做了,,,没开启成功

使用特权

评论回复
6
lvben5d| | 2019-4-30 19:49 | 只看该作者
我用的是 GD32E103  在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1   

使用特权

评论回复
7
戈卫东| | 2019-5-2 07:44 | 只看该作者
lvben5d 发表于 2019-4-30 19:49
我用的是 GD32E103  在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1

会HARD FAULT的吧?

使用特权

评论回复
8
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_USED  0
但是 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 的  可是 #if  defined ( __CC_ARM )    且里面的宏 都有!!  唯一的解释是 这个头文件的编译 先于我们 Option for Target "" -> C/C++(AC6)  里的预编译了!


123.png (71.96 KB )

123.png

使用特权

评论回复
9
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打开。

使用特权

评论回复
10
girllily| | 2020-4-10 10:50 | 只看该作者
大家好,我按照楼主的方法修改了,但还是不能用FPU,一使用float就进入硬件中断错误。有不有实际可运行的工程模板提供借鉴一下呢?

使用特权

评论回复
11
明明很讨厌| | 2020-4-10 16:27 | 只看该作者
附件里有详细的说明

GD32使用FPU以及DSP库的操作方法.pdf

834.12 KB

使用特权

评论回复
12
girllily| | 2020-4-11 16:15 | 只看该作者
明明很讨厌 发表于 2020-4-10 16:27
附件里有详细的说明

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

使用特权

评论回复
13
木头119| | 2022-5-17 18:44 | 只看该作者
开启成功了,但是修改了主程序加载启动地址就在入栈出栈得时候报硬件错误了,不知道哪里得原因导致得。

使用特权

评论回复
14
陈吉Ch| | 2024-11-7 11:29 | 只看该作者
原贴虽久远,看到还是回一个吧。
如果是使用了FreeRTOS的话,默认会开启单精度浮点运算单元的,在
xPortStartScheduler()
函数中会调用
vPortEnableVFP();
,函数内容:
vPortEnableVFP:
        /* The FPU enable bits are in the CPACR. */
        ldr.w r0, =0xE000ED88
        ldr        r1, [r0]

        /* Enable CP10 and CP11 coprocessors, then save back. */
        orr        r1, r1, #( 0xf << 20 )
        str r1, [r0]
        bx        r14

所以,只需要直接找到DSP函数库加入工程,再在要使用的地方包含arm_math.h,就可以调用DSP函数了。

使用特权

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

本版积分规则

认证:GigaDevice
简介:兆易创新科技集团股份有限公司 (股票代码603986) 是全球领先的Fabless芯片供应商,公司成立于2005年4月,总部设于中国北京

17

主题

55

帖子

3

粉丝