STM32는 DAC로 wav 오디오 재생을 실현합니다.

        나는 STM32F103RE 마이크로 컨트롤러를 사용하고 플래시는 512k이며 몇 초 동안 재생되는 오디오는 어레이에 직접 저장할 수 있습니다. 더 긴 오디오를 재생하려면 외부 플래시를 추가해야 합니다.

        주요 프로세스: 인터넷에서 음악을 다운로드 --- 5초 미만으로 트리밍 -- WAV로 변환 -- 배열로 변환하여 코드에 저장

                저는 GOLDWAVE로 오디오를 다듬는데, 잘린 오디오는 8비트 44.1KHZ인데 저주파수 출력 방법을 몰라서 장시간 재생도 잘 안되네요.

                winhex를 사용하여 데이터를 변환합니다. 웨이브 파일을 연 후 우클릭 - 출력물 복사 - 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이므로 1초에 44100개의 데이터 프레임이 있습니다. 모든 데이터가 이 1초 내에 출력되는지 확인하기만 하면 됩니다. 너무 빠르지도 너무 느리지도 않습니다.

그래서 루프를 이용해서 DAC 전압값을 출력하는데 중간에 딜레이가 있어서 정상적인 사운드 재생이 가능하게끔 딜레이가 너무 짧으면 1초에 3초의 데이터 재생이 가능하고, 속도를 낼 것입니다. 지연이 너무 길면 1초의 데이터가 몇 초 동안 저장됩니다. 이 지연 시간을 정확히 계산하는 방법을 모르겠습니다. 직접 하나씩 시도해 보았지만 어쩔 수 없었습니다. 지연 기능을 사용하여 지연하거나 타이머를 사용하여 출력을 트리거할 수도 있습니다.

최근 일부 업그레이드가 이루어졌으며 전체 음악을 FLASH에서 직접 재생할 수 있습니다. 관심이 있는 경우 내 홈페이지로 이동하여 볼 수 있습니다.

업그레이드 버전 링크: STM32는 전체 WAVE 음악을 재생합니다.

추천

출처blog.csdn.net/weixin_47041339/article/details/127389161