# ARM DSP 库逐文件说明

本合集包含用户提供的19个原始预编译库。它们主要是相同CMSIS-DSP接口针对不同目标配置的实现，不是19种各自独立的算法。

本课程STM32F103C8T6选择arm_cortexM3l_math.lib。配套FFT驱动包已有该库及头文件。

命名：l为小端、b为大端；M4的f为单精度FPU；M7的fsp/fdp分别为单精度/双精度FPU目标。Armv8-M Mainline中单独的d表示DSP指令扩展，不能解释为双精度。

无FPU构建并不等于没有浮点函数；浮点计算可由软件完成。fdp表示硬件编译目标，并不使所有API都变成double。

以下对应关系来自配套arm_math.h（V1.5.3）中的库说明，可对照Arm官方旧版CMSIS-DSP文档：
https://arm-software.github.io/CMSIS_5/5.7.0/DSP/html/index.html

## 01. arm_cortexM0l_math.lib

- 内核：Cortex-M0 / M0+
- 端序：小端
- 硬件配置：无硬件FPU
- 目标宏：ARM_MATH_CM0 / ARM_MATH_CM0PLUS

用于小端M0或M0+工程，按实际内核选择宏。浮点运算由软件完成，不要求硬件FPU。

## 02. arm_cortexM0b_math.lib

- 内核：Cortex-M0 / M0+
- 端序：大端
- 硬件配置：无硬件FPU
- 目标宏：ARM_MATH_CM0 / ARM_MATH_CM0PLUS

对应大端M0或M0+构建。仅在芯片及整个工程确实采用大端配置时选择，不能替代小端库。

## 03. arm_cortexM3l_math.lib

- 内核：Cortex-M3
- 端序：小端
- 硬件配置：无硬件FPU
- 目标宏：ARM_MATH_CM3

本课程STM32F103C8T6使用此库，FFT驱动包已经包含。与作者ARM Compiler 5工程和配套头文件一起使用。

## 04. arm_cortexM3b_math.lib

- 内核：Cortex-M3
- 端序：大端
- 硬件配置：无硬件FPU
- 目标宏：ARM_MATH_CM3

用于大端Cortex-M3构建。本课程F103小端工程不选此文件，也不能靠改文件名转换端序。

## 05. arm_cortexM4l_math.lib

- 内核：Cortex-M4
- 端序：小端
- 硬件配置：不使用硬件FPU的构建
- 目标宏：ARM_MATH_CM4

用于小端M4工程的无FPU构建。M4的整数DSP能力与FPU是两回事；没有f后缀不等于只提供整数函数。

## 06. arm_cortexM4b_math.lib

- 内核：Cortex-M4
- 端序：大端
- 硬件配置：不使用硬件FPU的构建
- 目标宏：ARM_MATH_CM4

用于大端M4工程的无FPU构建，需同时匹配目标端序和编译器调用约定。

## 07. arm_cortexM4lf_math.lib

- 内核：Cortex-M4
- 端序：小端
- 硬件配置：单精度FPU
- 目标宏：ARM_MATH_CM4

用于具备并启用单精度FPU的小端M4配置。工程的FPU与浮点ABI须与库兼容；仅声明float变量不代表应选此库。

## 08. arm_cortexM4bf_math.lib

- 内核：Cortex-M4
- 端序：大端
- 硬件配置：单精度FPU
- 目标宏：ARM_MATH_CM4

用于大端M4加单精度FPU配置，是M4lf的端序变体，不能混入小端工程。

## 09. arm_cortexM7l_math.lib

- 内核：Cortex-M7
- 端序：小端
- 硬件配置：不使用硬件FPU的构建
- 目标宏：ARM_MATH_CM7

用于小端M7的无FPU构建。与lfsp和lfdp不同，选择依据是实际目标配置，而非只看内核型号。

## 10. arm_cortexM7b_math.lib

