打印
[STM32N6]

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

[复制链接]
80|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这个功能其实笔者已经实现,而且用的就是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>
)



使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

157

帖子

1

粉丝