📄 rap.asm
字号:
//***********************************************************
// Note: DVR有两种录放音方式,即自动方式和非自动方式,我们可以通
//过改变Mode的值来切换这两种方式:当Mode=0时以非自动方式录放音,
//当Mode=1时,以自动方式录放音,而且中断中分别用FIQ中断实现语音的
//播放,用IRQ1中断实现语音的录制。这里我们用非自动方式:
//*************************************************************
#define Manual 0
#define Auto 1
#define SRAM_Size 0xffff-2
#define Stop 0
#define Record 1
#define Play 2
#define RceMonitorOff 0
#define RceMonitorOn 1
#define DAC1 1
#define DAC2 2
#define Full 1
#define Empty 2
int main(){
int Ret=0, Mode;
int Addr, Addr_Save;
//Mode = Auto; //选择自动方式录放音
Mode = Manual; //选择手动方式录放音
if(Mode == Manual) //采用手动方式
{
SACM_DVR_Initial(Manual); //手动方式初始化
Addr = 0; //定义语音存放的首址变量
InitWriteSRAM();
SACM_DVR_InitEncoder(RceMonitorOn); //开始对A2000的语音数据以非自动方式编码
while(Addr<SRAM_Size) //判断存储语音的地址是否超出存储单元的大小
{
SACM_DVR_Encode (); //获取数据并编码
if(SACM_DVR_TestQueue()!= Empty)
{
Ret=SACM_DVR_FetchQueue(); // 从队列中获取数据
WriteSRAM(Addr,Ret); // 存入用户定义的存储单元区
Addr+=2; //两个8位SRAM存储一个16位数据
}
Addr_Save = Addr; //将存储语音数据的末地址暂存于Add_Save
}
SACM_DVR_StopEncoder();
SACM_DVR_Initial(Manual); //非自动方式播放的初始化
InitReadSRAM();
Addr=0;
SACM_DVR_InitDecoder(DAC1); //开始对A2000的语音数据以非自动方式解码
while(SACM_DVR_TestQueue()!=Full) //测试并获取语音队列的状态
{
Ret=ReadSRAM(Addr); //从存储区里获取一个字型语音数据
SACM_DVR_FillQueue(Ret); //获取语音编码数据并填入语音队列等候解码
Addr+=2;
}
while(1)
{
if(SACM_DVR_TestQueue()!=Full)
{
Ret =ReadSRAM(Addr);
SACM_DVR_FillQueue(Ret);
Addr+=2;
}
if(Addr<SRAM_Size) //如果该段语音播完,即到达末地址时
SACM_DVR_Decode (); //获取资源并进行解码,再通过中断服务子程序送入DAC通道播放
else
SACM_DVR_StopDecoder(); //否则,停止播放
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -