资讯详情

STM32传感器外设集--语音模块(SYN6288)

图片

SYN6288.h

SYN6288.c

stm32f10x_it.h

main.c


图片

如何使用该模块,首先,SYN6288使用串口通信,许多模块实际上使用串口通信,有助于输入指令,所以使用串口通信很简单,首先配置串口等

SYN6288.h

我在这里用串口4,当然C8T如果只需要三个串口,可以自行修改串口配置

#ifndef _SYN6288_H_ #define _SYN6288_H_ #include "stm32f10x.h"  /**     ******************************************************************************   *  @File     SYN6288.h   *  @Author   Velscode     *  @Email    velscode@gmail.com   *  @Brief    TTS 芯片 SYN基于6288驱动头文件(基于STM32F10x)   *            使用了USART2(A2\A3)   ******************************************************************************   */  /****************************** SYN6288 引脚配置参数定义***************************************/ #define             SYN6288_GPIO_APBxClock_FUN              RCC_APB2PeriphClockCmd #define             SYN6288_GPIO_CLK                        RCC_APB2Periph_GPIOC #define             SYN6288_GPIO_PORT                       GPIOC #define             SYN6288_GPIO_PIN                        GPIO_Pin_6 #define          SYN6288_Read_GPIO_IN()                 GPIO_ReadInputDataBit ( SYN6288_GPIO_PORT, SYN6288_GPIO_PIN )    // 串口4-UART4 #define  DEBUG_USARTx                   UART4 #define  DEBUG_USART_CLK                RCC_APB1Periph_UART4 #define  DEBUG_USART_APBxClkCmd         RCC_APB1PeriphClockCmd #define  DEBUG_USART_BAUDRATE           9600  // USART GPIO 引脚宏定义 #define  DEBUG_USART_GPIO_CLK           (RCC_APB2Periph_GPIOC) #define  DEBUG_USART_GPIO_APBxClkCmd    RCC_APB2PeriphClockCmd      #define  DEBUG_USART_TX_GPIO_PORT         GPIOC    #define  DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_10 #define  DEBUG_USART_RX_GPIO_PORT       GPIOC #define  DEBUG_USART_RX_GPIO_PIN        GPIO_Pin_11  #define  DEBUG_USART_IRQ                UART4_IRQn #define  DEBUG_USART_IRQHandler         UART4_IRQHandler  void SYN6288_GPIO_Config ( void ); void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch); void SYN6288_Speech( USART_TypeDef * pUSARTx,char * str ); void SYN688_USART_Config(void); void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch); void SYN_FrameInfo(char *HZdata); void Usart_SendString( USART_TypeDef * pUSARTx, char *str); /* 音量控制 */ void Volinme(uint8_t Y_L); /* 语调控制 */ void Intonation(uint8_t Y_L); /* 语速控制 */ void Speed_pacing(uint8_t Y_L); /* 人控制 */ void speed_man(uint8_t Y_L); #endif /*_SYN6288_H_*/ /* End of File ------------------------------------------------------------- */  

SYN6288.c

这里是配置参数和给出参数SYN6288发指令等

