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”,更多相关资料可以关注下该公众号。
这个公众号是官网的么?还是个人的 多谢分享 谢谢分享,,,,先学习, 你好,,,按照你说的,,做了,,,没开启成功 我用的是 GD32E103在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1 lvben5d 发表于 2019-4-30 19:49
我用的是 GD32E103在C++预编译里面输入__TARGET_FPU_VFP,__FPU_PRESENT=1
会HARD FAULT的吧? 本帖最后由 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: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打开。
大家好,我按照楼主的方法修改了,但还是不能用FPU,一使用float就进入硬件中断错误。有不有实际可运行的工程模板提供借鉴一下呢? 附件里有详细的说明
明明很讨厌 发表于 2020-4-10 16:27
附件里有详细的说明
按照说明的方法配置了,但是FPU一直都开启不了。后面换了一个芯片换成了GD32F307,程序什么都没改,FPU就开启了能使用了。后面百度看到别人说GD32F303有个坑,可能2017年前的芯片就不能FPU,后面的才可以FPU。不确定是不是公司采购买到的303是不是以前库存的了.... 开启成功了,但是修改了主程序加载启动地址就在入栈出栈得时候报硬件错误了,不知道哪里得原因导致得。 原贴虽久远,看到还是回一个吧。
如果是使用了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]