开始配置
废话不多说,我们先来看看存放Cortex内核核心外设使用的"core_cm4.h"文件:
#if defined ( __CC_ARM )
#if defined __TARGET_FPU_VFP
#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
#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
#endif
//
第一个__CC_ARM,是选择KEIL作为编译器的分支,因此我们需要在工程宏定义中添加__CC_ARM的宏定义。然后__TARGET_FPU_VFP也是必须要添加到宏定义中的。
再来说说__FPU_PRESENT和__FPU_USED这两个宏定义的作用吧,__FPU_PRESENT在编译时,编译系统用于判断该设备是否拥有FPU运算功能,也就是说,它作为编译是否加入FPU的总开关,因此我们需要加入这个宏,并且将它设为1。
但是仔细看看,stm32f427xx.h文件中已经有了这个宏定义,表示stm32f427系列是支持FPU功能的:
#define __CM4_REV 0x0001U /*!< Core revision r0p1 */
#define __MPU_PRESENT 1U /*!< STM32F4XX provides an MPU */
#define __NVIC_PRIO_BITS 4U /*!< STM32F4XX uses 4 Bits for the Priority Levels */
#define __Vendor_SysTickConfig 0U /*!< Set to 1 if different SysTick Config is used */
#define __FPU_PRESENT 1U /*!< FPU present //需要注释掉
但是编辑器显示core_cm4.h直接跳到#else里面了,也就是说编译器执行到这里不认为已经定义了__FPU_PRESENT,这是由于内核文件并不会包含中间驱动的宏定义的,所以我们需要在全局添加宏定义并且赋值为1:__FPU_PRESENT=1,然后编译时编译器会报错,因为重复定义了__FPU_PRESENT,所以我们把stm32f427xx.h中的__FPU_PRESENT注释掉:
//#define __FPU_PRESENT 1U /*!< FPU present
这样就不会编译报错了,这样,内核编译时就会定义启动内核的FPU支持:
这样,编译部分的修改就已经完成了。之后就是添加头文件路径和源文件路径,这里就只需要添加一个头文件路径即可,整个函数库共用这几个头文件。
接下来添加需要的源文件,至于源文件需要哪些,就要看自己的需要了,一共有下面着这一些文件夹,把自己需要的加入工程即可,全部加进来编译时间翻倍,不建议全部添加,具体的函数功能打开源文件有英文描述,非常的清晰。
全部工作做好后,就可以编译了,然后会发现编译仍然报错,提示未定义的宏,到错误处,发现arm_math.h文件中有这么一段宏判断:
#if defined(ARM_MATH_CM7)
#include "core_cm7.h"
#define ARM_MATH_DSP
#elif defined (ARM_MATH_CM4)
#include "core_cm4.h"
#define ARM_MATH_DSP
#elif defined (ARM_MATH_CM3)
#include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
#include "core_cm0.h"
#define ARM_MATH_CM0_FAMILY
#elif defined (ARM_MATH_CM0PLUS)
#include "core_cm0plus.h"
#define ARM_MATH_CM0_FAMILY
#elif defined (ARM_MATH_ARMV8MBL)
#include "core_armv8mbl.h"
#define ARM_MATH_CM0_FAMILY
#elif defined (ARM_MATH_ARMV8MML)
#include "core_armv8mml.h"
#if (defined (__DSP_PRESENT) && (__DSP_PRESENT == 1))
#define ARM_MATH_DSP
#endif
#else
#error "Define according the used Cortex core ARM_MATH_CM7, ARM_MATH_CM4, ARM_MATH_CM3, ARM_MATH_CM0PLUS, ARM_MATH_CM0, ARM_MATH_ARMV8MBL, ARM_MATH_ARMV8MML"
#endif
而ARM_MATH_DMP又是作为arm_math库的开关,所以我们需要全局宏定义ARM_MATH_CM4来开启。
最后,引入"arm_math.h"头文件,然后再编译,通过。然后就可以使用自己添加进工程的arm版本的math函数了。 |