【STM32串口控制DY-SV5W MP3模块】

软硬件条件

硬件条件

  1. DY-SV5W MP3模块
    在这里插入图片描述

  2. STM32F407ZET6

开发环境

  1. keil MDK(5)

DY-SV5W MP3模块介绍

产品概述

DY-SV5W是一款智能语音模块,集成IO分段触发,UART串口控制,ONE_line单总线串口控制,标准MP3等7种工作模式,简单拨码开关设置;板载5W D类功放,可直接驱动4Ω,3~5W喇叭;支持MP3,WAV解码格式,最大支持32G TF卡存储,可通过USB数据线连接电脑更新TF卡存储音频文件。

产品特性

1、完全支持FAT16/FAT32文件系统,最大支持32G的TF卡。

2、自带5W D类功放,可直接驱动4Ω,3~5W喇叭。

3、UART串口控制语音播报功能,可控制播放,暂停,选曲,音量加减等功能,最大选曲65535首曲目,波特率9600bit/s。

4、支持IO触发播放功能,8个IO口单独触发8首曲目或8个IO口组合触发255首曲目。

5、支持3个配置IO进行多达7种工作模式选择,拨码开关设置简单。

工作模式

在这里插入图片描述

UART串口模式

配置DY-SV5W为UART串口模式需将拨码开关配置引脚CON3拉高,其他拉低。

DY-SV5W 串口通信格式

采用全双工串口通信;
波特率为 9600,数据位:8 ,停止位 1 位,检验位 N。
起始码-指令类型-数据长度(n)-数据 1-数据 n-和检验(SM)
※ 指令码 :固定为 AA。
※ 指令类型 : 用来区分指令类型。
※ 数据长度:指令中的数据的字节数。
※ 数据 :指令中的相关数据,当数据长度为 1 时,表示只有 CMD,没有数据位。
※ 和检验 :为之前所有字节之和的低 8 位,即起始码到数据相加后取低 8 位。
※ 数据格式:发送的数据或命令,高 8 位数据在前,低 8 位在后。

代码实现

本程序中 使用STM32F407 串口2 与 MP3模块进行串口通信,注意需将STM32F407 串口2波特率设置为9600。
曲目名称必须按照5位数字进行命名。例如:00001.mp3,00002.mp3。

usart2.c

串口配置可参考正点原子教程

#include "sys.h"
#include "usart2.h"	 
#include "math.h"
#include "stdlib.h"
u16 USART2_RX_STA=0;
u8 Res ;
u16 len;

u8 USART2_RX_BUF[USART2_REC_LEN];


void usart2_init(u32 bound)
{  	 
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
 
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);     //使能GPIOD时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);    //使能USART2时钟

	GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2);  //GPIOD5复用为USART2
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2);  //GPIOD6复用为USART2
	
	
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;   //PD5,PD6,复用功能,上拉输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;             //复用功能 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	       //速度50MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;           //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;             //上拉
	GPIO_Init(GPIOD,&GPIO_InitStructure);                    //初始化PD5,PD6

	
	
	USART_InitStructure.USART_BaudRate = bound;              //一般设置为9600;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;   //一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;      //无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;	       // 发模式
  USART_Init(USART2, &USART_InitStructure);                //初始化串口
  USART_Cmd(USART2, ENABLE);                               //使能串口 
	
	
	USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);           //开启相关中断
	
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;        //串口2中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;  //抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;		     //子优先级2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			     //IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	                         //根据指定的参数初始化VIC寄存器
}

void USART2_IRQHandler(void)                	             //串口2中断服务程序  可以
{
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)    //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
		Res =USART_ReceiveData(USART2);												 //读取接收到的数据	

		if((USART2_RX_STA&0x8000)==0)                          //接收未完成
		{
			if(USART2_RX_STA&0x4000)														 //
			{
				if(Res!=0x0a)USART2_RX_STA=0;											 //接收错误,重新开始
				else USART2_RX_STA|=0x8000;	                       //接收完成了 
			}
		  else                                                 
		  {	
		    if(Res==0x0d)USART2_RX_STA|=0x4000;
			  else
			  {
				  USART2_RX_BUF[USART2_RX_STA&0X3FFF]=Res ;
				  USART2_RX_STA++;
				  if(USART2_RX_STA>(USART2_REC_LEN-1))USART2_RX_STA=0;//接收数据错误,重新开始接收	  
			  }		 
			}
		}
	}
}

MP3.c

这里给出DY-SV5W 串口配置部分指令,其他指令可参考此程序,自行对着DY-SV5W数据手册编写

#include "mp3.h"
#include "delay.h"


// 0x00 全盘循环
// 0x01 单曲循环
// 0x02 单曲停止
// 0x03 全盘随机
// 0x04 目录循环
void Loop_mode(u8 mode)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x18);
				delay_ms(10);
				USART_SendData(USART2,0x01);
				delay_ms(10);
				USART_SendData(USART2,mode);
				delay_ms(10);
				USART_SendData(USART2,0xC3+mode);
				delay_ms(10);
}

//播放  从头开始播放当前曲目
void Mp3_play(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x02);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xAC);
				delay_ms(10);
}



//暂停 
void Mp3_suspend(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x03);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xAD);
				delay_ms(10);
}

//停止
void Mp3_stop(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x04);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xAE);
				delay_ms(10);
}

//上一曲
void Mp3_prev(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x05);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xAF);
				delay_ms(10);
}

//下一曲
void Mp3_next(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x06);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xB0);
				delay_ms(10);
}

//指定曲目 
//入口参数
//high 曲目高8位
//low  曲目低8位
void Assigned_music(u8 high ,u8 low)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x07);
				delay_ms(10);
				USART_SendData(USART2,0x02);
				delay_ms(10);
				USART_SendData(USART2,high);
				delay_ms(10);
				USART_SendData(USART2,low);
				delay_ms(10);
				USART_SendData(USART2,0xB3+high+low);
				delay_ms(10);
}

//设置音量
//入口参数vol 音量大小
void Set_vol(u8 vol)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x13);
				delay_ms(10);
				USART_SendData(USART2,0x01);
				delay_ms(10);
				USART_SendData(USART2,vol);
				delay_ms(10);
				USART_SendData(USART2,0xBE);
				delay_ms(10);
}

//加音量
void Add_vol(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x14);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xBE);
				delay_ms(10);
}

//减音量
void Minus_vol(void)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x15);
				delay_ms(10);
				USART_SendData(USART2,0x00);
				delay_ms(10);
				USART_SendData(USART2,0xBF);
				delay_ms(10);
}



//设置循环次数
//入口参数 
//hightimes  次数高8位
//lowtimes   次数低8位
void Set_looptimes(u8 hightimes ,u8 lowtimes)
{
				USART_SendData(USART2,0xAA);
				delay_ms(10);
				USART_SendData(USART2,0x19);
				delay_ms(10);
				USART_SendData(USART2,0x02);
				delay_ms(10);
				USART_SendData(USART2,hightimes);
				delay_ms(10);
				USART_SendData(USART2,lowtimes);
				delay_ms(10);
				USART_SendData(USART2,0xC5+hightimes+lowtimes);
				delay_ms(10);
}



  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值