- 内核：Cortex-M7
- 端序：大端
- 硬件配置：不使用硬件FPU的构建
- 目标宏：ARM_MATH_CM7

用于大端M7的无FPU构建，需要确认芯片支持并采用对应端序。

## 11. arm_cortexM7lfsp_math.lib

- 内核：Cortex-M7
- 端序：小端
- 硬件配置：单精度FPU
- 目标宏：ARM_MATH_CM7

用于小端M7单精度FPU配置，fsp表示单精度浮点硬件目标。不要把它与双精度fdp配置混用。

## 12. arm_cortexM7bfsp_math.lib

- 内核：Cortex-M7
- 端序：大端
- 硬件配置：单精度FPU
- 目标宏：ARM_MATH_CM7

用于大端M7单精度FPU配置，功能目标与lfsp相同，端序不同。

## 13. arm_cortexM7lfdp_math.lib

- 内核：Cortex-M7
- 端序：小端
- 硬件配置：双精度FPU目标
- 目标宏：ARM_MATH_CM7

用于小端M7双精度FPU配置。fdp描述库的硬件编译目标，不表示所有DSP接口或数据类型都自动变成double。

## 14. arm_cortexM7bfdp_math.lib

- 内核：Cortex-M7
- 端序：大端
- 硬件配置：双精度FPU目标
- 目标宏：ARM_MATH_CM7

用于大端M7双精度FPU配置，是lfdp的端序变体，需匹配目标FPU与ABI。

## 15. arm_ARMv8MBLl_math.lib

- 内核：Armv8-M Baseline
- 端序：小端
- 硬件配置：Baseline基本指令配置
- 目标宏：ARM_MATH_ARMV8MBL

用于Armv8-M Baseline小端目标。不要仅因同属Armv8-M就用于Mainline工程，架构配置不同。

## 16. arm_ARMv8MMLl_math.lib

- 内核：Armv8-M Mainline
- 端序：小端
- 硬件配置：不使用可选DSP扩展或FPU
- 目标宏：ARM_MATH_ARMV8MML

用于Mainline小端基础构建，区别于带d的DSP扩展版本和带fsp的FPU版本。

## 17. arm_ARMv8MMLld_math.lib

- 内核：Armv8-M Mainline
- 端序：小端
- 硬件配置：DSP指令扩展，无FPU构建
- 目标宏：ARM_MATH_ARMV8MML

用于实现了DSP扩展的Mainline目标。ld中的l表示小端、d表示DSP指令，d不是双精度；设备头文件的__DSP_PRESENT需与硬件一致。

## 18. arm_ARMv8MMLlfsp_math.lib

- 内核：Armv8-M Mainline
- 端序：小端
- 硬件配置：单精度FPU，不使用可选DSP扩展
- 目标宏：ARM_MATH_ARMV8MML

用于单精度FPU构建，文件名没有d，不能与启用DSP扩展的ldfsp版本混淆。

## 19. arm_ARMv8MMLldfsp_math.lib

- 内核：Armv8-M Mainline
- 端序：小端
- 硬件配置：DSP指令扩展 + 单精度FPU
- 目标宏：ARM_MATH_ARMV8MML

用于同时实现DSP扩展与单精度FPU的Mainline目标。d和fsp分别代表两项能力，设备宏、FPU及ABI配置都需匹配。

## 接入与兼容性

将选中的库加入Keil工程，保留原有CMSIS和HAL路径，添加配套DSP头文件路径与目标宏。大端构建还应匹配ARM_MATH_BIG_ENDIAN；Armv8-M的__DSP_PRESENT等设备能力声明必须符合真实硬件，不应为了通过编译强行开启。

作者FFT工程使用ARM Compiler 5.06 update 6。未逐一测试合集其他库；更换编译器、端序、FPU或浮点ABI后需要重新核对兼容性。不要把全部lib加入同一个工程，也不要重复链接同一算法的源码和预编译实现。

原始lib字节保持不变。原文件版权与对应组件许可继续适用。
