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