使用STM32F4XX自带数学库"arm_math.h"

本文介绍如何利用STM32F4的FPU特性结合arm_math.h库提升数学运算性能。文章详细说明了配置步骤,包括开启FPU、设置编译选项及添加库文件等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自搜狐博客Enjoy Yourself~

使用STM32F4XX自带数学库"arm_math.h"

   

    STM32-F4属于Cortex-M4F构架,这与M0、M3的最大不同就是具有FPU(浮点运算单元),支持浮点指令集,因此在处理数学运算时能比M0/M3高出数十倍甚至上百倍的性能,但是要充分发挥FPU的数学性能,除了#include “arm_math.h”(而非用编译器自带的math.h)以外,(arm_math.h位于\Libraries\CMSIS\Include文件夹)还需要进行设置。

    

1、代码设置
    如果没有启动FPU而使用数学函数运算时,CPU执行时认为遇到非法指令而跳转到HardFault_Handler()中断函数中死循环。因此,需要在系统初始化时开启FPU。在system_stm32f4xx.c中的SystemInit()函数中添加如下代码:
  /* FPU settings ------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 Full Access */
  #endif
 
2、编译控制
    从上面的代码可以看出,当__FPU_PRESENT=1__FPU_USED=1时,编译时就加入了启动FPU的代码,CPU也就能正确高效的使用FPU进行简单的加减乘除了。但是对于复杂运算要充分发挥M4F的浮点功能,就需要使用固件库自带的arm_math.h而非编译器自带的math.h,这个文件根据编译控制项(__FPU_USED ==1)来决定是使用哪一种函数方法:如果没有使用FPU,那就调用keil的标准math.h头文件中定义的函数;如果使用了FPU,那就是用固件库自带的优化函数来解决问题。
    在arm_math.h开头部分有一些编译控制信息:
#ifndef _ARM_MATH_H
#define _ARM_MATH_H

#define __CMSIS_GENERIC              /* disable NVIC and Systick functions */

#if defined (ARM_MATH_CM4)
  #include "core_cm4.h"
#elif defined (ARM_MATH_CM3)
  #include "core_cm3.h"
#elif defined (ARM_MATH_CM0)
  #include "core_cm0.h"
#else
#include "ARMCM4.h"
#warning "Define either ARM_MATH_CM4 OR ARM_MATH_CM3...By Default building on ARM_MATH_CM4....."
#endif

#undef  __CMSIS_GENERIC              /* enable NVIC and Systick functions */
  #include "string.h"
  #include "math.h"


    从中可以看出,为了使用STM32F4的arm_math.h,我们需要定义ARM_MATH_CM4;否则如果不使用CMSIS的库,就会调用Keil自带的math.h。

    另外,定义控制项__CC_ARM在某些数学函数中会使用VSQRT指令(浮点运算指令),运算速度比Q指令要快很多。
    总结一下,需要在Project->Options for target"XXXX")中的C/C++选项卡的Preprocessor Symbols栏的Define中加入如下的语句:ARM_MATH_CM4, __FPU_PRESENT=1, __FPU_USED =1, __CC_ARM

    

