STM32实现用DAC播放wav音频

        我用的是STM32F103RE单片机,flash是512k的,播放几秒的音频直接存在数组里面就好了。如果要播放更长的音频要加外置flash。

        主要流程:从网上下载一段音乐 ----——修剪成5秒以内——转换成WAV—— 转换成数组存到代码中

                修剪音频我用的是GOLDWAVE,但是剪出来的音频都是8位44.1KHZ,不知道怎么样输出更低频率的,这也导致我播放的时间不能很长。

                转换数据我用的winhex。打开wave文件后,点击右键——复制输出——C源码

废话少说直接上代码:

DAC初始化配置:


 void DAC_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
	DAC_InitTypeDef  DAC_InitStructure;

  /* 使能GPIOA时钟 */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
	
	/* 使能DAC时钟 */	
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
	
  /* DAC的GPIO配置,模拟输入 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
	


  /* 配置DAC 通道1 */
  DAC_InitStructure.DAC_Trigger = DAC_Trigger_None;			//没有触发源,在主函数里控制,后期可改成定时器触发,定时器触发的代码我放在另一个文件里
  DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;	//不使用波形发生器
  DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;	//不使用DAC输出缓冲
  DAC_Init(DAC_Channel_1, &DAC_InitStructure);

  /* 配置DAC 通道2 */
  DAC_Init(DAC_Channel_2, &DAC_InitStructure);

  /* 使能通道1 由PA4输出 */
  DAC_Cmd(DAC_Channel_1, ENABLE);
  /* 使能通道2 由PA5输出 */
  DAC_Cmd(DAC_Channel_2, ENABLE);


  
  
}

主函数:

int main(void)
{
	

	uint32_t offset=44; //音频前44个是文件信息,后面才是真正的音频
	int i =0;	
	DAC_Config();	
	DAC_TIM_Config();	
  	  while(1)
	  {
 		  //这里就是重复改变DAC的输出值。因为我频率是44.1k,所以我一秒要改44100次
	  	DAC_SetChannel1Data(DAC_Align_8b_R,Sine12bit[offset]);  //音频放在这个数组里遍历输出

		  offset++;
		  
		  if(offset>226598) offset =44; //226598这个值是音频数组的大小,这个按数组大小去改就好
		  
		  for(int i =0 ; i<190;i++ ); //这行代码是实现延时的,我没有延时函数,所以用这个
                                       //如果用delay的话设置19us就好了
		  
	  }
	
}

思路:

我的音频是44100Hz,所以1s会有44100贞数据。我只要保证刚好在这1s内输出完所有的数据就好了。不能太快也不能太慢。

所以我用循环的方式去输出DAC电压值,中间有延时是保证声音的正常播放,如果延时太短的话,有可能1秒放完3秒的数据,会加快。如果延时太长,1秒的数据放好几秒。具体怎么算这个这个延时时间我也不是很清楚。我自己是一个个去试的,没有办法自己太菜了。也可以用delay函数去延时,或者用定时器触发输出。

最近做了一些升级,能直接从FLASH里面播放完整的一首音乐,感兴趣的可以去我的主页看

升级版链接:STM32播放完整WAVE音乐

猜你喜欢

转载自blog.csdn.net/weixin_47041339/article/details/127389161