[STM32N6] 【STM32N6570-DK测评】音频录制与播放

[复制链接]
 楼主| xhackerustc 发表于 2025-5-11 21:51 | 显示全部楼层 |阅读模式
<
这个功能其实笔者已经实现,而且用的就是ST的测试用例,前面RNNOISE降噪的测评文章提到过。但那篇文章没有显式的提出,这里单独出一篇帖子简单提一提。

众所周知,STM32N6系列集成有MDF(Multi-function digital filter),然后阅读原理图发现STM32N6570-DK又板载了一颗MEMS芯片:MP23DB01HP,这是ST家的传感器产品之一,两者配合就可以做到录音功能了。
12.jpg

就播放来说,也很简单。原理图显示,STM32N6570-DK板载了一颗WM8904解码芯片,并有模拟信号上的耳机和喇叭接口,所以预先设置下WM8904芯片参数,然后pcm数据发SAI通道就能做到声音的播放了。
15.jpg

笔者用的是耳机通道
1193217274.jpg

事实上STM32Cube_FW_N6中的一个测试用例(Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/)展示了录音和播放的效果。它的主要过程是:

配置MDF、配置DMA、配置WM8904和SAI,然后开启MDF的DMA录音,一旦麦克风录到数据就由DMA搬运PcmBuffer中,再由SAI的DMA把PCM数据发SAI,如此循环往复。

这个测试用例是N6多媒体样例中最简单的,所以笔者之前并未单独列一篇测评文章给它,但它基本把音频录制和播放都展示了一遍,简单直接,大伙都喜欢。

另外笔者也未拉起CubeMX这样的大杀器,而是直接写了个CMakeLists.txt文件,这里贴出来和读者分享:
  1. set(CMAKE_SYSTEM_NAME Generic)
  2. set(CMAKE_SYSTEM_VERSION 1)
  3. set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
  4. cmake_minimum_required(VERSION 3.20)

  5. set(CMAKE_C_COMPILER arm-none-eabi-gcc)
  6. set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
  7. set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
  8. set(CMAKE_AR arm-none-eabi-ar)
  9. set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
  10. set(CMAKE_OBJDUMP arm-none-eabi-objdump)
  11. set(SIZE arm-none-eabi-size)

  12. set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  13. set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  14. set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  15. set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

  16. add_compile_options(-mthumb -mcpu=cortex-m55 -mfloat-abi=hard -mfpu=fpv5-d16 -mcmse)
  17. add_compile_options(-ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter)

  18. add_compile_options(-O2)

  19. project(stm32n6 C ASM)
  20. set(CMAKE_CXX_STANDARD 11)
  21. set(CMAKE_C_STANDARD 99)

  22. include_directories(Drivers/CMSIS/Include
  23.                     Drivers/CMSIS/Device/ST/STM32N6xx/Include
  24.                     Drivers/STM32N6xx_HAL_Driver/Inc
  25.                     Drivers/BSP/STM32N6570-DK
  26.                     Drivers/BSP/Components/wm8904
  27.                     Drivers/BSP/Components/Common
  28.                     Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/FSBL/Inc)

  29. add_definitions(-DSTM32N657xx)

  30. file(GLOB_RECURSE SOURCES
  31.                 "Drivers/STM32N6xx_HAL_Driver/Src/*.c"
  32.                 "Drivers/BSP/STM32N6570-DK/stm32n6570_discovery.c"
  33.                 "Drivers/BSP/STM32N6570-DK/stm32n6570_discovery_bus.c"
  34.                 "Drivers/BSP/Components/wm8904/*.c"
  35.                 "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/FSBL/Src/*.c"
  36.                 "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/STM32CubeIDE/FSBL/Application/User/*.c"
  37.                 "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/STM32CubeIDE/FSBL/Application/Startup/startup_stm32n657x0hxq_fsbl.s"
  38.                 )

  39. set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Projects/STM32N6570-DK/Examples/BSP/STM32CubeIDE/FSBL/STM32N657X0HXQ_AXISRAM2_fsbl.ld)
  40. add_link_options(
  41.                 -mthumb -mcpu=cortex-m55 -mfloat-abi=hard -mfpu=fpv5-d16 -mcmse
  42.                 -Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
  43.                 --specs=nano.specs
  44.                 --specs=nosys.specs)
  45. add_link_options(-T ${LINKER_SCRIPT})

  46. add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

  47. # target_link_libraries(${PROJECT_NAME}.elf printfloat)

  48. set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
  49. set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
  50. set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
  51. add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
  52.         COMMAND ${CMAKE_OBJCOPY} -Oihex lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
  53.         COMMAND ${CMAKE_OBJCOPY} -Obinary lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
  54.         COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
  55.         COMMAND ${SIZE} --format=berkeley lt;TARGET_FILE:${PROJECT_NAME}.elf>
  56. )



classroom 发表于 2025-6-5 17:35 | 显示全部楼层
支持支持。。
codingtuzi 发表于 2025-6-5 22:42 来自手机 | 显示全部楼层
我也不喜欢stm32cubemx的多层抽象的软件架构设计。自己的项目只干一件事,没有必要去抽象这么多层!
AdaMaYun 发表于 2025-6-8 23:40 | 显示全部楼层
软件架构还是有必要的
gejigeji521 发表于 2025-6-11 10:45 | 显示全部楼层
可以解码MP3吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

165

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部