标题:
STM32F1单片机播放wav文件音乐的源程序
[打印本页]
作者:
mycnxp
时间:
2018-8-8 17:12
标题:
STM32F1单片机播放wav文件音乐的源程序
一个将WAV文件转换成代码,直接储存在STM32上并直接播放的程序。亲测在STM32F1系列上直接可用,将你的耳机或者功放+喇叭接在B0,就可以听到美妙的音乐啦。
附件
单片机源程序如下:
#include"typedef.h"
#include"sysinit.h"
#include"wav_fmt.h"
#include"driver.h"
#include<stdio.h>
extern u8 WaveData[];
struct RIFF_BLOCK RiffBlock;
struct FMT_BLOCK FmtBlock;
struct FACT_BLOCK FactBlock;
struct DATA_BLOCK DataBlock;
u32 MusicPosite = 0;
void WavResolve(void);
void SongInfoLCD(void);
int main()
{
RCC_Config();
NVIC_Config();
GPIO_Config();
// LCD1602_Init();
WavResolve();
// SongInfoLCD();
TIMx_Config();
while(1)
{
}
}
void WavResolve(void)
{
/* RIFF WAVE Chunk 内容解析 */
RiffBlock.szRiffID[0] = WaveData[MusicPosite++]; // 'R'
RiffBlock.szRiffID[1] = WaveData[MusicPosite++]; // 'I'
RiffBlock.szRiffID[2] = WaveData[MusicPosite++]; // 'F'
RiffBlock.szRiffID[3] = WaveData[MusicPosite++]; // 'F'
RiffBlock.dwRiffSize = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite++] << 24);
RiffBlock.szRiffFormat[0] = WaveData[MusicPosite++]; // 'W'
RiffBlock.szRiffFormat[1] = WaveData[MusicPosite++]; // 'A'
RiffBlock.szRiffFormat[2] = WaveData[MusicPosite++]; // 'V'
RiffBlock.szRiffFormat[3] = WaveData[MusicPosite++]; // 'E'
/* Format Chunk 内容解析 */
FmtBlock.szFmtID[0] = WaveData[MusicPosite++]; // 'f'
FmtBlock.szFmtID[1] = WaveData[MusicPosite++]; // 'm'
FmtBlock.szFmtID[2] = WaveData[MusicPosite++]; // 't'
FmtBlock.szFmtID[3] = WaveData[MusicPosite++]; // ' '
FmtBlock.dwFmtSize = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite++] << 24);
FmtBlock.wavFormat.wFormatTag = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8);
FmtBlock.wavFormat.wChannels = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8);
FmtBlock.wavFormat.dwSamplesPerSec = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite++] << 24);
FmtBlock.wavFormat.dwAvgBytesPerSec = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite++] << 24);
FmtBlock.wavFormat.wBlockAlign = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8);
FmtBlock.wavFormat.wBitsPerSample = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8);
if(WaveData[MusicPosite] != 'f')
goto dt;
/* Fact Chunk(optional) 内容解析 */
FactBlock.szFactID[0] = WaveData[MusicPosite++]; // 'f'
FactBlock.szFactID[1] = WaveData[MusicPosite++]; // 'a'
FactBlock.szFactID[2] = WaveData[MusicPosite++]; // 'c'
FactBlock.szFactID[3] = WaveData[MusicPosite++]; // 't'
FactBlock.dwFactSize = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite++] << 24);
MusicPosite +=FactBlock.dwFactSize;
/* Data Chunk 内容解析 */
dt: DataBlock.szDataID[0] = WaveData[MusicPosite++]; // 'd'
DataBlock.szDataID[1] = WaveData[MusicPosite++]; // 'a'
DataBlock.szDataID[2] = WaveData[MusicPosite++]; // 't'
DataBlock.szDataID[3] = WaveData[MusicPosite++]; // 'a'
DataBlock.dwDataSize = WaveData[MusicPosite++] + (WaveData[MusicPosite++] << 8) +
(WaveData[MusicPosite++] << 16) + (WaveData[MusicPosite] << 24);
}
/*****************************************************************************
*函数名称:SongInfoLCD
*功能描述:将歌曲信息显示在显示器上
*函数输入:
*函数输出:
*注意事项:
*****************************************************************************/
void SongInfoLCD(void)
{
lcd_clr_screen();
lcd_set_cursor(0,0);
lcd_printf("Music Freq: %dHz",FmtBlock.wavFormat.dwSamplesPerSec/1000);
lcd_set_cursor(0,1);
lcd_printf("Music Time: %ds",(u8)(DataBlock.dwDataSize/FmtBlock.wavFormat.dwSamplesPerSec));
}
复制代码
所有资料51hei提供下载:
PWMMusic.rar
(424.61 KB, 下载次数: 145)
2018-8-8 17:57 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
邰夏留
时间:
2018-11-8 08:04
这个用dac会不会好点呢。不过RB应该没DAC。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1