问题描述
运行测试audio ,异常如下:
CanMV K230 start in 874572 us
IDE debugger built Feb 6 2026 06:15:50
[mpy] enter repl
[mpy] exit, reset
<3>[4] [Func]:vb_do_exit [Line]:1569 [Info]:vb already exited!
[mpy] enter script
audio i2s set clk freq is 2822400(2822400),ret:1
audio codec adc clk freq is 11289600(11289600)
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[1[E/DBG] [FATAL ERROR] Exception 15:Store/AMO Page Fault
[E/DBG] scause:0x000000000000000f,stval:0x0000000986b30009,sepc:0x000000000008f8e6
--------------Dump Registers-----------------
Function Registers:
ra(x1) = 0x000000000008f7c6()
user_sp(x2) = 0x00000000006da890()
gp(x3) = 0x00000000004046b0()
tp(x4) = 0x00000000deadbeef()
Temporary Registers:
t0(x5) = 0x0000000000000120()
t1(x6) = 0x00000000deadbeef()
t2(x7) = 0x00000000deadbeef()
t3(x28) = 0x00000000deadbeef()
t4(x29) = 0x00000000deadbeef()
t5(x30) = 0x00000000deadbeef()
t6(x31) = 0x00000000deadbeef()
Saved Registers:
s0/fp(x8) = 0x00000000006da9a0()
s1(x9) = 0x00000000deadbeef()
s2(x18) = 0x00000000deadbeef()
s3(x19) = 0x00000000deadbeef()
s4(x20) = 0x00000000deadbeef()
s5(x21) = 0x00000000deadbeef()
s6(x22) = 0x00000000deadbeef()
s7(x23) = 0x00000000deadbeef()
s8(x24) = 0x00000000deadbeef()
s9(x25) = 0x00000000deadbeef()
s10(x26) = 0x00000000deadbeef()
s11(x27) = 0x00000000deadbeef()
Function Arguments Registers:
a0(x10) = 0x0733000986b30009()
a1(x11) = 0x00000000c00d3000()
a2(x12) = 0xffffffff9fff8000()
a3(x13) = 0x0000000000000001()
a4(x14) = 0x0000000000008000()
a5(x15) = 0x0733000986b30009()
a6(x16) = 0x00000000005ea218()
a7(x17) = 0x00000000deadbeef()
sstatus = 0x8000000200046120
Supervisor Interrupt Disabled
Last Time Supervisor Interrupt Enabled
Last Privilege is Supervisor Mode
Permit to Access User Page
Not Permit to Read Executable-only Page
satp = 0x80000000000004bc
Current Page Table(Physical) = 0x00000000004bc000
Current ASID = 0x0000000000000000
Mode = Page-based 39-bit Virtual Addressing Mode
-----------------Dump OK---------------------
riscv64-unknown-linux-musl-addr2line -e rtthread.elf -a -f 000000000008f8e2 000000000008ff32 000000000008ffc6 00000000001a9762
[E/DBG] User Fault, killing thread: ai_i2s_doraw_thread
2au[Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[12] [Func]:_make_vb_block [Line]:141 [Info]:no blk
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
<3>[4] [Func]:vb_user_sub [Line]:880 [Info]:try to sub user for a free buffer!
(g_vb_blks[HANDLE_TO_POOL_ID(handle)]) assertion failed at function:vb_blk_handle_to_pool_id, line number:714
riscv64-unknown-linux-musl-addr2line -e rtthread.elf -a -f 000000000017d320 000000000008e97c 0000000000090fc0 00000000000910ee 00000000000912c2 0000000000092a06 000000000008e61c 00000000001d2c6a
复现步骤
上电启动
连接板子
测试如下audio,代码如下:
# 音频输入和输出示例
#
# 注意:运行此示例需要一个 SD 卡。
#
# 您可以播放WAV文件或捕获音频并保存为 WAV 格式。
import os
from media.media import * #导入media模块,用于初始化vb buffer
from media.pyaudio import * #导入pyaudio模块,用于采集和播放音频
import media.wave as wave #导入wav模块,用于保存和加载wav音频文件
def exit_check():
try:
os.exitpoint()
except KeyboardInterrupt as e:
print("user stop: ", e)
return True
return False
def record_audio(filename, duration):
CHUNK = 44100//25 #设置音频chunk值
FORMAT = paInt16 #设置采样精度,支持16bit(paInt16)/24bit(paInt24)/32bit(paInt32)
CHANNELS = 2 #设置声道数,支持单声道(1)/立体声(2)
RATE = 44100 #设置采样率
try:
p = PyAudio()
MediaManager.init() #vb buffer初始化
#创建音频输入流
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
stream.volume(vol=70, channel=LEFT)
stream.volume(vol=85, channel=RIGHT)
print("volume :",stream.volume())
#启用音频3A功能:自动噪声抑制(ANS)
stream.enable_audio3a(AUDIO_3A_ENABLE_ANS)
frames = []
#采集音频数据并存入列表
for i in range(0, int(RATE / CHUNK * duration)):
data = stream.read()
frames.append(data)
if exit_check():
break
#将列表中的数据保存到wav文件中
wf = wave.open(filename, 'wb') #创建wav 文件
wf.set_channels(CHANNELS) #设置wav 声道数
wf.set_sampwidth(p.get_sample_size(FORMAT)) #设置wav 采样精度
wf.set_framerate(RATE) #设置wav 采样率
wf.write_frames(b''.join(frames)) #存储wav音频数据
wf.close() #关闭wav文件
except BaseException as e:
print(f"Exception {e}")
finally:
stream.stop_stream() #停止采集音频数据
stream.close()#关闭音频输入流
p.terminate()#释放音频对象
MediaManager.deinit() #释放vb buffer
def play_audio(filename):
try:
wf = wave.open(filename, 'rb')#打开wav文件
CHUNK = int(wf.get_framerate()/25)#设置音频chunk值
p = PyAudio()
MediaManager.init() #vb buffer初始化
#创建音频输出流,设置的音频参数均为wave中获取到的参数
stream = p.open(format=p.get_format_from_width(wf.get_sampwidth()),
channels=wf.get_channels(),
rate=wf.get_framerate(),
output=True,frames_per_buffer=CHUNK)
#设置音频输出流的音量
stream.volume(vol=85)
data = wf.read_frames(CHUNK)#从wav文件中读取数一帧数据
while data:
stream.write(data) #将帧数据写入到音频输出流中
data = wf.read_frames(CHUNK) #从wav文件中读取数一帧数据
if exit_check():
break
except BaseException as e:
print(f"Exception {e}")
finally:
stream.stop_stream() #停止音频输出流
stream.close()#关闭音频输出流
p.terminate()#释放音频对象
wf.close()#关闭wav文件
MediaManager.deinit() #释放vb buffer
def loop_audio(duration):
CHUNK = 44100//25#设置音频chunck
FORMAT = paInt16 #设置音频采样精度,支持16bit(paInt16)/24bit(paInt24)/32bit(paInt32)
CHANNELS = 2 #设置音频声道数,支持单声道(1)/立体声(2)
RATE = 44100 #设置音频采样率
try:
p = PyAudio()
MediaManager.init() #vb buffer初始化
#创建音频输入流
input_stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
#设置音频输入流的音量
input_stream.volume(vol=70, channel=LEFT)
input_stream.volume(vol=85, channel=RIGHT)
print("input volume :",input_stream.volume())
#启用音频3A功能:自动噪声抑制(ANS)
input_stream.enable_audio3a(AUDIO_3A_ENABLE_ANS)
#创建音频输出流
output_stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
output=True,frames_per_buffer=CHUNK)
#设置音频输出流的音量
output_stream.volume(vol=85)
#从音频输入流中获取数据写入到音频输出流中
for i in range(0, int(RATE / CHUNK * duration)):
output_stream.write(input_stream.read())
if exit_check():
break
except BaseException as e:
print(f"Exception {e}")
finally:
input_stream.stop_stream()#停止音频输入流
output_stream.stop_stream()#停止音频输出流
input_stream.close() #关闭音频输入流
output_stream.close() #关闭音频输出流
p.terminate() #释放音频对象
MediaManager.deinit() #释放vb buffer
def audio_recorder(filename, duration):
CHUNK = 44100//25 #设置音频chunk值
FORMAT = paInt16 #设置采样精度,支持16bit(paInt16)/24bit(paInt24)/32bit(paInt32)
CHANNELS = 1 #设置声道数,支持单声道(1)/立体声(2)
RATE = 44100 #设置采样率
p = PyAudio()
MediaManager.init() #vb buffer初始化
try:
#创建音频输入流
input_stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
input_stream.volume(vol=70, channel=LEFT)
input_stream.volume(vol=85, channel=RIGHT)
print("input volume :",input_stream.volume())
#启用音频3A功能:自动噪声抑制(ANS)
input_stream.enable_audio3a(AUDIO_3A_ENABLE_ANS)
print("enable audio 3a:ans")
print("start record...")
frames = []
#采集音频数据并存入列表
for i in range(0, int(RATE / CHUNK * duration)):
data = input_stream.read()
frames.append(data)
if exit_check():
break
print("stop record...")
#将列表中的数据保存到wav文件中
wf = wave.open(filename, 'wb') #创建wav 文件
wf.set_channels(CHANNELS) #设置wav 声道数
wf.set_sampwidth(p.get_sample_size(FORMAT)) #设置wav 采样精度
wf.set_framerate(RATE) #设置wav 采样率
wf.write_frames(b''.join(frames)) #存储wav音频数据
wf.close() #关闭wav文件
except BaseException as e:
print(f"Exception {e}")
finally:
input_stream.stop_stream() #停止采集音频数据
input_stream.close()#关闭音频输入流
try:
wf = wave.open(filename, 'rb')#打开wav文件
CHUNK = int(wf.get_framerate()/25)#设置音频chunk值
#创建音频输出流,设置的音频参数均为wave中获取到的参数
output_stream = p.open(format=p.get_format_from_width(wf.get_sampwidth()),
channels=wf.get_channels(),
rate=wf.get_framerate(),
output=True,frames_per_buffer=CHUNK)
#设置音频输出流的音量
output_stream.volume(vol=85)
print("output volume :",output_stream.volume())
print("start play...")
data = wf.read_frames(CHUNK)#从wav文件中读取数一帧数据
while data:
output_stream.write(data) #将帧数据写入到音频输出流中
data = wf.read_frames(CHUNK) #从wav文件中读取数一帧数据
if exit_check():
break
print("stop play...")
except BaseException as e:
print(f"Exception {e}")
finally:
output_stream.stop_stream() #停止音频输出流
output_stream.close()#关闭音频输出流
p.terminate() #释放音频对象
MediaManager.deinit() #释放vb buffer
if __name__ == "__main__":
os.exitpoint(os.EXITPOINT_ENABLE)
print("音频示例开始")
# record_audio('/sdcard/examples/test.wav', 15) # 录制WAV文件
# play_audio('/sdcard/examples/test.wav') # 播放WAV文件
# loop_audio(15) # 采集音频并输出
audio_recorder('/sdcard/examples/test.wav', 15) #录制15秒音频文件保存并播放
print("音频示例完成")
硬件板卡
CAN MV v2
软件版本
CanMV-K230_DONGSHANPI_micropython_local_nncase_v2.9.0.img