这个功能其实笔者已经实现,而且用的就是ST的测试用例,前面RNNOISE降噪的测评文章提到过。但那篇文章没有显式的提出,这里单独出一篇帖子简单提一提。
众所周知,STM32N6系列集成有MDF(Multi-function digital filter),然后阅读原理图发现STM32N6570-DK又板载了一颗MEMS芯片:MP23DB01HP,这是ST家的传感器产品之一,两者配合就可以做到录音功能了。
就播放来说,也很简单。原理图显示,STM32N6570-DK板载了一颗WM8904解码芯片,并有模拟信号上的耳机和喇叭接口,所以预先设置下WM8904芯片参数,然后pcm数据发SAI通道就能做到声音的播放了。
笔者用的是耳机通道
事实上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文件,这里贴出来和读者分享:
- set(CMAKE_SYSTEM_NAME Generic)
- set(CMAKE_SYSTEM_VERSION 1)
- set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
- cmake_minimum_required(VERSION 3.20)
- set(CMAKE_C_COMPILER arm-none-eabi-gcc)
- set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
- set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
- set(CMAKE_AR arm-none-eabi-ar)
- set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
- set(CMAKE_OBJDUMP arm-none-eabi-objdump)
- set(SIZE arm-none-eabi-size)
- set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
- set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
- set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
- add_compile_options(-mthumb -mcpu=cortex-m55 -mfloat-abi=hard -mfpu=fpv5-d16 -mcmse)
- add_compile_options(-ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Werror -Wno-unused-parameter)
- add_compile_options(-O2)
- project(stm32n6 C ASM)
- set(CMAKE_CXX_STANDARD 11)
- set(CMAKE_C_STANDARD 99)
- include_directories(Drivers/CMSIS/Include
- Drivers/CMSIS/Device/ST/STM32N6xx/Include
- Drivers/STM32N6xx_HAL_Driver/Inc
- Drivers/BSP/STM32N6570-DK
- Drivers/BSP/Components/wm8904
- Drivers/BSP/Components/Common
- Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/FSBL/Inc)
- add_definitions(-DSTM32N657xx)
- file(GLOB_RECURSE SOURCES
- "Drivers/STM32N6xx_HAL_Driver/Src/*.c"
- "Drivers/BSP/STM32N6570-DK/stm32n6570_discovery.c"
- "Drivers/BSP/STM32N6570-DK/stm32n6570_discovery_bus.c"
- "Drivers/BSP/Components/wm8904/*.c"
- "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/FSBL/Src/*.c"
- "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/STM32CubeIDE/FSBL/Application/User/*.c"
- "Projects/STM32N6570-DK/Examples/MDF/MDF_AudioRecorder/STM32CubeIDE/FSBL/Application/Startup/startup_stm32n657x0hxq_fsbl.s"
- )
- set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Projects/STM32N6570-DK/Examples/BSP/STM32CubeIDE/FSBL/STM32N657X0HXQ_AXISRAM2_fsbl.ld)
- add_link_options(
- -mthumb -mcpu=cortex-m55 -mfloat-abi=hard -mfpu=fpv5-d16 -mcmse
- -Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
- --specs=nano.specs
- --specs=nosys.specs)
- add_link_options(-T ${LINKER_SCRIPT})
- add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})
- # target_link_libraries(${PROJECT_NAME}.elf printfloat)
- set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
- set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
- set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
- add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
- COMMAND ${CMAKE_OBJCOPY} -Oihex lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
- COMMAND ${CMAKE_OBJCOPY} -Obinary lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
- COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
- COMMAND ${SIZE} --format=berkeley lt;TARGET_FILE:${PROJECT_NAME}.elf>
- )
|