STM32 使用SYN6288语音模块

news2024/11/18 1:42:11

文章目录

  • 前言
  • 一、SYN6288介绍
  • 二、SYN6288原理讲解
  • 三.数据的异或校验
  • 四.代码编写
    • 1.串口的初始化
    • 2.SYN6288代码编写
    • 3.main函数逻辑
  • 总结


前言

本篇文章带大家学习一下SYN6288语音模块,这个模块可以用于车载设备,语音电子书等众多产品当中,而且这个模块支持多种编码格式,GB2312,GBK等字符编码格式。

一、SYN6288介绍

SYN6288语音合成模块是一种语音合成设备,其可实现文字转语音功能,将输入的文字信息通过内部的处理和合成,输出相对应的语音信息。SYN6288模块具有语音合成质量高、输出音质好、使用方便等特点,因此广泛应用于语音播报、语音提示、语音识别、智能家居、智能家电、安防监控等领域。

SYN6288语音合成模块的特性如下:

支持多语言:包括中文、英文、日文、韩文等多种语言。

支持音量、语速、语调控制:可以通过外部控制模块来调整合成语音的音量、语速和语调,满足不同场合和需求下的需求。

音频输出接口:模块内置了DAC接口,可以直接连接扬声器输出语音。

低功耗:工作电流小,运行稳定可靠。

支持外部控制:模块上有12个通用IO引脚,可对模块进行控制及调试。

二、SYN6288原理讲解

SYN6288引脚接线图:
在这里插入图片描述
这个模块只需要接4个引脚即可工作:

RXD—板子上的TXD
TXD—板子上的RXD
VCC—VCC(5V)
GND—GND

SYN6288波特率配置:

根据手册可以得知需要把对应的串口波特率设置为9600bps。
在这里插入图片描述
SYN6288通信帧定义:

根据手册我们可以得知通信帧格式:帧头FD + 数据区长度 + 数据区 的格式。

在这里插入图片描述

命令帧举例:

根据这里给出的例子我们可以知道如何来发送一次帧数据。下面的代码将会详细说明如何发送一次帧数据。

首先帧头必须是0XFD,然后接着的是数据区长度,数据区长度是由两个十六进制的数组成的,比如下面举的例子 0x00 0x0B那么数据区的长度就是11,从0x01到0xC1算起来刚刚好是11个字节。

命令帧必须严格按照这个要求来构造。
在这里插入图片描述
在这里插入图片描述

SYN6288模块的默认波特率为9600bps,当然了我们也可以进行波特率的修改,改为自己需要的波特率

设置波特率的命令:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三.数据的异或校验

在发送数据之前需要对所以的数据进行一次异或校验然后将得到的值放入数据的结尾。

在C语言中使用 ^符号进行异或操作,下面代码将详细写出如何进行异或操作。

四.代码编写

1.串口的初始化

这里我们使用串口5来和SYN6288模块进行通信。

UART_HandleTypeDef UART5_Handler; //UART句柄
uint8_t SYS6288Rx = 0; // 语音模块接收缓冲区

//初始化IO 串口5 语音模块 
//bound:波特率
void SYS6288_uartInit(u32 bound)
{
	//UART 初始化设置
	UART5_Handler.Instance=UART5;					    		//UART5
	UART5_Handler.Init.BaudRate=bound;				    //波特率
	UART5_Handler.Init.WordLength=UART_WORDLENGTH_8B;   //字长为8位数据格式
	UART5_Handler.Init.StopBits=UART_STOPBITS_1;	    //一个停止位
	UART5_Handler.Init.Parity=UART_PARITY_NONE;		    //无奇偶校验位
	UART5_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;   //无硬件流控
	UART5_Handler.Init.Mode=UART_MODE_TX_RX;		    //收发模式
	HAL_UART_Init(&UART5_Handler);					    //HAL_UART_Init()会使能UART5
	
	HAL_UART_Receive_IT(&UART5_Handler, &SYS6288Rx, 1);//该函数会开启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量	
}


