STM32 réalise la lecture audio wav avec DAC

        J'utilise un microcontrôleur STM32F103RE, le flash est de 512k et l'audio joué pendant quelques secondes peut être directement stocké dans le tableau. Si vous souhaitez lire un son plus long, vous devez ajouter un flash externe.

        Processus principal : téléchargez un morceau de musique sur Internet --- coupez-le en moins de 5 secondes -- convertissez-le en WAV -- convertissez-le en tableau et enregistrez-le dans le code

                J'utilise GOLDWAVE pour couper l'audio, mais l'audio coupé est de 8 bits 44,1 KHZ.Je ne sais pas comment sortir une fréquence plus basse, ce qui m'empêche également de le jouer pendant longtemps.

                J'utilise winhex pour convertir les données. Après avoir ouvert le fichier wave, clic droit - copier la sortie - code source C

Coupez les bêtises et allez directement au code :

Configuration d'initialisation du 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);


  
  
}

fonction principale:

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就好了
		  
	  }
	
}

Idées :

Mon audio est à 44100Hz, il y aura donc 44100 trames de données en 1s. J'ai juste besoin de m'assurer que toutes les données sont sorties dans ce 1s. Ni trop rapide ni trop lent.

J'utilise donc une boucle pour sortir la valeur de tension du DAC. Il y a un retard au milieu pour assurer la lecture normale du son. Si le retard est trop court, il est possible de lire 3 secondes de données en 1 seconde, et il va s'accélérer. Si le délai est trop long, 1 seconde de données est stockée pendant plusieurs secondes. Je ne sais pas exactement comment calculer ce délai. J'ai essayé un par un moi-même, et je n'ai pas pu m'en empêcher. Vous pouvez également utiliser la fonction de retard pour retarder ou utiliser une minuterie pour déclencher la sortie.

Récemment, quelques mises à jour ont été faites, et un morceau de musique complet peut être joué directement à partir du FLASH. Si vous êtes intéressé, vous pouvez aller sur ma page d'accueil pour voir

Lien de version de mise à niveau : STM32 joue de la musique WAVE complète

Je suppose que tu aimes

Origine blog.csdn.net/weixin_47041339/article/details/127389161
conseillé
Classement