打印
[应用相关]

STM32使用ARM优化数学库arm_math.h函数库配置指南

[复制链接]
1148|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
为什么要用到这个库
这段时间在调Robomaster的电机,用的是大疆的F427主控,角度控制为了达到快速精准的效果,需要将PID的一个段写成非线性的方式,要用到"math.h"库当中的pow函数,但是使用KEIL自带的math.h对于单片机来说效率并不高,可能过多占用MCU,经了解,发现ARM提供了一个专为单片机设计的基于CM4内核的一个数学库,可以基于内核级别的数**算优化,比传统的数学库速度快十到百倍左右,于是学习了一下调用这个函数库的一些步骤。

关于这个函数库的详细信息,请移步官网:https://www.keil.com/pack/doc/CMSIS/DSP/html/arm__math_8h.html


使用特权

评论回复
沙发
我喜欢打游戏|  楼主 | 2023-3-28 11:23 | 只看该作者
开始配置
废话不多说,我们先来看看存放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支持:
#define __FPU_USED       1U

这样,编译部分的修改就已经完成了。之后就是添加头文件路径和源文件路径,这里就只需要添加一个头文件路径即可,整个函数库共用这几个头文件。


接下来添加需要的源文件,至于源文件需要哪些,就要看自己的需要了,一共有下面着这一些文件夹,把自己需要的加入工程即可,全部加进来编译时间翻倍,不建议全部添加,具体的函数功能打开源文件有英文描述,非常的清晰。



全部工作做好后,就可以编译了,然后会发现编译仍然报错,提示未定义的宏,到错误处,发现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函数了。

使用特权

评论回复
板凳
我喜欢打游戏|  楼主 | 2023-3-28 11:24 | 只看该作者
总结
经过前面的探索,我总结一下配置的步骤:

添加全局宏:USE_HAL_DRIVER,STM32F427xx,__CC_ARM,__TARGET_FPU_VFP,__FPU_PRESENT,ARM_MATH_CM4

注释或者删除stm32f427xx.h中关于的__FPU_PRESENT定义

添加头文件路径

添加工程需要的math源文件,ARM已经帮我们按文件夹分好类了

在工程中引入头文件#include “arm_math.h”

开始使用库中的函数

使用特权

评论回复
地板
Clyde011| | 2024-1-27 09:16 | 只看该作者

整流器或功率开关管与每个电容端的连线长度和宽度都要一样

使用特权

评论回复
5
万图| | 2024-1-27 11:12 | 只看该作者

交流电流环路的布线要在其他引线之前布好

使用特权

评论回复
6
Uriah| | 2024-1-27 12:15 | 只看该作者

其他的信号和地要与这些高压引线和它的散热部分隔开

使用特权

评论回复
7
Uriah| | 2024-1-27 12:15 | 只看该作者

其他的信号和地要与这些高压引线和它的散热部分隔开

使用特权

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

本版积分规则

75

主题

611

帖子

0

粉丝