这个功能其实笔者已经实现,而且用的就是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 [ DISCUZ_CODE_2 ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
COMMAND ${CMAKE_OBJCOPY} -Obinary [ DISCUZ_CODE_2 ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble [ DISCUZ_CODE_2 ]lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
COMMAND ${SIZE} --format=berkeley [ DISCUZ_CODE_2 ]lt;TARGET_FILE:${PROJECT_NAME}.elf>
)
|