在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于STM32F103ZE+VS1053的音樂播放器設計

嵌入式技術 ? 來源:嵌入式技術 ? 作者:嵌入式技術 ? 2022-05-30 09:18 ? 次閱讀

1.硬件平臺

CPUSTM32F103ZE

屏幕:3.5寸TFTLCD屏

音頻解碼器: VS1053

SD卡、外擴Sram

2.示例效果

pYYBAGKTcFeAS3O2AAuN7nWhtsQ967.pngpYYBAGKTcGuAHGEHAAvR6F3OGGU869.png

3.音頻解碼VS1053簡介

VS1053b 是單片 Ogg Vorbis/MP3/AAC/WMA/MIDI 音頻解碼器,及 IMA ADPCM 編碼器和用戶加載的 OggVorbis 編碼器。
支持: MP3/WMA/OGG/WAV/FLAC/MIDI/AAC 等音頻格式的解碼,并支持: OGG/WAV 音頻格式的錄音,支持高低音調節設置, 功能十分強大。
它包含了一個高性能、有專利的低功耗 DSP 處理器內核VS_DSP4、工作數據存儲器、供用戶應用程序和任何固化解碼器一起運行的 16 KiB 指令 RAM 及 0.5KiB 多的數據 RAM、串行的控制和輸入數據接口、最多 8 個可用的通用 I/O 引腳、一個 UART、并有一個優質的可變采樣率立體聲 ADC(“咪”、“線路”、“線路+咪”或“線路*2”) 和立體聲 DAC、和跟隨的一個耳機功放及一個公共電壓緩沖器。

特性:
●能解碼 MPEG 1 和 MPEG2 音頻 層 III( CBR+VBR+ABR); WMA 4.0/4.1/7/8/9 5-384kbps 所有流文件;WAV(PCM+IMA AD-PCM);產生 MIDI/SP-MIDI 文件。
●對話筒輸入或線路輸入的音頻信號進行 IMA ADPCM 編碼
●支持 MP3 和 WAV 流
●高低音控制
●單時鐘操作 12..13MHz
●內部 PLL 鎖相環時鐘倍頻器
●低功耗
●內含高性能片上立體聲數模轉換器, 兩聲道間無相位差
●內含能驅動 30 歐負載的耳機驅動器
模擬, 數字, I/O 單獨供電
●為用戶代碼和數據準備的 5.5KB 片上 RAM
●串行的控制,數據接口
●可被用作微處理器的從機
●特殊應用的 SPI Flash 引導
●供調試用途的 UART 接口
●新功能可以通過軟件和 4 GPIO 添加

3.1 硬件接口

pYYBAGKTcQSAZHIlAAcQVrtGJqQ310.png
引腳 GPIO 說明
VS_MISO PA6 主機輸入
VS_MOSI PA7 主機輸出
VS_SCK PA5 時鐘
VS_XCS PF7 命令片選(低電平有效)
VS_XDCS PF6 數據片選(低電平有效)
VS_DREQ PC13 數據請求線(高電平表示可以接收數據)
VS_RST PE6 復位腳(低電平復位)

VS1053通訊方式為SPI實現數據傳輸,分為 SDI 和 SCI, SDI 用來傳輸數據, SCI 用于傳輸命令。
SDI 數據傳輸非常簡單,就是標準的 SPI 通信,不過 VS1053 的數據傳輸都是通過 DREQ 控制到主機必須在
判斷 DREQ 有效(高電平有效)后,才可以發送數據。
SCI 命令傳輸接口包含了一個指令字節、一個地址字節和一個 16 位的數據字。讀寫操作可以讀寫單個寄存
器,在 SCK 的上升沿讀出數據位,所以主機必須在下降沿刷新數據。 SCI 的字節數據總是高位在前低位在后的。
第一個字節指令字節,只有 2 個指令,也就是讀和寫,讀指令為:0X03,寫指令為:0X02

SCI讀操作:

pYYBAGKTdIqAVlsuAAEV8wgnAMk662.png

