GD32关于FPU的使用

[复制链接]
1187|8
 楼主 | 2018-10-11 23:20 | 显示全部楼层 |阅读模式
资料来源于微信公众号“life_and_family”,更多相关资料可以关注下该公众号。
在GD32中的F3系列插件有两个版本,最开始的版本是不支持FPU的,后来的升级版才支持,如果现在的版本在targer中找不到下列的选项,那么就重新安装插件。而F4系列插件完全支持FPU。 24385bbf6924264bf.png
打开DFU的步骤 1.在选项中找到上述的页面,选择使用use single precision。以下使用的是KEIL5的编译器,其他版本的也是类似。
849065bbf69383e9f3.png
2.使用F3系列,需要加入两条语句在gd32f3xx.h中加入#define__FPU_PRESENT   1 616885bbf6958afa9f.png
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
如下图所示 300965bbf697dc41b4.png
使用F4系列gd32f4xx.h中加入#define__FPU_PRESENT   1 312815bbf6998c3835.png
3.重新编译下载烧录即可。4.检查FPU是否打开。ajlink调试控制界面下,输入语句mem32 0XE000ED88  1具体看下图,得到为00F0 0000的值,证明FPU已经开启。 343205bbf69bc740f3.png
b.GD link的调试下在进入仿真阶段后, 300095bbf69e285f85.png
点击下方memory ,在address 中输入0XE000ED88
137335bbf6a024b081.png
出现上述圈中的词证明FPU已经打开。
资料来源于微信公众号“life_and_family”,更多相关资料可以关注下该公众号。
qrcode_for_gh_021480546f41_258.jpg




| 2018-10-12 09:42 | 显示全部楼层
这个公众号是官网的么?还是个人的

使用特权

评论回复
| 2018-11-7 09:36 | 显示全部楼层
多谢分享              

使用特权

评论回复
| 2018-12-4 10:47 | 显示全部楼层
谢谢分享,,,,先学习,

使用特权

评论回复
| 2019-4-30 18:40 | 显示全部楼层
你好,,,按照你说的,,做了,,,没开启成功

使用特权

评论回复
| 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的吧?

使用特权

评论回复
| 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

使用特权

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

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

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