STM32开发的简易MP3音乐播放器

设计简介

本设计硬件主要利用STM32单片机,SD卡。设计思路:本设计通过STM32单片机读取SD卡里的音频文件,再通过DAC进行输出,DAC输出后接一个运放模块,再接一个喇叭。利用STM32cubemx配置SD卡,FATFS(这里可以参考我之前写的博客:http://t.csdn.cn/R4clB),和DAC输出(这里参考我前面写的:http://t.csdn.cn/Om0vJ)。

配置DAC和定时器:

http://t.csdn.cn/Om0vJ
DAC配置:

定时器配置:

这里有个知识点之前博客没有讲到,这里做一下补充。这里定时器的分频设置为9000,是为了使得定时器的频率为8KHZ(72MHz/9000),与音频文件的频率一致。

配置SD卡和FATFS

http://t.csdn.cn/R4clB。这里就没啥可讲的了,按照之前的配置就可。

添加代码

/* USER CODE BEGIN Includes */
#include "string.h"
#include <stdlib.h>
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

#define DAC_Count 4096
uint8_t DAC_Data[5000]={0};

uint16_t DAC_F=2;  
volatile  uint16_t Time_Count=0;


volatile uint8_t flag=0;
volatile uint8_t ready=1;

unsigned int bytesRead=0;

uint16_t tempLocate_new=0;
uint16_t file_memory=0;

char Read_Data[DAC_Count]={0};

FATFS fs;                       /* FatFs 文件系统对象 */
FIL file;                       /* 文件对象 */
FRESULT f_res;                  /* 文件操作结果 */
uint16_t fnum;                      /* 文件成功读写数量 */
BYTE ReadBuffer[1024] = {0};    /* 读缓冲区 */
BYTE WriteBuffer[] =            /* 写缓冲区 */
    "hello word\r\n";


/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

int wd4;

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM4)                  //处理TIM4间隔定时中断
  {
		Time_Count += DAC_F;
		
		wd4 = ((DAC_Data[Time_Count-1]-0x80)<<8)|(DAC_Data[Time_Count-2]);   //将16位的音频数据转为12位。
	
		wd4 = 0xfff & (wd4>>4);
		HAL_DAC_SetValue(&hdac,DAC_CHANNEL_2,DAC_ALIGN_12B_R,wd4);//12位右对齐数据格式设置DAC值
		

	}
}

/* USER CODE END PM */



/*在main里添加代码*/
/* USER CODE BEGIN 2 */
	HAL_TIM_Base_Start_IT(&htim4);
	HAL_DAC_Start(&hdac,DAC_CHANNEL_2);

//	printf("\r\n****** FatFs Example ******\r\n\r\n");
    
    //在外部 SD 卡挂载文件系统,文件系统挂载时会对 SD 卡初始化
    f_res = f_mount(&fs, "0:", 1);  //挂载文件系统	
		f_res = f_open(&file, "0:红色高跟鞋_16bit.wav", FA_OPEN_EXISTING | FA_READ);  //打开SD卡里的文件,“红色高跟鞋_16bit.wav”为文件名。
		if(f_res==FR_OK)
    {
			f_lseek(&file, 44);  //偏移文件起始位置44个字节,后面的就是所需要的数据
			file_memory=f_size(&file);
			printf("文件大小:%d\r\n",file_memory);
		}
//		databuf=(char*)malloc(4096);		
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
		if(Time_Count>=fnum){  //当DAC输出的字节大于等于读取到的字节数
					Time_Count = 0;
					memset(DAC_Data,0,sizeof(DAC_Data));  //清空数组
					f_res=f_read(&file,Read_Data,4096,(UINT*)&fnum);//读出4096个字节  
					
					memcpy(DAC_Data,Read_Data,fnum);  //数组复制
				}

			if(f_eof(&file)) //已经读取完了
			{
				f_lseek(&file, 44);  //跳过前面44个字节
			}
    /* USER CODE END WHILE */

这里代码大家可以自己发挥,比如去读文件目录,而不是读取指定文件,这样就可以播放多条音乐了。

准备音频文件

准备一张SD卡,和一首你喜欢的音乐,通过AU软件将音乐转换为16位,8KHz的WAV格式的文件保存到SD卡里面。
点击文件 -> 导出 -> 文件。

将文件保存到SD卡后将SD卡插到开发板上。下载程序到开发板。你就可以听到你喜欢的音乐了。

补充

程序中我将文件的前面44个字节丢弃了也可以不丢弃,我选择丢弃是因为WAV格式的文件前面44个字节为文件信息并不是数据信息。可以参考其他博主写的博客http://t.csdn.cn/3sE4D。

播放演示;https://live.csdn.net/v/233132

物联沃分享整理
物联沃-IOTWORD物联网 » STM32开发的简易MP3音乐播放器

发表评论