需要用到这个模块播放特定的语音,主要是基于这个文章复刻的,博主给的代码很全,非常感谢
BY9301-16P语音播报模块实物如下图所示:
原理图如下:
为了方便在这里使用USART2通信,开发板使用的是正点原子探索者STM32F407,连接PA2,PA3
以下是sound.h的代码,定义了初始化函数,音量设置,选着特定文件播报,播放暂停功能。
#ifndef __BY9301_AS_H
#define __BY9301_AS_H
#include "stm32f4xx.h"
typedef struct {
void (* init)(uint32_t);
void (* sayFileID)(uint8_t);
void (* setVolume)(uint8_t);
void (* playPause)(uint8_t);
void (* sound_play)(uint8_t);
} BY9301ClassStruct;
extern BY9301ClassStruct BY9301Class;//声明个外部可见的结构体变量,用于在其他源文件中引用 BY9301 模块的功能接口。
#endif
其中比较重要的两个关于播报的函数如下:
/**
* @brief 语音串口发送 具体协议参见手册
* @param str: 要发送的内容
* @retval None
*/
static void BY9301_SendString(uint8_t *str)
{
if(str[1] == 0) return;
uint8_t i;
for(i = 0; i < str[1] + 2; i++)
{
USART_SendData(USART2, str[i]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){}
}
while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET){}
}
/**
* @brief 指定序号播报
* @param NOx: mp3文件序号
中文:黑1 白2 红3 绿4 蓝5
英文:黑6 白7 红8 绿9 蓝10
* @retval None
*/
static void BY9301_Say(uint8_t NOx)
{
uint8_t arr[8] = {0};
arr[0] = 0x7E;
arr[1] = 0x05;
arr[2] = 0x41;
arr[3] = 0x00;
arr[4] = NOx;
arr[5] = arr[1]^arr[2]^arr[3]^arr[4];
arr[6] = 0xEF;
BY9301_SendString(arr);
}
效果演示:
by9301效果演示
参考