STM32はDACによるwavオーディオの再生を実現します

        私は STM32F103RE マイクロコントローラーを使用しており、フラッシュは 512k で、数秒間再生されたオーディオはアレイに直接保存できます。より長いオーディオを再生したい場合は、外部フラッシュを追加する必要があります。

        主なプロセス: インターネットから音楽をダウンロード --- 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 なので、1 秒間に 44100 フレームのデータが存在します。すべてのデータがこの 1 秒以内に出力されることを確認する必要があるだけです。速すぎず遅すぎず。

そこでループを使って DAC 電圧値を出力します. サウンドが正常に再生されることを保証するために途中に遅延があります. 遅延が短すぎる場合は 1 秒で 3 秒のデータを再生することができます.速度が上がります。遅延が長すぎると、1 秒のデータが数秒にわたって保存されます。この遅延時間を正確に計算する方法がわかりません。自分で一つ一つ試してみましたが、どうしようもありませんでした。遅延機能を使用して遅延したり、タイマーを使用して出力をトリガーしたりすることもできます。

最近、いくつかのアップグレードが行われ、FLASH から直接完全な音楽を再生できるようになりました。興味のある方は、私のホームページにアクセスしてご覧ください。

アップグレード バージョンのリンク: STM32 は完全な WAVE 音楽を再生します

おすすめ

転載: blog.csdn.net/weixin_47041339/article/details/127389161