当前位置:   article > 正文

【STM32F103】SYN6288语音合成模块_syn6288语音模块原理图

syn6288语音模块原理图

SYN6288语音合成模块

刚刚例会被叫起来问这周学习遇到的问题。我把上篇学的LU-ASR01语音模块遇到的问题问了出来,就是我想让语音模块读取单片机发送给它的数据(这个牵扯到软串口、算法之类的)。然后学长给了我一个SYN6288模块(到手的那一刻就有点激动,感觉很好玩的样子,因为它上面还有一个白色的大扬声器)

一、简介

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

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

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

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

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

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

支持外部控制:模块上有12个通用IO引脚,可对模块进行控制及调试。 (原文链接:STM32 使用SYN6288语音模块-CSDN博客

二、引脚

这个模块只需要接4个引脚即可工作:

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

BUSY引脚不接

[STM32F103ZET6]上(我代码用的串口3)

RXD:PB11————接模块TXD

TXD:PB10————接模块RXD

三、原理图

波特率出厂默认9600!!

四、代码

main.c

  1. /*
  2. SYN6288语音合成模块
  3. 项目功能:将文字转化成语音,并朗读出来,出厂默认波特率9600。
  4. VCC--5V
  5. RXD--PB10
  6. TXD--PB11
  7. GND--GND
  8. */
  9. #include "sys.h"
  10. #include "delay.h"
  11. #include "stdio.h"
  12. #include "usart.h"
  13. #include "syn6288.h"
  14. u8 SYN_StopCom[] = {0xFD, 0X00, 0X02, 0X02, 0XFD}; //停止合成
  15. u8 SYN_SuspendCom[] = {0XFD, 0X00, 0X02, 0X03, 0XFC}; //暂停合成
  16. u8 SYN_RecoverCom[] = {0XFD, 0X00, 0X02, 0X04, 0XFB}; //恢复合成
  17. u8 SYN_ChackCom[] = {0XFD, 0X00, 0X02, 0X21, 0XDE}; //状态查询
  18. u8 SYN_PowerDownCom[] = {0XFD, 0X00, 0X02, 0X88, 0X77}; //进入POWER DOWN 状态命令
  19. int main(void)
  20. {
  21. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  22. delay_init();
  23. USART3_Init(9600);
  24. while(1)
  25. {
  26. //选择背景音乐2。(0:无背景音乐 1-15:背景音乐可选)
  27. //m[0~16]:0背景音乐为静音,16背景音乐音量最大
  28. //v[0~16]:0朗读音量为静音,16朗读音量最大
  29. //t[0~5]:0朗读语速最慢,5朗读语速最快
  30. SYN_FrameInfo(0, "[v2][m0][t5]早点去干饭 !");
  31. delay_ms(1500);
  32. delay_ms(1500);
  33. delay_ms(1500);
  34. delay_ms(1500);
  35. delay_ms(1500);
  36. delay_ms(1500);
  37. //暂停合成,此时没有用到,用于展示函数用法
  38. //YS_SYN_Set(SYN_SuspendCom);
  39. }
  40. }
 

syn6288.h

  1. #ifndef __SYN6288_H
  2. #define __SYN6288_H
  3. #include "sys.h"
  4. void SYN_FrameInfo(u8 Music, u8 *HZdata);
  5. void YS_SYN_Set(u8 *Info_data);
  6. #endif

syn6288.c

  1. #include "syn6288.h"
  2. #include "usart.h"
  3. #include "string.h"
  4. #include "delay.h"
  5. //Music:选择背景音乐。0:无背景音乐,1~15:选择背景音乐
  6. void SYN_FrameInfo(u8 Music, u8 *HZdata)
  7. {
  8.  /****************需要发送的文本**********************************/
  9.  unsigned  char  Frame_Info[50];
  10.  unsigned  char  HZ_Length;
  11.  unsigned  char  ecc  = 0; //定义校验字节
  12.  unsigned  int i = 0;
  13.  HZ_Length = strlen((char*)HZdata); //需要发送文本的长度
  14.  /*****************帧固定配置信息**************************************/
  15.  Frame_Info[0] = 0xFD ; //构造帧头FD
  16.  Frame_Info[1] = 0x00 ; //构造数据区长度的高字节
  17.  Frame_Info[2] = HZ_Length + 3; //构造数据区长度的低字节
  18.  Frame_Info[3] = 0x01 ; //构造命令字:合成播放命令
  19.  Frame_Info[4] = 0x01 | Music << 4 ; //构造命令参数:背景音乐设定
  20.  /*******************校验码计算***************************************/
  21.  for(i = 0; i < 5; i++)   //依次发送构造好的5个帧头字节
  22. {
  23.    ecc = ecc ^ (Frame_Info[i]); //对发送的字节进行异或校验
  24. }
  25.  for(i = 0; i < HZ_Length; i++)   //依次发送待合成的文本数据
  26. {
  27.    ecc = ecc ^ (HZdata[i]); //对发送的字节进行异或校验
  28. }
  29.  /*******************发送帧信息***************************************/
  30.  memcpy(&Frame_Info[5], HZdata, HZ_Length);
  31.  Frame_Info[5 + HZ_Length] = ecc;
  32.  USART3_SendString(Frame_Info, 5 + HZ_Length + 1);
  33. }
  34. /************************************本函数用于配置,停止合成、暂停合成等设置 ,默认波特率9600bps。
  35. ****************************/
  36. void YS_SYN_Set(u8 *Info_data)
  37. {
  38.  u8 Com_Len;
  39.  Com_Len = strlen((char*)Info_data);
  40.  USART3_SendString(Info_data, Com_Len);
  41. }

usart.h

  1. #ifndef __USART_H
  2. #define __USART_H
  3. #include "stdio.h"
  4. #include "sys.h"
  5. #define USART3_REC_LEN 200 //定义最大接收字节数 200
  6. #define EN_USART3_RX 1 //使能(1)/禁止(0)串口1接收
  7. extern u8  USART3_RX_BUF[USART3_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.末字节为换行符
  8. extern u16 USART3_RX_STA;         //接收状态标记
  9. //如果想串口中断接收,请不要注释以下宏定义
  10. void USART3_SendString(u8 *DAT,u8 len);
  11. void USART3_SendData(u8 data);
  12. void USART3_Init(u32 bound);
  13. #endif

usart.c

  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "timer.h"
  4. #if 1
  5. #pragma import(__use_no_semihosting)
  6. //标准库需要的支持函数
  7. struct __FILE
  8. {
  9. int handle;
  10. };
  11. FILE __stdout;
  12. //定义_sys_exit()以避免使用半主机模式
  13. void _sys_exit(int x)
  14. {
  15. x = x;
  16. }
  17. //重定义fputc函数
  18. int fputc(int ch, FILE *f)
  19. {
  20. while((USART3->SR & 0X40) == 0); //循环发送,直到发送完毕
  21. USART3->DR = (u8) ch;
  22. return ch;
  23. }
  24. #endif
  25. void USART3_SendData(u8 data)
  26. {
  27. while((USART3->SR & 0X40) == 0);
  28. USART3->DR = data;
  29. }
  30. void USART3_SendString(u8 *DAT, u8 len)
  31. {
  32. u8 i;
  33. for(i = 0; i < len; i++)
  34. {
  35. USART3_SendData(*DAT++);
  36. }
  37. }
  38. #if EN_USART3_RX   //如果使能了接收
  39. //串口1中断服务程序
  40. //注意,读取USARTx->SR能避免莫名其妙的错误
  41. u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  42. //接收状态
  43. //bit15, 接收完成标志
  44. u16 USART3_RX_STA = 0;     //接收状态标记
  45. void USART3_Init(u32 bound)
  46. {
  47. //GPIO端口设置
  48. GPIO_InitTypeDef GPIO_InitStructure;
  49. USART_InitTypeDef USART_InitStructure;
  50. NVIC_InitTypeDef NVIC_InitStructure;
  51. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOC时钟
  52. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  53. //USART3_TX   GPIOC.10
  54. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  55. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  57. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  58. //USART3_RX GPIOC.11初始化
  59. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  60. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  61. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  62. //USART3 NVIC 配置
  63. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  64. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ; //抢占优先级3
  65. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  66. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  67. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  68. //USART 初始化设置
  69. USART_InitStructure.USART_BaudRate = bound;//串口波特率
  70. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  71. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  72. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  73. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  74. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  75. USART_Init(USART3, &USART_InitStructure); //初始化串口1
  76. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  77. USART_Cmd(USART3, ENABLE);                    //使能串口1
  78. TIM3_Int_Init(99, 7199); //10ms中断
  79. USART3_RX_STA = 0; //清零
  80. TIM_Cmd(TIM3, DISABLE); //关闭定时器7
  81. }
  82. void USART3_IRQHandler(void)               //串口1中断服务程序
  83. {
  84. u8 Res;
  85. if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  86. {
  87. Res = USART_ReceiveData(USART3); //读取接收到的数据
  88. if((USART3_RX_STA & 0x8000) == 0) //接收未完成
  89. {
  90. if(USART3_RX_STA < USART3_REC_LEN) //还可以接收数据
  91. {
  92. TIM_SetCounter(TIM3, 0); //计数器清空         //计数器清空
  93. if(USART3_RX_STA == 0) //使能定时器7的中断
  94. {
  95. TIM_Cmd(TIM3, ENABLE); //使能定时器7
  96. }
  97. USART3_RX_BUF[USART3_RX_STA++] = Res; //记录接收到的值
  98. }
  99. else
  100. {
  101. USART3_RX_STA |= 1 << 15; //强制标记接收完成
  102. }
  103. }
  104. }
  105. }
  106. #endif

timer.h

  1. #include "sys.h"
  2. #include "usart.h"
  3. #include "timer.h"
  4. #if 1
  5. #pragma import(__use_no_semihosting)
  6. //标准库需要的支持函数
  7. struct __FILE
  8. {
  9. int handle;
  10. };
  11. FILE __stdout;
  12. //定义_sys_exit()以避免使用半主机模式
  13. void _sys_exit(int x)
  14. {
  15. x = x;
  16. }
  17. //重定义fputc函数
  18. int fputc(int ch, FILE *f)
  19. {
  20. while((USART3->SR & 0X40) == 0); //循环发送,直到发送完毕
  21. USART3->DR = (u8) ch;
  22. return ch;
  23. }
  24. #endif
  25. void USART3_SendData(u8 data)
  26. {
  27. while((USART3->SR & 0X40) == 0);
  28. USART3->DR = data;
  29. }
  30. void USART3_SendString(u8 *DAT, u8 len)
  31. {
  32. u8 i;
  33. for(i = 0; i < len; i++)
  34. {
  35. USART3_SendData(*DAT++);
  36. }
  37. }
  38. #if EN_USART3_RX   //如果使能了接收
  39. //串口1中断服务程序
  40. //注意,读取USARTx->SR能避免莫名其妙的错误
  41. u8 USART3_RX_BUF[USART3_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
  42. //接收状态
  43. //bit15, 接收完成标志
  44. u16 USART3_RX_STA = 0;     //接收状态标记
  45. void USART3_Init(u32 bound)
  46. {
  47. //GPIO端口设置
  48. GPIO_InitTypeDef GPIO_InitStructure;
  49. USART_InitTypeDef USART_InitStructure;
  50. NVIC_InitTypeDef NVIC_InitStructure;
  51. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能USART3,GPIOC时钟
  52. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
  53. //USART3_TX   GPIOC.10
  54. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  55. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  56. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
  57. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  58. //USART3_RX GPIOC.11初始化
  59. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  60. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  61. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
  62. //USART3 NVIC 配置
  63. NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  64. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ; //抢占优先级3
  65. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  66. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  67. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  68. //USART 初始化设置
  69. USART_InitStructure.USART_BaudRate = bound;//串口波特率
  70. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  71. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  72. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  73. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  74. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
  75. USART_Init(USART3, &USART_InitStructure); //初始化串口1
  76. USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
  77. USART_Cmd(USART3, ENABLE);                    //使能串口1
  78. TIM3_Int_Init(99, 7199); //10ms中断
  79. USART3_RX_STA = 0; //清零
  80. TIM_Cmd(TIM3, DISABLE); //关闭定时器7
  81. }
  82. void USART3_IRQHandler(void)               //串口1中断服务程序
  83. {
  84. u8 Res;
  85. if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
  86. {
  87. Res = USART_ReceiveData(USART3); //读取接收到的数据
  88. if((USART3_RX_STA & 0x8000) == 0) //接收未完成
  89. {
  90. if(USART3_RX_STA < USART3_REC_LEN) //还可以接收数据
  91. {
  92. TIM_SetCounter(TIM3, 0); //计数器清空         //计数器清空
  93. if(USART3_RX_STA == 0) //使能定时器7的中断
  94. {
  95. TIM_Cmd(TIM3, ENABLE); //使能定时器7
  96. }
  97. USART3_RX_BUF[USART3_RX_STA++] = Res; //记录接收到的值
  98. }
  99. else
  100. {
  101. USART3_RX_STA |= 1 << 15; //强制标记接收完成
  102. }
  103. }
  104. }
  105. }
  106. #endif

timer.c

  1. #include "timer.h"
  2. #include "usart.h"
  3. //通用定时器7中断初始化
  4. //这里时钟选择为APB1的2倍,而APB1为42M
  5. //arr:自动重装值。
  6. //psc:时钟预分频数
  7. //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
  8. //Ft=定时器工作频率,单位:Mhz
  9. //通用定时器中断初始化
  10. //这里始终选择为APB1的2倍,而APB1为36M
  11. //arr:自动重装值。
  12. //psc:时钟预分频数
  13. void TIM3_Int_Init(u16 arr,u16 psc)
  14. {
  15. NVIC_InitTypeDef NVIC_InitStructure;
  16. TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  17. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3时钟使能    
  18. //定时器TIM3初始化
  19. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  20. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
  21. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
  22. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
  23. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
  24. TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
  25. TIM_Cmd(TIM3,ENABLE);//开启定时器7
  26. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  27. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//抢占优先级0
  28. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
  29. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
  30. NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  31. }
  32. //定时器7中断服务程序    
  33. void TIM3_IRQHandler(void)
  34. {
  35. if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
  36. {  
  37. USART3_RX_STA|=1<<15; //标记接收完成
  38. TIM_ClearITPendingBit(TIM3, TIM_IT_Update );  //清除TIM3更新中断标志    
  39. TIM_Cmd(TIM3, DISABLE);  //关闭TIM3
  40. }    
  41. }
这是一个很有意思的模块,快去学吧,你会爱上它的!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/664376
推荐阅读
相关标签
  

闽ICP备14008679号