/** ****************************************************************************** *  @File     SYN6288.c *  @Author   Velscode   *  @Email    velscode@gmail.com *  @Brief    TTS 芯片 SYN基于6288驱动源代码文件STM32F10x) *            使用了USART2(A2\A3) ****************************************************************************** */  /* Internal Function Declaration ------------------------------------------- */ void usart2_Init(unsigned int bound);  /* Header Files ------------------------------------------------------------ */ #include "SYN6288.h" #include "string.h" #include "bsp_SysTick.h" #include <string.h>    /**   * @brief  嵌套向量中断控制器NVIC   * @param  无   * @retval 无   */ static void NVIC_Configuration(void) {   NVIC_InitTypeDef NVIC_InitStructure;      /* 选择嵌套向量中断控制器组 */   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      /* 配置USART为中断源 */   NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;   /* 抢断优先级*/   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;   /* 子优先级 */   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;   /* 使能中断 */   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   /* 初始化配置NVIC */   NVIC_Init(&NVIC_InitStructure); } //读忙 void SYN6288_GPIO_Config ( void ) {    /*定义一个GPIO_InitTypeDef结构类型*/  GPIO_InitTypeDef GPIO_InitStructure;    /* 配置 LED1 引脚 */  SYN6288_GPIO_APBxClock_FUN(SYN6288_GPIO_CLK, ENABLE);                     GPIO_InitStructure.GPIO_Pin = SYN6288_GPIO_PIN;   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   GPIO_Init ( SYN6288_GPIO_PORT, & GPIO_InitStructure );    }   /**   * @brief  USART GPIO 配置,工作参数配置   * @param  无   * @retval 无   */ voi SYN688_USART_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	// 打开串口GPIO的时钟
	DEBUG_USART_GPIO_APBxClkCmd(DEBUG_USART_GPIO_CLK, ENABLE);
	
	// 打开串口外设的时钟
	DEBUG_USART_APBxClkCmd(DEBUG_USART_CLK, ENABLE);

	// 将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

  // 将USART Rx的GPIO配置为浮空输入模式
	GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);
	
	// 配置串口的工作参数
	// 配置波特率
	USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;
	// 配置 针数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	// 配置停止位
	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_Rx | USART_Mode_Tx;
	// 完成串口的初始化配置
	USART_Init(DEBUG_USARTx, &USART_InitStructure);
	
	// 串口中断优先级配置
	NVIC_Configuration();
	
	// 使能串口接收中断
	USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);	
	
	// 使能串口
	USART_Cmd(DEBUG_USARTx, ENABLE);		

  // 清除发送完成标志
	//USART_ClearFlag(USART1, USART_FLAG_TC);     
}
//其实是USART2_Send_Byte
/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
	/* 发送一个字节数据到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}
/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
  do 
  {
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {}
}

//语音合成
void SYN6288_Speech( USART_TypeDef * pUSARTx,char * str )
{
	
	if(SYN6288_Read_GPIO_IN()==Bit_RESET)/* x us后仍为高电平表示数据“1” */
	{

				char * p = str;
		int len = 0,check=0xFD,i;
		
		while( *p++ != 0 )
		{
				len++;
		
		}
		
		len+=3;
		
		Usart_SendByte(DEBUG_USARTx,0xFD);
		
		Usart_SendByte( DEBUG_USARTx,len / 256 );
		Usart_SendByte( DEBUG_USARTx,len % 256 );
		check  = check ^ ( len / 256 ) ^ ( len % 256 );
		
		Usart_SendByte( DEBUG_USARTx,0x01 );
		Usart_SendByte( DEBUG_USARTx,0x01 );
		check = check ^ 0x01 ^ 0x01;
		
		for( i = 0; i < len-3; i++ )
		{
				Usart_SendByte(DEBUG_USARTx,*str);
				check ^= ( *str );
				str++;
		}
		Usart_SendByte(DEBUG_USARTx,check);   
				
		Delay_ms(150*len);	
	}

}
/* 音量控制 */
void Volinme(uint8_t Y_L)
{
		uint8_t num ;
	num = Y_L+48;
	Usart_SendByte(DEBUG_USARTx,0xFD);
	Usart_SendByte(DEBUG_USARTx,0x00);
	Usart_SendByte(DEBUG_USARTx,0x06);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x5B);
	Usart_SendByte(DEBUG_USARTx,0x76);
	//控制音量
	Usart_SendByte(DEBUG_USARTx,num);
	
	Usart_SendByte(DEBUG_USARTx,0x5D);
//	uint8_t num[9] ;
//	
//	num[0] = 0xFD;
//	num[1] = 0x00;
//	num[2] = 0x06;
//	num[3] = 0x01;
//	num[4] = 0x01;
//	num[5] = 0x5B;
//	num[6] = 0x76;
//	//控制音量
//	num[7] = Y_L+48;
//	num[8] = 0x5D;
//	
//	Usart_SendByte(DEBUG_USARTx,num[8]);
}
/* 语调控制 */
void Intonation(uint8_t Y_L)
{
	uint8_t num ;
	num = Y_L+48;
	Usart_SendByte(DEBUG_USARTx,0xFD);
	Usart_SendByte(DEBUG_USARTx,0x00);
	Usart_SendByte(DEBUG_USARTx,0x06);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x5B);
	Usart_SendByte(DEBUG_USARTx,0x74);
	//控制音量
	Usart_SendByte(DEBUG_USARTx,num);
	
	Usart_SendByte(DEBUG_USARTx,0x5D);
	

}
/* 语速控制 */
void Speed_pacing(uint8_t Y_L)
{
	uint8_t num ;
	num = Y_L+48;
	Usart_SendByte(DEBUG_USARTx,0xFD);
	Usart_SendByte(DEBUG_USARTx,0x00);
	Usart_SendByte(DEBUG_USARTx,0x06);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x5B);
	Usart_SendByte(DEBUG_USARTx,0x73);
	//控制音量
	Usart_SendByte(DEBUG_USARTx,num);
	
	Usart_SendByte(DEBUG_USARTx,0x5D);
	
}
/* 人控制 */
void speed_man(uint8_t Y_L)
{
	uint8_t num ;
	num = Y_L+48;
	Usart_SendByte(DEBUG_USARTx,0xFD);
	Usart_SendByte(DEBUG_USARTx,0x00);
	Usart_SendByte(DEBUG_USARTx,0x07);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x01);
	Usart_SendByte(DEBUG_USARTx,0x5B);
	Usart_SendByte(DEBUG_USARTx,0x6D);
	Usart_SendByte(DEBUG_USARTx,0x35);
	//控制音量
	Usart_SendByte(DEBUG_USARTx,num);
	
	Usart_SendByte(DEBUG_USARTx,0x5D);
	
}
/* End of File ------------------------------------------------------------- */