void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{
    //GPIO端口设置
	GPIO_InitTypeDef GPIO_Initure;

	if(huart->Instance==UART5)//如果是串口5,进行串口5 MSP初始化
	{
		__HAL_RCC_GPIOC_CLK_ENABLE();			//使能GPIOC时钟
		__HAL_RCC_GPIOD_CLK_ENABLE();			//使能GPIOD时钟
		__HAL_RCC_UART5_CLK_ENABLE();			//使能UART5时钟		
		
		GPIO_Initure.Pin=GPIO_PIN_12;			//PC12
		GPIO_Initure.Mode=GPIO_MODE_AF_PP;		//复用推挽输出
		GPIO_Initure.Pull=GPIO_PULLUP;			//上拉
		GPIO_Initure.Speed=GPIO_SPEED_FAST;		//高速
		GPIO_Initure.Alternate=GPIO_AF8_UART5;	//复用为UART5
		HAL_GPIO_Init(GPIOC,&GPIO_Initure);	   	//初始化PC12

		GPIO_Initure.Pin=GPIO_PIN_2;			//PD2
		HAL_GPIO_Init(GPIOD,&GPIO_Initure);	   	//初始化PD2
		
		HAL_NVIC_EnableIRQ(UART5_IRQn);				//使能USART6中断通道
		HAL_NVIC_SetPriority(UART5_IRQn,3,3);		//抢占优先级3,子优先级3
	}	

}

//串口5中断服务程序
void UART5_IRQHandler(void)                	
{ 	
	HAL_UART_IRQHandler(&UART5_Handler);	//调用HAL库中断处理公用函数
	
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{

	if(huart->Instance == UART5) // 仅处理UART5串口的接收中断
    {
			HAL_UART_Receive_IT(&UART5_Handler, &SYS6288Rx, 1);//启动下一次接收	
    }		
}

2.SYN6288代码编写

syn6288.c

//Music:选择背景音乐。0:无背景音乐,1~15:选择背景音乐
void SYN_FrameInfo(u8 Music, u8 *HZdata)
{
  /****************需要发送的文本**********************************/
  unsigned  char  Frame_Info[50];
  unsigned  char  HZ_Length;
  unsigned  char  ecc  = 0;  			//定义校验字节
  unsigned  int i = 0;
  HZ_Length = strlen((char*)HZdata); 			//需要发送文本的长度

  /*****************帧固定配置信息**************************************/
  Frame_Info[0] = 0xFD ; 			//构造帧头FD
  Frame_Info[1] = 0x00 ; 			//构造数据区长度的高字节
  Frame_Info[2] = HZ_Length + 3; 		//构造数据区长度的低字节
  Frame_Info[3] = 0x01 ; 			//构造命令字:合成播放命令
  Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定

  /*******************校验码计算***************************************/
  for(i = 0; i < 5; i++)   				//依次发送构造好的5个帧头字节
  {
    ecc = ecc ^ (Frame_Info[i]);		//对发送的字节进行异或校验
  }

  for(i = 0; i < HZ_Length; i++)   		//依次发送待合成的文本数据
  {
    ecc = ecc ^ (HZdata[i]); 				//对发送的字节进行异或校验
  }
  /*******************发送帧信息***************************************/
  memcpy(&Frame_Info[5], HZdata, HZ_Length);
  Frame_Info[5 + HZ_Length] = ecc;
  SendStr5(Frame_Info, 5 + HZ_Length + 1);
}

/***********************************************************
* 名    称: YS_SYN_Set(u8 *Info_data)
* 功    能: 主函数	程序入口
* 入口参数: *Info_data:固定的配置信息变量
* 出口参数:
* 说    明:本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
* 调用方法:通过调用已经定义的相关数组进行配置。
**********************************************************/
void YS_SYN_Set(u8 *Info_data)
{
  u8 Com_Len;
  Com_Len = strlen((char*)Info_data);
  SendStr5(Info_data, Com_Len);
}

syn6288.h

#ifndef _SYN6288_H
#define _SYN6288_H

#include "stm32f4xx_hal.h"
#include "sys.h"

void SYN_FrameInfo(u8 Music, u8 *HZdata);
void YS_SYN_Set(u8 *Info_data);

#endif

3.main函数逻辑

这里波特率要特别注意默认需要设置为9600bps,要修改成别的波特率的话需要按照手册上的命令帧发送数据修改。

SYS6288_uartInit(9600);					//语音串口

SYN_FrameInfo(2, (u8*)"OK");//语音播报OK

总结

本篇文章讲解到了SYN6288语音模块的使用,主要还是需要注意波特率的设置和命令帧的构造。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/548423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 创建线程源码分析 JavaThreadNativeThread

前言 本文分析在Android中创建线程时候的源码分析,即JavaThread和NativeThread。 java/lang/Thread.java art/runtime/native/java_lang_Thread.cc art/runtime/thread.cc 两种Java Thread 有两种可以运行Java代码的线程。有两种情况: 通过new Thread创建的java线程在Nati…

若依分离版——IDEA开发SpringBoot的webservice接口

一.webservice介绍 WebService是帮助多个应用程序与平台和编程语言之间以独立的方式互相通信的标准化技术。它是利用标准 XML messaging(主要 SOAP) 技术&#xff0c;可以访问网络上的其他计算机的记述多种操作的软件接口。此接口主要由 WSDL (WebService Description Language…

WPF 未能加载文件或程序集 System.Windows.Interactivity

先说一下原因&#xff0c;这是因为微软抛弃了Interactivity导致。 NuGet下载Behaviors.Wpf 在xaml界面替换掉有Interactivity那一行&#xff0c;替换为: xmlns:i“http://schemas.microsoft.com/xaml/behaviors”

OA管理痛点解决:从“硬编码”到“低代码”

低代码开发平台是一种逐渐流行起来的软件开发方式&#xff0c;它可以以快速且简单的方式构建各种应用程序&#xff0c;从而帮助企业快速响应市场变化和满足不断变化的业务需求。在企业的日常管理工作中&#xff0c;OA系统是一种非常常见的应用程序&#xff0c;它可以帮助企业管…

外包五年,你知道这五年我怎么过的吗?

”五年&#xff0c;你知道我这五年怎么过的吗&#xff1f;“ 5年时间&#xff0c;我一路从外包到字节&#xff0c;说一句很俗的话&#xff0c; 现在的我真的要好好谢谢当初拼命努力的自己&#xff0c;要感谢跳出舒适圈的自己&#xff0c; 外包薪资真的不少&#xff0c;当初毕…

10几个类ChatGPT国内AI大模型【内附体验网址】

文章目录 前言1. AI文本工具站效率工具自媒体创作工具代码工具 2.道和顺ChatIC3.星期五4.文心一言5.讯飞星火认知大模型6.通义千问7.商汤-日日新8.Moss9.ChatGLM10. 360智脑写在最后 前言 随着ChatGPT迅速走红,国内各大企业纷纷发力认知大模型领域。经过一段时间的酝酿&#x…

微前端子应用间通信和数据共享

前面讲到了微前端的应用:(94条消息) 微前端应用(qiankunumiantd)_他夏了夏天吖的博客-CSDN博客https://blog.csdn.net/zh0623/article/details/130615234?spm1001.2014.3001.5501今天讲一下不同子应用的通信和数据共享问题 微前端不同子应用之间可能需要进行通信和数据共享,假…

深度学习中,batch大小对模型的效果有影响吗?

内容来自李宏毅-2021机器学习 ##先说结论&#xff1a;同一个模型&#xff0c;大batch结果往往会较差。 上图中&#xff0c;横轴代表batch size&#xff0c;从左到右越来越大&#xff1b;纵轴代表准确率acc&#xff0c;越往上正确率越来越高。 在观察validation上的结果时&…

【数据结构与算法】基础数据结构

文章目录 数组概述动态数组二维数组局部性原理越界检查 链表概述单向链表单向链表&#xff08;带哨兵&#xff09;双向链表&#xff08;带哨兵&#xff09;环形链表&#xff08;带哨兵&#xff09; 队列概述链表实现环形数组实现 栈概述链表实现数组实现应用 双端队列概述链表实…

Android内部存储与外部存储(私有目录与公共目录)图文详解

目录 一、存储空间概述 二、存储空间的划分 1、存储划分 2、内部存储 2.1 内部存储概述 2.2 内部存储 - 私有目录 3. 外部存储 3.1 外部存储概述 3.2 外部存储 - 私有目录 3.3 外部存储 - 公共目录 三、内部存储与外部存储比较 1、横向对比 2、目录结构 3、存储分…

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五

English Learning - L3 作业打卡 Lesson3 Day15 2023.5.19 周五 引言&#x1f349;句1: We present more expressions about food.成分划分连读爆破语调 &#x1f349;句2: They are from Elenir Scardueli, a listener in Brazil.成分划分弱读连读语调 &#x1f349;句3: My m…

plsql为什么连不上远程或本地的Oracle,需要做哪些准备?

文件配置解说 tnsnames.ora文件 文件所在地址&#xff1a;ORACLE_HOME\network\admin ORACLE_HOME&#xff1a;Oracle数据库或者客户端软件所在的地址 但是我的在Oracle数据库的目录下&#xff0c;而不是Oracle客户端软件&#xff08;instantclient_11_2&#xff09;下 里…

分布式架构设计及理论指导

目录 核心概念分布式分布式SOA架构微服务架构微服务技术对比 服务拆分拆分思想和原则创建父类工程创建子工程 远程调用方式引入RestTemplate CAP/BASE理论CAP理论分区容错 &#xff08;Partition-tolerance&#xff09;一致性&#xff08;Consistency&#xff09;可用性&#x…

【C++】继承/虚拟继承/菱形虚拟继承

继承 继承的概念继承体系中对象赋值转换继承方式对继承后的访问限定&#xff08;重定义-同名隐藏&#xff09;继承体系中派生类的默认成员函数友元函数、静态成员在继承中的特点菱形继承和菱形虚拟继承 继承的概念 为了让代码可以复用&#xff0c;当前类可以继承其他类的成员变…

阿里云OSS存储空间绑定自定义域名,浏览器通过自定义域名预览文件

阿里云官方文档&#xff1a; 如何绑定自定义域名_对象存储-阿里云帮助中心 华东1&#xff08;杭州&#xff09;地域创建了名为monkey的存储空间 Bucket&#xff1a;monkey Endpoint&#xff1a;oss-cn-hangzhou.aliyuncs.com 上传文件默认域名的url: https://monkey.oss-cn-han…

微信小程序nodejs+vue课程推荐报名学习分享平台uniapp

本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c; 整个开发过程首先对课程分享平台进行需求分析&#xff0c;得出课程分享平台主要功能。接着对课程分享平台 进行总体设计和详细设计。总体设计主要包括小程序功能设计、小程序总体结构设计、小程序…

Python数据可视化小结

1. 引言 原始形式的数据对大多数人来说可能都是枯燥乏味的&#xff0c;但是如果掌握正确的可视化工具&#xff0c;给人的印象就会变得引人入胜。本文通过实际例子&#xff0c;让我们利用数据可视化工具来探索不一样的数据体验。 闲话少说&#xff0c;我们直接开始吧&#xff…

推荐3款超好用的海报设计软件!

在现代社会&#xff0c;海报设计已经成为了一种非常重要的视觉传达方式。如果你需要制作一个引人注目的海报&#xff0c;但却没有设计师的技能和经验&#xff0c;那么在线海报设计图片软件就是你的最佳选择。下面我们将介绍 5 款最受欢迎的在线海报设计图片软件&#xff0c;它们…

qt中使用QGIS实现二次开发导入shp格式地图(MSVC2019_64bit+qt5.15+qgis)

在qt开发过程中可能要导入自定义格式的图层地图&#xff0c;那么可以把这些数据导入qgis然后导出为shp格式文件&#xff0c;然后下载qgis源码&#xff0c;在qt项目中配置环境变量导入qgis有关的头文件&#xff0c;然后再引入shp数据格式的地图。 qgis处理数据 QGIS安装 QGIS…

oracle数据库当中用户的创建,添加,授权,以及表的创建与表的简单介绍,以及在oracle数据库当中的约束以及约束条件的简单介绍

系列文章目录 (3条消息) oracle数据库简介 文章目录 系列文章目录 前言 一、用户的创建 1.1、创建命令 1.2、给予scott用户权限 1.3、以scott用户进行连接登录 二、表和表的设计原则 2.1、表的概念 2.1.1、表是从属于用户的 2.1.2、表是逻辑表(概念表)&#xff0c;不…