STM32 使用SYN6288语音模块

慈云数据 2024-03-23 技术支持 77 0

文章目录

  • 前言
  • 一、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 
          ecc = ecc ^ (Frame_Info[i]);		//对发送的字节进行异或校验
        }
        for(i = 0; i 
微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon