STM32F103C8T6驱动SYN6288语音模块(暂时做到能播放连续语音,其他诸如背景音乐的功能还没做)
使用USART3(PB10,PB11)引脚连接模块的对应引脚,模块还有一个BY忙碌检测引脚,低电平表示语音模块空闲,高电平表示语音模块忙碌,这里连的是PA7。VCC接3~5V。
**USART3部分程序**
#include "usart3.h"/*****************************************USART3***************************************/
/*PB10 USART3_TX */
/*PB11 USART3_RX */
/* */
/**************************************************************************************/
void Usart3Init(u32 pclk1, u32 bound)
{RCC->APB2ENR |= 0x01 << 3;//使能PB时钟RCC->APB1ENR |= 0x01 << 18;//使能USART3时钟RCC->APB2ENR |= 0x01 << 0;//AFIO时钟GPIOB->CRH &= ~(0x0F << 4 * 2);GPIOB->CRH |= 0x0A << 4 * 2;//PB10(TX)复用功能推挽输出GPIOB->CRH &= ~(0x0F << 4 * 3);GPIOB->CRH |= 0x08 << 4 * 3;//PB11(RX)输入模式AFIO->MAPR &= ~AFIO_MAPR_USART3_REMAP;//USART3没有重印象USART3->CR1 &= ~(0x01 << 12);//一个起始位,八个数据位USART3->CR1 &= ~(0x01 << 10);//禁止校验控制USART3->CR2 &= ~(0x03 << 12);//一个停止位float temp;u16 mantissa;u16 fraction;temp = (float)(pclk1 * 1000000) / (bound * 16);//得到USARTDIVmantissa = temp;//得到整数部分fraction = (temp - mantissa) * 16;//得到小数部分mantissa <<= 4;mantissa += fraction;USART3->BRR = mantissa;//波特率设置USART3->CR1 &= ~(0x01 << 12);//一个起始位,八个数据位USART3->CR1 &= ~(0x01 << 9);//禁止校验// USART3->CR1 |= 0x01 << 7;//发送缓冲区空中断使能
// USART3->CR1 |= 0x01 << 6;//使能发送完成中断
// USART3->CR1 |= 0x01 << 5;//接收缓冲区非空中断使能USART3->CR1 |= 0x01 << 3;//发送使能USART3->CR1 |= 0x01 << 2;//接收使能u32 priority = 0;NVIC_SetPriorityGrouping(7 - 2);priority = NVIC_EncodePriority(7 - 2, 2, 1);NVIC_SetPriority(USART3_IRQn, priority);NVIC_EnableIRQ(USART3_IRQn);USART3->CR1 |= 0x01 << 13;//使能usart3
}//串口3发送一个字节函数
void USART3SendByte(u8 byte)
{//等待发送数据寄存器空 while((USART3->SR & 0x01 << 7) == 0);USART3->DR = byte;
}
SYN6288模块程序
#include "syn6288.h"//SYN6288语音模块
//芯片忙检测引脚初始化 PA7
//读低电平表示芯片空闲
//读高电平表示芯片忙
void SYN6288PortInit(void)
{RCC->APB2ENR |= 0x01 << 2;//使能PA时钟GPIOA->CRL &= ~((unsigned int)0x0f << 7 * 4);GPIOA->CRL |= (unsigned int)0x08 << 7 * 4;//输入模式
// GPIOA->BSRR |= 0x01 << 7;//默认上拉
}//语音合成
//芯片支持以下命令帧格式:“帧头FD+数据区长度+数据区”格式。(最大206个字节)
//上位机发送给SYN6288芯片的所有命令和数据都需要用"帧"的方式进行封装后传输
void SYN6288SpeechSynthesis(char *str)
{char *p = NULL;p = str;int len = 0, i;char checksum;//异或校验while(*p++ != 0)//计算待发送文本长度{len++;} len += 3;//计算数据区长度//等待CHIP空闲,低电平表示空闲while(SynBusy_Sta);delay_ms(2);/*测试得出这里要加至少2ms的延时,不然如果连续发送语音会发生某些语音丢失的情况,只延时1ms也会丢失,直接加载后面的8ms上也会发生丢失的情况*/USART3SendByte(FRAME_HEAD);//发送帧头USART3SendByte(len >> 8);//发送数据区长度高八位USART3SendByte(len);//发送数据区长度低八位checksum = FRAME_HEAD ^ (len >> 8) ^ (len);//校验和USART3SendByte(SPEECH_SYSTHESIS_CMD);//发送语音合成播放命令字USART3SendByte(GBK_WITHOUT_BGM);//发送命令参数->不加背景音乐,文本GBK编码格式checksum = checksum ^ SPEECH_SYSTHESIS_CMD ^ SPEECH_SYSTHESIS_CMD;//发送文本内容for(i = 0; i < len - 3; i++){USART3SendByte(*str);checksum ^= *str;str++;}USART3SendByte(checksum);//发送异或检验delay_ms(8);//数据手册要求帧与帧之间的发送间隔必须超过8ms
}
SYN6288.h
#ifndef __SYN6288_H__
#define __SYN6288_H__#include <stm32f10x.h>
#include "sys.h"
#include "usart3.h"
#include "systick.h"
#include "string.h"#define SynBusy_Sta PAin(7)//syn6288状态忙检测引脚,低电平表示CHIP空闲,高电平表示忙#define SYN_USART_BAUD 9600
#define FRAME_HEAD 0xFD//帧头
#define SPEECH_SYSTHESIS_CMD 0x01
#define GB2132_WITHOUT_BGM 0x00
#define GBK_WITHOUT_BGM 0x01void SYN6288PortInit(void);
void SYN6288SpeechSynthesis(char *str);#endif
MAIN.c
#define USART3_BAUD SYN_USART_BAUD//封装语音函数
void Rap_And_God(void)
{SYN6288SpeechSynthesis("淡黄的长裙");SYN6288SpeechSynthesis("蓬松的头发");SYN6288SpeechSynthesis("牵着我的手看最新展出的油画");SYN6288SpeechSynthesis("无人的街道");SYN6288SpeechSynthesis("在空荡的家里");SYN6288SpeechSynthesis("就只剩我一个人狂欢的趴体");SYN6288SpeechSynthesis("就当是一场梦");SYN6288SpeechSynthesis("醒了还是很感动");SYN6288SpeechSynthesis("还是很想被你保护我心里的惨痛");SYN6288SpeechSynthesis("喜欢我很辛苦");SYN6288SpeechSynthesis("其实我都清楚");SYN6288SpeechSynthesis("放心这世界很大我记得你的叮嘱");
}int main(void)
{SYN6288PortInit();Usart3Init(36, USART3_BAUD);Rap_And_God();while(1){};
}
STM32F103C8T6驱动SYN6288语音模块(暂时做到能播放连续语音,其他诸如背景音乐的功能还没做)相关推荐
- STM32 使用SYN6288语音模块
文章目录 前言 一.SYN6288介绍 二.SYN6288原理讲解 三.数据的异或校验 四.代码编写 1.串口的初始化 2.SYN6288代码编写 3.main函数逻辑 总结 前言 本篇文章带大家学习 ...
- 基于stm32物联网开发板(3)--SYN6288语音模块
基于stm32物联网开发板(3)–SYN6288语音模块 1.SYN6288语音模块展示示例 SYN6288语音模块 2.概述 SYN6288-A语音合成模块是一款性价比更高,效果更自然的一款中高 ...
- 从头开始写STM32F103C8T6驱动库(一)——STM32CubeMX创建并调整工程结构
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- 从头开始写STM32F103C8T6驱动库(二)——编写系统初始化程序,配置时钟树
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口
STM32F103C8T6驱动舵机SG90 配置定时器TIM2,TIM3,TIM4的多种重映射模式下的不同IO口 1.使用到的工具介绍 2.整个简单介绍 3.程序的介绍 1.使用到的工具介绍: kei ...
- 从头开始写STM32F103C8T6驱动库(四)——编写延时函数,详解Systick
系列文章目录 Github开源地址 从头开始写STM32F103C8T6驱动库(一)--STM32CubeMX创建并调整工程结构 从头开始写STM32F103C8T6驱动库(二)--编写系统初始化程序 ...
- Android BroadcastReceiver中播放提示语音有时失效问题
Android BroadcastReceiver 千万不要做耗时的操作,如果有耗时的操作,请让OnReceive 中调用service. @Override public void onReceiv ...
- 干了5Android开发还没掌握-binder-机制、驱动核心源码?我劝你早点改行吧
bwr.read_consumed = 0; if (copy_to_user(ubuf, &bwr, sizeof(bwr))) ret = -EFAULT; goto out; } } i ...
- Qt5.4.1播放视频语音文件
首先.pro文件添加 multimedia和multimediawidgets QT += multimedia multimediawidgets .cpp或者.h文件导入qmediaplayer. ...
最新文章
- 三:CAP与Base理论
- 深度学习(九)caffe预测、特征可视化python接口调用
- 微服务组件记事本:Skywalking执行效果 · 多图篇
- 2017蓝桥杯省赛---java---C---2(兴趣小组)
- python对象的复制问题
- 微信开发---微信网页授权、JS-SDK和微信公众号的基本设置
- dev控件ASPxComboBox设置ReadOnly=true后
- 电脑外接显示器或ipad分屏
- 2020年58同城产品笔试题
- mysql脏写_图解脏写、脏读、不可重复读、幻读
- FileZilla Server源码分析--大漠落日5节
- 简单的学生成绩录入查询系统
- STM32CubeMx使用教程(一)——安装CubeMx
- 【2D多目标跟踪】Quasi-Dense Similarity Learning for Multiple Object Tracking阅读笔记
- 推荐:12条经过验证的创业赚钱秘诀!(转)
- 计算机通信与网络(一)
- gitee 链接报错
- java object比较排序
- 金山词霸字典转换工具
- 数字图像处理(Digital Image Processing)