VS1053b 使用下列時序對寄存器進行讀取操作,它顯示在圖 6 中。首先, XCS 信號線被拉到低電平來片選此設備。隨后,讀取操作碼(0x3)加上 8 位寬度的地址后,組成的 16 位字通過 SI 信號線發送到設備。在地址被讀取之后, SI 信號線上發送的任何數據都將被芯片忽略。而被確認的地址中的十六位寬度數據將在 SO 信號線上移動輸出。
XCS 信號應該在數據移動送出之后驅動到高電平。
DREQ 在讀取操作期間會被芯片短暫的拉到低電平,這是非常短的時間,并不需要用戶特別的留意。

SCI寫操作:

poYBAGKTdK2AchqCAAEGJWlaTf4044.png

寫入 VS1053b 寄存器的操作要使用下列順序,它顯示在圖 7 中。 XCS 信號線先下拉到低電平表示選中該設備。將寫操作碼 (0x2) 加上 8 位的字地址通過 SI 信號線發送到 VS1053b。
在這個數據字移位發送的最后一個時鐘結束之后, XCS 應該上拉到高電平來結束這個寫入順序。

VS1053寄存器列表

VS1053 總共有16 個SCI 寄存器, 通過這些寄存器實現對 VS1053 的各種控制, VS1053 的所有 SCI 寄存器。

poYBAGKTdXCAYHnEAAH9R9UOzkk977.png

3.2 VS1053驅動

/**************硬件接口*****************
**VS_MISO -- PA6 主機輸入
**VS_MOSI -- PA7 主機輸出
**VS_SCK  -- PA5 時鐘
**VS_XCS  -- PF7 命令片選(低電平有效)
**VS_XDCS -- PF6 數據片選(低電平有效)
**VS_DREQ -- PC13 數據請求線(高電平表示可以接收數據)
**VS_RST  -- PE6 復位腳(低電平復位)
**
*****************************************/

void VS1053_Init(void)
{
	/*1. 開時鐘*/
	RCC->APB2ENR|=1<<2;//PA
	RCC->APB2ENR|=1<<4;//PC
	RCC->APB2ENR|=1<<6;//PE
	RCC->APB2ENR|=1<<7;//PF
	GPIOA->CRL&=0x000FFFFF;
	GPIOA->CRL|=0x38300000;
	
	GPIOF->CRL&=0x00FFFFFF;
	GPIOF->CRL|=0x33000000;
	
	GPIOC->CRH&=0xFF0FFFFF;
	GPIOC->CRH|=0x00800000;
	
	GPIOE->CRL&=0xF0FFFFFF;
	GPIOE->CRL|=0x03000000;
	VS_XCS=1;
	VS_XDCS=1;
	VS1053_RST();
	VS1053_SetVoice(255,255);
	/*2.配置時鐘寄存器*/
	VS1053_WriteRegDat(VS1053_CLOCKF,0x9800);
}
/*SPI收發一個字節*/
u8 VS1053_SPI_ReadWriteData(u8 data_tx)
{
	u8 data_rx=0;
	u8 i=0;
	for(i=0;i<8;i++)
	{
		VS_SCK=0;
		if(data_tx&0x80)VS_MOSI=1;
		else VS_MOSI=0;
		VS_SCK=1;
		data_tx<<=1;
		
		data_rx<<=1;
		if(VS_MISO)data_rx|=0x01;
	}
	return data_rx;
}
/********************往寄存器中寫入數據******************
**
**形參:u8 addr --地址
**			u16 data  -- 寫入的數據
**********************************************************/
void VS1053_WriteRegDat(u8 addr,u16 data)
{
	while(VS_DREQ==0){}//等待數據線空閑
	VS_XDCS=1;//數據片選拉高
	VS_XCS=0;//命令片選拉低
	VS1053_SPI_ReadWriteData(0x02);//寫指令
	VS1053_SPI_ReadWriteData(addr);	//寄存器地址
	VS1053_SPI_ReadWriteData(data>>8);
	VS1053_SPI_ReadWriteData(data>>0);//寫入數據
	VS_XCS=1;
}
/*******************從寄存器中讀取數據*******************/
u16 VS1053_ReadRegDat(u8 addr)
{
	u16 data=0;
	while(VS_DREQ==0){}//等待數據線空閑
	VS_XDCS=1;//數據片選拉高
	VS_XCS=0;//命令片選拉低
	VS1053_SPI_ReadWriteData(0x03);//讀指令
	VS1053_SPI_ReadWriteData(addr);	//寄存器地址
	data=VS1053_SPI_ReadWriteData(0xff)<<8;
	data|=VS1053_SPI_ReadWriteData(0xff);
	VS_XCS=1;
	return data;
}
/****************音量調節*****************
**
**形參:u8 vol_l -- 左聲道 0~254
**      u8 vol_r -- 右聲道 0~254
**每個增量表示0.5db的衰減,值越大,音量越小
**注意:如果設置 VOL 的值為 0xFFFF,將使芯片進入掉電模式。
**右聲道是高 8 位 左聲道是低 8 位
*******************************************/
void VS1053_SetVoice(u8 vol_l,u8 vol_r)
{
	u16 temp=vol_r<<8|vol_l;
	VS1053_WriteRegDat(VS1053_VOL,temp);
}
/***************VS1053硬件復位**************/
void VS1053_RST(void)
{
	//硬件復位
	VS_RST=0;
	Delay_Ms(20);
	VS_XDCS=1;//取消數據傳輸
	VS_XCS=1;//取消命令傳輸
	VS_RST=1;//完成復位
	//軟件復位
	while(VS_DREQ==0){}//等待數據線空閑
	VS1053_WriteRegDat(VS1053_MODE,0x0804);//設置為新模式,進行軟件復位
	Delay_Ms(2);	
	while(VS_DREQ==0){}//等待數據線空閑,復位完成
}
/****獲取解碼時間******/
u16 VS1053_Get_Time(void)
{
	u16 time=0;
	time=VS1053_ReadRegDat(VS1053_DECODE_TIME);
	return time;
}
/****清除解碼時間******/
void VS1053_Clear_Time(void)
{
	VS1053_WriteRegDat(VS1053_DECODE_TIME,0);
}

3.3 播放音樂,歌詞同步,音樂切換

static unsigned char music_lrc[4096];//存放從文件中讀取出來的歌詞
static unsigned char music_lrc_str[100][50];//存放篩選過后的歌詞
static u16 music_time[200];//保存每句歌詞時間
u8 buff_music[4096];
/**************播放音樂****************************/
u8 VS1053_PlayOneMusic(const char *music_file,u8 display_lrc)
{
	u16 i=0,time1,time2;
	u32 k=0;
	u16 y=32;
   u8 vol_l=50,vol_r=50;
	FIL fp;
	FRESULT res;
	UINT br;
	u8 key=0;
	res=f_open(&fp,music_file,FA_READ);//只讀
	if(res!=FR_OK)
	{
		//printf("%s文件打開失敗err:%d\r\n",music_file,res);
		return 1;
	}
   //printf("VS1053復位成功\r\n");
	LCD_ShowStr2(0,16,(u8 *)music_file,WHITE);//顯示歌名
   LCD_Refresh();//更新顯示
	VS1053_Clear_Time();//清除解碼時間
   	/*3.設置音量*/
	VS1053_SetVoice(50,50);
	while(!f_eof(&fp))//判斷是否到文件尾
	{
		key=Key_Scan();
		if(key==1)
		{
			break;//切換下一首
		}
      else if(key==2)//聲音加
      {
         if(vol_l<250)
         {
            vol_l+=50;
            vol_r+=50;
         }
         VS1053_SetVoice(vol_l,vol_r);
      }
      else if(key==3)//聲音減
      {
         if(vol_l>0)
         {
            vol_l-=50;
            vol_r-=50;
         }
         VS1053_SetVoice(vol_l,vol_r);
      }
		if(f_read(&fp,buff_music,sizeof(buff_music),&br)!=FR_OK)//讀取音頻數據
		{
			//printf("讀取文件失敗");
			f_close(&fp);
			return 2;
		}
//		printf("讀取數據成功\r\n");
		for(i=0;i
=music_time[k])//通過時間判斷顯示對應歌詞 { if(y>=(LCD_HIGHT-48))//換頁顯示歌詞 { y=32; LCD_ReflashBack();//重畫背景 LCD_ShowStr2(0,16,(u8 *)music_file,WHITE);//顯示歌名 } LCD_ShowStr2(y,16,music_lrc_str[k],WHITE);//顯示當前行 if(k>=1 && y>=48) { LCD_ShowStr2(y-16,16,music_lrc_str[k-1],GRAY);//將上一行清為底色 } LCD_Refresh();//更新顯示 y+=16; k++; } } } } return 0; } ;i++)>

3.4 讀取音樂文件,查找歌詞,播放音樂

/***********音樂播放***************/
u8 Vs1053_play_Music(const char *music_file)
{
	u32 i=0;
	u8 stat=0;
	DIR dp;
	char *p=NULL;
	FILINFO fno;
	FRESULT res;
	char buff1[50];
	char buff2[50];
	res=f_opendir(&dp,music_file);
	if(res!=FR_OK)
	{
		printf("目錄打開失敗err:%d\r\n",res);
		return 1;
	}	
	printf("目錄打卡成功\r\n");
	while(1)
	{
		res=f_readdir(&dp,&fno);
		if(res!=FR_OK || fno.fname[0]==0)
		{
			break;
		}
//		printf("%s\r\n",fno.fname);
		p=strstr(fno.fname,".mp3");//查找文件中的音頻文件
		if(p)
		{
			i=0;
			//G.E.M. 鄧紫棋 - 我的秘密
			while(1)
			{
				buff1[i]=fno.fname[i];
				if((fno.fname[i]=='.') && (fno.fname[i+1]=='m') &&  (fno.fname[i+2]=='p') &&  (fno.fname[i+3]=='3'))break;
				i++;
			}
			buff1[i]='\0';
			//顯示歌名
			LCD_ReflashBack();//重畫背景
         LCD_Refresh();//更新顯示
			//printf("歌名:%s\r\n",buff1);
			snprintf((char *)buff2,sizeof(buff2),"%s/%s.lrc",music_file,buff1);
			//printf("buff2:%s\r\n",buff2);
			stat=Vs1053_GetLrc_Music(buff2);//歌詞解析
			//if(stat==0)printf("獲取歌詞成功\r\n");
			snprintf((char *)buff2,sizeof(buff2),"%s/%s.mp3",music_file,buff1);
			stat=VS1053_PlayOneMusic(buff2,!stat);//播放音樂
			if(stat==0)
			{
				printf("音樂播放完成\r\n");
			}
			else
			{
				printf("stat=%d\r\n",stat);
			}
		}
	}
	f_closedir(&dp);
	return 0;
}

3.5 初始化硬件,掛載SD卡設備,播放音樂

int main()
{
   FRESULT ret;
   FATFS fs;
	Beep_Init();
	Led_Init();
	Key_Init();
	Usartx_Init(USART1,115200,72);
	TIMx_Init(TIM2,72,20*1000);
	W25Q64_Init();//W25Q64初始化
	IIC_Init();//IIC初始化
	NT35310_Init();//LCD初始化
	SRAM_Init();
AA:
   /*掛載磁盤*/
   ret=f_mount(&fs,"",1);
   if(ret==FR_OK)
   {
      printf("磁盤掛載成功\n");
   }
   else 
   {
      printf("請檢查SD卡是否插入!!\r\n");
      Delay_Ms(1000);
      goto AA;
   }
   VS1053_Init();
	while(1)
	{
		Vs1053_play_Music("0:/music");
	}
}
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 播放器
    +關注

    關注

    5

    文章

    401

    瀏覽量

    37527
  • vs1053
    +關注

    關注

    0

    文章

    12

    瀏覽量

    12938
  • STM32F103ZE
    +關注

    關注

    2

    文章

    14

    瀏覽量

    10911
收藏 人收藏

    評論

    相關推薦

    串口接收數據實現VS1053解碼播放

    STM32F103VET6+VS1053,通過串口接收數據,送給VS1053解碼播放,播放時一直是滋滋滋的聲音,是什么問題
    發表于 02-21 15:10

    VS1053b不能播放音樂?

    各位大佬,請求援助啊。。 最近在做一個MP3播放器,大概做法就是stm32f103vet6讀取SD卡中的音頻文件,然后在傳入VS1053b進行解碼播放。我用FATfs文件系統讀取SD卡
    發表于 01-19 15:58

    VS1053播放出現雜音怎么改進

    原子哥,是這樣子的。我仿照你們的音樂播放器例程寫了個程序,但是我是把音樂文件下載到W25Q128里面,然后沒有用FATS,而是直接從W25Q128里面讀取音樂文件發送到
    發表于 03-06 01:01

    VS1053STM32F103ZET6芯片的連接

    音樂播放實驗還未深入研究,本章內容不涉及。硬件連接:如下圖所示:VS1053STM32F103ZET6芯片的連接關系如下:1) VS_M
    發表于 08-12 06:21

    怎么實現基于STM32F4的音樂播放器的設計?

    怎么實現基于STM32F4的音樂播放器的設計?
    發表于 09-23 08:34

    怎樣去設計一種基于VS1053B-L解碼的MP3播放器

    VS1053B-L的特點有哪些?VS1003B-L的應用有哪些?怎樣去設計一種基于VS1053B-L解碼的MP3播放器?
    發表于 09-29 07:42

    基于STM32F103的MP3播放器完整項目源代碼

    基于STM32F103的MP3播放器完整項目源代碼
    發表于 12-29 17:22 ?197次下載

    STM32F103ZE-EK_Demowr文件

    STM32F103ZE-EK_Demo(2010-03-21)源代碼
    發表于 12-16 22:34 ?18次下載

    STM32F103ZE最小系統原理圖

    STM32F103ZE最小系統原理圖
    發表于 09-20 11:07 ?196次下載
    <b class='flag-5'>STM32F103ZE</b>最小系統原理圖

    基于STM32F103VCT的嵌入式媒體播放器設計

    基于STM32F103VCT的嵌入式媒體播放器設計
    發表于 09-25 11:23 ?18次下載
    基于<b class='flag-5'>STM32F103</b>VCT的嵌入式媒體<b class='flag-5'>播放器</b>設計

    基于stm32f103ze的四軸飛控代碼

    基于stm32f103ze的四軸飛控代碼
    發表于 01-13 10:21 ?30次下載

    基于STM32的錄音機設計(STM32F103+VS1053B)

    基于STM32的錄音機設計(STM32F103+VS1053B)
    發表于 11-23 18:06 ?121次下載
    基于<b class='flag-5'>STM32</b>的錄音機設計(<b class='flag-5'>STM32F103+VS1053</b>B)

    STM32F103使用TIM DMA DAC實現播放WAV音樂

    STM32F103使用TIM DAC DMA播放wave音樂
    發表于 11-24 14:51 ?28次下載
    <b class='flag-5'>STM32F103</b>使用TIM DMA DAC實現<b class='flag-5'>播放</b>WAV<b class='flag-5'>音樂</b>

    STM32F103ZE構建固件庫模板

    STM32F103ZE構建固件庫模板
    發表于 12-08 18:51 ?13次下載
    <b class='flag-5'>STM32F103ZE</b>構建固件庫模板

    STM32 VS1053單首歌曲播放資料

    STM32 VS1053單首歌曲播放STM32初學者參考。
    發表于 12-30 10:43 ?5次下載
    主站蜘蛛池模板: 亚洲亚洲人成网站在线观看 | 国内精品第一页 | 日本久久黄色 | 色吊丝中文字幕 | 视频在线一区 | 黄色网址你懂得 | 色五月激情五月 | 国产毛片农村妇女aa板 | 爱我免费视频观看在线www | 色视频在线看 | 日本不卡免费一区 | 91亚洲国产成人久久精品网站 | 狠狠操欧美 | ts人妖国产一区 | 黄视频网站入口 | 欧美人与动欧交视频 | 三级在线观看视频 | 日本不卡一区二区三区在线观看 | 特级深夜a级毛片免费观看 特级生活片 | 日本色视 | 国产精品一区在线播放 | 亚洲免费播放 | 中文字幕第五页 | 天天射天天拍 | 国产亚洲欧美日韩俺去了 | 色老二精品视频在线观看 | 优优国产在线视频 | 国产一级片免费看 | 成年网站在线观看 | 亚洲大香伊人蕉在人依线 | 久久免费精品高清麻豆 | 国产精品理论片在线观看 | 2018天天拍拍拍免费视频 | 国产一区二区播放 | 欧美精品一区视频 | 五月婷婷六月综合 | 国模精品一区二区 | 最新久久免费视频 | 亚洲 另类 在线 欧美 制服 | 成人亚洲网 | 久久久久久久久综合影视网 |