这两天因为手头的杂事加上感冒,DAC音频输出的问题放在一边。没有去想。
今天翻看了代码,我发现有几处问题,其实我一直不明白。
方案:因为音频转化为8进制的数据量很大,所以我决定采用DMA方式将音频数据传输到DAC上,再由DAC输出音频,这样节省了占有CPU的资源。
结果:从示波器上看到,音频波形是一个类似方形的波形,DAC上输出的声音不是很清晰,有一些嘈杂的声音。
过程:程序解析如下
因为用到DMA,所以根据数据手册采用定时器6,DAC通道1,DMA2的3通道进行实验。
/*定时器6配置-------------------------------------------------------------------------------*/
void TIM6_Configuration(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_DeInit(TIM6);
TIM_TimeBaseStructure.TIM_Period = 1633; //根据音频采样率为44.1khz所以定时器设为2.26us触发DMA
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);
TIM_Cmd(TIM6, ENABLE);
/*DAC配置-----------------------------------------------------------------------------*/
void DAC1_Configuration(void)
{
rw_DAC_CR&=0xe000e000; //初始化DAC
rw_DAC_CR|=(0x08<<8);//设置三角波幅值等于3
rw_DAC_CR&=~(0x03<<6);//关闭波形生成器
rw_DAC_CR|=(0<<3);//定时器6触发
rw_DAC_CR|=(1<<2);//DAC通道1触发使能
rw_DAC_CR|=(0<<1);//开启缓存使能
rw_DAC_CR|=(1<<0);//开启DAC使能
}
/*DMA2_Channle配置----------------------------------------------------*/
void DMA2_Configuration(void)
{
rw_DMA2_CCR3&=0xffff8000;//初始化寄存器
rw_DMA2_CPAR3=0x40007410;
rw_DMA2_CMAR3=(u32)&sinedata;
rw_DMA2_CNDTR3=17052;
rw_DMA2_CCR3|=(0<<14);//启用非存储器到存储器模式
rw_DMA2_CCR3|=(0x03<<12);//设置通道优先级为高
rw_DMA2_CCR3|=(0x00<<10);//设置存储器数据宽度为8位
rw_DMA2_CCR3|=(0x00<<8);//设置外设数据宽度为8位
rw_DMA2_CCR3|=(1<<7);//启动存储器增量模式
rw_DMA2_CCR3|=(0<<6);//关闭外存储器增量模式
rw_DMA2_CCR3|=(1<<5);//开启循环模式
rw_DMA2_CCR3|=(1<<4);//从存储器读取数据
rw_DMA2_CCR3|=(0<<1);//关闭传输完成中断
rw_DMA2_CCR3|=(1<<0);//开启DMA2通道三
rw_DAC_CR|=(1<<12);//开启DAC-》DMA的通道
}
整个配置如上。音源文件是我用声音合成软件生成的,但DAC输出的声音不清晰,有杂音。
我试过用tim6中断去做,可是波形只有在掉电重启的时候有生成,之后就没有了,这个很奇怪。
所以,我想请教论坛里的前辈们,有没有办法将DAC输出的杂音去掉?我查过百度,没有
相关的资料,请前辈们指教下,如何才能让DAC输出的声音能清晰明朗。
|