stm32f10x_it.h

 写完配置函数,当然不能忘记配置中断服务,把这段代码加入该文件的中,那么你的SYN8622还差一步就大功告成了

#include "SYN6288.h"

// 串口中断服务函数
void DEBUG_USART_IRQHandler(void)
{
  uint8_t ucCh;
	if ( USART_GetITStatus ( DEBUG_USARTx, USART_IT_RXNE ) != RESET )
	{
		ucCh  = USART_ReceiveData( DEBUG_USARTx );
		
		if ( strUSART_Fram_Record .InfBit .FramLength < ( RX_BUF_MAX_LEN - 1 ) )                       //预留1个字节写结束符
			   strUSART_Fram_Record .Data_RX_BUF [ strUSART_Fram_Record .InfBit .FramLength ++ ]  = ucCh;

	}
	 	 
	if ( USART_GetITStatus( DEBUG_USARTx, USART_IT_IDLE ) == SET )                                         //数据帧接收完毕
	{
    strUSART_Fram_Record .InfBit .FramFinishFlag = 1;		
		
		ucCh = USART_ReceiveData( DEBUG_USARTx );                                                              //由软件序列清除中断标志位(先读USART_SR,然后读USART_DR)	
  }	
}

 main.c

#include "bsp_usart1.h"  
#include "stm32f10x.h"
#include "bsp_SysTick.h"
#include "SYN6288.h"
void Rap_And_God(void);
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
	
int main ( void )
{
	
	/* 初始化 */
	USARTx_Config (); 
  //USART_Config ();                                                              //初始化串口1
	SysTick_Init ();                                                               //配置 SysTick 为 1ms 中断一次                                                         //初始化WiFi模块使用的接口和外设    
                                                         //初始化RGB彩灯
	//语音播报系统
	SYN6288_GPIO_Config();
	SYN688_USART_Config();

	printf ( "\r\n 语音控制识别系统(Android+WiFi) \r\n" );

	while(1){
			Rap_And_God();
	
	};


	
	
}
/**
  * @brief  封装语音函数
  * @param  无
  * @retval 无
  */
void Rap_And_God(void)
{
    SYN6288_Speech(DEBUG_USARTx,"粉红的长裙");
		
		
    SYN6288_Speech(DEBUG_USARTx,"蓬松的头发");
    SYN6288_Speech(DEBUG_USARTx,"牵着我的手看最新展出的油画");
    SYN6288_Speech(DEBUG_USARTx,"无人的街道");
    SYN6288_Speech(DEBUG_USARTx,"在空荡的家里");
    SYN6288_Speech(DEBUG_USARTx,"就只剩我一个人狂欢的趴体");
    SYN6288_Speech(DEBUG_USARTx,"就当是一场梦");
    SYN6288_Speech(DEBUG_USARTx,"醒了还是很感动");
    SYN6288_Speech(DEBUG_USARTx,"还是很想被你保护我心里的惨痛");
    SYN6288_Speech(DEBUG_USARTx,"喜欢我很辛苦");
    SYN6288_Speech(DEBUG_USARTx,"其实我都清楚");
    SYN6288_Speech(DEBUG_USARTx,"放心这世界很大我记得你的叮嘱");
}

/*********************************************END OF FILE**********************/

标签: 传感器3313a2h

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台