STM32 使用SYN6288语音模块


前言

本篇文章带大家学习一下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语音模块的使用,主要还是需要注意波特率的设置和命令帧的构造。

  • 37
    点赞
  • 354
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
### 回答1: 下面是一个使用STM32SYN6288语音模块发送合成文本的示例程序: ```c #include "stm32f10x.h" #include "usart.h" void delay(uint32_t time) { while(time--); } void uart_send_string(char* str) { while(*str) { USART_SendData(USART1, *str++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); } } void syn6288_send_text(char* text) { char syn6288_header[] = {0xFD, 0x00}; // 发送合成文本指令 uart_send_string(syn6288_header); delay(500); // 等待一段时间,确保SYN6288正确接收指令 uart_send_string(text); delay(1000); // 等待一段时间,确保SYN6288完成语音合成 } int main(void) { USART_Configuration(); while(1) { syn6288_send_text("欢迎使用STM32SYN6288语音模块!"); delay(5000); // 等待一段时间,再次发送合成文本 } } ``` 这个示例程序使用STM32的串口发送数据的功能,并且通过SYN6288语音模块的指令,发送合成文本到语音模块。在主函数中,我们不断发送“欢迎使用STM32SYN6288语音模块!”这个文本到语音模块,并且每次发送完后等待5秒,再次发送合成文本。 请注意,此示例程序只提供了基本的发送文本功能,具体的SYN6288语音模块使用细节和指令格式,请参考SYN6288的相关文档。 ### 回答2: 以下是一个使用STM32SYN6288语音模块发送合成文本的示例程序: 1. 首先,我们需要配置USART串口通信的硬件设置,将STM32的USART连接到SYN6288语音模块的串口接口上。确保USART的波特率和SYN6288语音模块的波特率一致。 2. 在程序中引入STM32的库文件,并初始化USART串口。 3. 在主函数中,创建一个发送文本的函数。在发送函数内部,我们需要设置SYN6288语音模块的指令格式,并将要发送的文本数据存储在一个字符数组中。 4. 在发送函数中,我们需要计算文本的长度,并将其转换为ASCII码,并根据SYN6288语音模块的指令格式,将文本发送给语音模块。 5. 最后,我们可以在主函数中调用发送函数来发送一个示例文本。在调用发送函数之前,可以进行一些其他的操作,如延时一段时间或者等待外部触发信号。 请注意,以上只是一个示例程序框架,实际应用中可能还需要进行一些其他的设置和调试。具体的实现和调整需要根据具体的硬件连接和需求进行。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花落已飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值