3、添加库
    根据使用的器件和运算模式,添加arm_cortexMxx_math.lib到工程文件中,位于\Libraries\CMSIS\Lib\ARM中。


   * The library installer contains prebuilt versions of the libraries in the <code>Lib</code> folder.
   * - arm_cortexM4lf_math.lib (Little endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4bf_math.lib (Big endian and Floating Point Unit on Cortex-M4)
   * - arm_cortexM4l_math.lib (Little endian on Cortex-M4)
   * - arm_cortexM4b_math.lib (Big endian on Cortex-M4)
   * - arm_cortexM3l_math.lib (Little endian on Cortex-M3)
   * - arm_cortexM3b_math.lib (Big endian on Cortex-M3)
   * - arm_cortexM0l_math.lib (Little endian on Cortex-M0)
   * - arm_cortexM0b_math.lib (Big endian on Cortex-M3)


注:如果存储空间不允许,也可以不添加库,只添加\Libraries\CMSIS\DSP_Lib\Source中需要的源文件和arm_math.h。
    其他DSP使用示例见\Libraries\CMSIS\DSP_Lib\Examples。

 

下图所示为DSP_Lib的文件结构

BasicMathFunctions
提供浮点数的各种基本运算函数,如加减乘除等运算。对于M0/M3只能用Q运算,即文件夹下以_q7、_q15和_q31结尾的文件;而M4F能直接硬件浮点计算,属于文件夹下以_f32结尾的文件。
CommonTables
arm_common_tables.c文件提供位翻转或相关参数表。
ComplexMathFunctions
复述数学功能,如向量处理,求模运算的。
ControllerFunctions
控制功能,主要为PID控制函数。arm_sin_cos_f32/-q31.c函数提供360点正余弦函数表和任意角度的正余弦函数值计算功能。
FastMathFunctions
快速数学功能函数,提供256点正余弦函数表和任意任意角度的正余弦函数值计算功能,和Q值开平方运算:
Arm_cos_f32/_q15/_q31.c:提供256点余弦函数表和任意角度余弦值计算功能。
Arm_sin_f32/_q15/_q31.c:提供256点正弦函数表和任意角度正弦值计算功能。
Arm_sqrt_q15/q31.c:提供迭代法计算平方根的函数。对于M4F的平方根运算,通过执行VSQRT指令完成。
FilteringFunctions
滤波函数功能,主要为FIR和LMS(最小均方根)滤波函数。
MatrixFunctions
矩阵处理函数。
StatisticsFunctions
统计功能函数,如求平均值、计算RMS、计算方差/标准差等。
SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q任意格式相互转换。
TransformFunctions
变换功能。包括复数FFT(CFFT)/复数FFT逆运算(CIFFT)、实数FFT(RFFT)/实数FFT逆运算(RIFFT)、和DCT(离散余弦变换)和配套的初始化函数。

 

                                                           BY: JOY 2013年8月28日

<think>首先,用户的问题是关于在arm_math.h文件中缺少ARM_MATH_CM33选项,并询问如何在其中添加或启用它。用户参考了几个引用,我需要回顾这些引用来提供帮助。引用的关键点:-**引用[1]**:描述了在使用Keil时调用arm_math.h库的问题,通过更换CMSIS版本和启用DSP库解决。这涉及管理库版本和配置。-**引用[2]**:讨论了SES(可能指SEGGEREmbeddedStudio)中使用arm_math库,描述了错误状态和矩阵结构体。这对理解arm_math.h的结构有帮助。-**引用[3]**:解释了如何添加DSP库启用arm_math.h,包括在预编译符号中添加__TARGET_FPU_VFP和ARM_MATH_CM4,基于单片机的架构(如STM32F4)。这与用户问题直接相关,因为用户需要为CM33架构添加选项。用户的核心需求:如何在arm_math.h中添加或启用ARM_MATH_CM33选项。用户提到"缺少",意思是没有现成的选项,所以可能需要修改文件或配置环境。理解ARM_MATH_CM33:CM33指的是Cortex-M33架构。在arm_math.h中,有类似ARM_MATH_CM4、ARM_MATH_CM7等的定义用于不同的处理器架构。ARM_MATH_CM33可能没有默认定义,或者需要在特定条件下启用。从引用[3]中,我看到在预编译符号中添加了ARM_MATH_CM4。所以,对于CM33,需要在开发环境中设置预定义宏。可能的步骤在回答中:1.**确认环境**:用户使用的是Keil(从引用[1]推断)或其他IDE。用户提到了Keil,所以我假设是Keil。2.**修改预编译符号**:像引用[3]所说,添加预定义宏来指定架构。对于Cortex-M33,宏可能是ARM_MATH_CM33。我需要确认是否支持。-在CMSIS中,支持的架构通常有定义,如__CM33_REV或其他。但ARM_MATH_CM33应该是为库配置的宏。3.**在IDE中设置**:-对于Keil:OptionsforTarget>C/C++>Define中添加ARM_MATH_CM33。-如果使用其他IDE,类似添加预定义宏。4.**检查库支持**:确保使用的CMSIS和DSP库版本支持CM33。引用[1]提到了使用不同版本解决问题。5.**修改arm_math.h**:如果宏没有效果,可能需要编辑头文件本身添加定义。但这应该被视为最后手段。回答结构:-步骤清晰,逐步指导。-参考相关引用。-使用中文,因为指令要求用中文。-确保LaTeX格式正确:数学表达式用$...$,独立公式用$$...$$。-在回答后生成相关问题。回答内容:1.**引言**:确认问题,解释解决方法。2.**步骤**:a.检查IDE设置。b.添加预编译符号。c.更新库版本。d.必要时修改arm_math.h。3.**引用引用**:自然添加引用标识。4.**相关问题生成**:创建2-3个相关问题。相关问题想法:1.如何为不同ARM架构启用DSP支持?2.在Keil中配置CMSIS库的最佳实践?3.如何解决编译错误与arm_math.h?</think> ### 解决在 arm_math.h 中启用 ARM_MATH_CM33 选项的问题 您遇到的问题是 arm_math.h 文件中缺少 ARM_MATH_CM33 选项(针对 Cortex-M33 架构)。这通常是由于开发环境未正确定义预编译宏或 CMSIS 库版本未提供支持导致的。根据您的引用内容(Keil 环境和 STM32F4 处理器的配置),以下是逐步解决方法。ARM_MATH_CM33 选项用于为 Cortex-M33 处理器启用 DSP 支持,核心思路是在预编译阶段添加宏定义或更新库文件。下面是具体步骤: #### 步骤 1: 检查并更新 CMSIS 库版本 - **问题**:旧版 CMSIS 库可能不支持 CM33 架构。引用的示例中使用 CMSIS 5.4.0 或 5.6.0,但为 CM33 需确认支持版本。 - **解决方法**: - 下载并安装最新的 CMSIS 包(建议 ARM.CMSIS 5.8.0 或更高,支持 Cortex-M33)。CMSIS 更新后会包含 CM33 的宏定义。 - 在 Keil 中管理库:转到 `Manage Run-Time Environment` > 勾选 `ARM::CMSIS` 和 `DSP_Lib`,选择最新版本。 - 参考引用 [1] 的提示:低版本库可能兼容性差,升级是首选方案 [^1]。 #### 步骤 2: 在 Keil 中添加预编译宏 - **问题**:arm_math.h 需要通过宏 `ARM_MATH_CM33` 识别架构,类似引用 [3] 中的 `ARM_MATH_CM4` 对 F4 系列的处理。 - **解决方法**: - 打开 Keil,导航到 `Options for Target` > `C/C++` 选项卡。 - 在 `Preprocessor Symbols - Define` 字段中添加以下宏(逗号分隔): ``` __TARGET_FPU_VFP,ARM_MATH_CM33,ARM_MATH_MATRIX_CHECK ``` - 其中: - `__TARGET_FPU_VFP`:启用硬件浮点单元(Cortex-M33 支持 FPU)。 - `ARM_MATH_CM33`:直接为库指定 CM33 架构(添加后 arm_math.h 会识别)。 - `ARM_MATH_MATRIX_CHECK`:可选,用于矩阵操作错误检测(参考引用 [2] 的错误状态枚举)[^2]。 - 确认宏添加后重新编译。如果宏定义正确,arm_math.h 将自动启用 CM33 相关代码路径。 #### 步骤 3: 手动修改 arm_math.h 文件(可选,谨慎使用) - **问题**:如果 CMSIS 更新后仍无 `ARM_MATH_CM33`,可能需临时修改头文件。 - **解决方法**: - 打开 arm_math.h(文件路径通常为 `Keil/ARM/CMSIS/<version>/Include/arm_math.h`)。 - 在文件顶部或架构定义部分(搜索类似 `#if defined(ARM_MATH_CM4)` 的代码块),添加以下代码: ```c #if !defined(ARM_MATH_CM33) #define ARM_MATH_CM33 #endif ``` - 或者,直接添加: ```c #if defined(__CM33_REV) || defined(ARM_MATH_CM33) // CM33-specific DSP functions #endif ``` - 保存文件并重新编译。 - **注意**:直接修改库文件可能导致兼容性问题或更新后失效。建议优先通过预编译宏解决(步骤 2),参考引用 [3] 关于预定义符号的最佳实践 [^3]。 #### 关键提示 - **环境依赖**:确保使用STM32F4 包或类似设备包支持 Cortex-M33。检查开发板是否基于 CM33(如 STM32L5 系列)。 - **错误处理**:编译后如有错误,检查引用 [2] 的错误状态(如 `ARM_MATH_ARGUMENT_ERROR`),这可能提示库版本或宏定义错误。 - **性能优化**:启用 CM33 后,参考引用 [2] 的结构体(如 `arm_matrix_instance_f32`)可优化 DSP 算法性能 [^2]。 ### 相关问题 1. 如何在 Keil 中为不同 ARM 架构(如 Cortex-M7 或 Cortex-M33)配置 CMSIS 和 DSP 库? 2. 解决 arm_math.h 编译错误(如 “undeclared identifier”)的常见方法有哪些? 3. Cortex-M33 的硬件特性如何影响 DSP 库的使用和优化?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值