基于STM32F1的语音合成芯片SYN6288驱动

目录

  • 说明
  • SYN6288.h
  • SYN6288.c

说明

基于USART2制作,封装了各种通信协议

SYN6288.h

#ifndef _SYN6288_H_
#define _SYN6288_H_
#include "sys.h"
#include "vTime.h"
/**
  ******************************************************************************
  *  @File     SYN6288.h
  *  @Author   Velscode
  *  @Email    [email protected]
  *  @Brief    TTS 芯片 SYN6288驱动头文件(基于STM32F10x)
  *            使用了USART2(A2\A3)
  ******************************************************************************
  */

  void SYN6288_Init(unsigned int bound);
  void SYN6288_Send_Byte( unsigned char byte );
  void SYN6288_Speech( char * str );
  void SYN6288_Speech_Time( struct vTime nt );
  void SYN6288_Set_Volume( int volume );
  void SYN6288_Play_Sound( int id );
  void SYN6288_Play_Msg( int id );
  void SYN6288_Play_Ring( int id );

#endif /*_SYN6288_H_*/
/* End of File ------------------------------------------------------------- */

SYN6288.c

/**
  ******************************************************************************
  *  @File     SYN6288.c
  *  @Author   Velscode
  *  @Email    [email protected]
  *  @Brief    TTS 芯片 SYN6288驱动源代码文件(基于STM32F10x)
  *            使用了USART2(A2\A3)
  ******************************************************************************
  */

  /* Internal Function Declaration ------------------------------------------- */
  void usart2_Init(unsigned int bound);

  /* Header Files ------------------------------------------------------------ */
  #include "SYN6288.h"
  #include "string.h"
  #include "delay.h"

    void SYN6288_Play_Ring( int id )
    {
        char str[6] = "ringx";

        if( id >= 25 )
            id = 25;
        if( id <= 0 )
            id = 0;

        str[4] = ‘a‘+ id;

        SYN6288_Speech(str);
        delay_ms(16);
    }   

    //播放和弦提示音
    void SYN6288_Play_Msg( int id )
    {
        char str[5] = "msgx";

        if( id >= 8 )
            id = 8;
        if( id <= 0 )
            id = 0;

        str[3] = ‘a‘+ id;

        SYN6288_Speech(str);
        delay_ms(16);
    }

    //播放提示音
    void SYN6288_Play_Sound( int id )
    {
        char str[7] = "soundx";

        if( id >= 25 )
            id = 25;
        if( id <= 0 )
            id = 0;

        str[5] = ‘a‘+ id;

        SYN6288_Speech(str);
    }

    //音量控制,16级可调
    void SYN6288_Set_Volume( int volume )
    {
        char str[6]="[vxx]";

        if( volume >= 16 )
            volume = 16;
        if( volume <= 0 )
            volume = 0;

        str[2] = volume/10 +‘0‘;
        str[3] = volume%10 +‘0‘;

        SYN6288_Speech(str);
        delay_ms(16);
    }
    //播报时间已完成对整点的转换支持
    void SYN6288_Speech_Time( struct vTime nt )
    {
        //                          12  16  20  24  28  32   40
        char str[50] = "现在时间是20xx年xx月xx日xx时xx分xx秒星期x";

        str[12] = (nt.year/10)+‘0‘;
        str[13] = (nt.year%10)+‘0‘;

        str[16] = (nt.month/10)+‘0‘;
        str[17] = (nt.month%10)+‘0‘;

        str[20] = (nt.day/10)+‘0‘;
        str[21] = (nt.day%10)+‘0‘;

        str[24] = (nt.hour/10)+‘0‘;
        str[25] = (nt.hour%10)+‘0‘;

        if( nt.minute == 0 && nt.second == 0 )
        {
            str[28] = 0;
            strcat( str, "整" );
        }
        else
        {
            str[28] = (nt.minute/10)+‘0‘;
            str[29] = (nt.minute%10)+‘0‘;

            str[32] = (nt.second/10)+‘0‘;
            str[33] = (nt.second%10)+‘0‘;

            str[40] = (nt.week)+‘0‘;
        }

        SYN6288_Speech(str);
        delay_ms(16);
    }

    //语音合成
    void SYN6288_Speech( char * str )
    {
        char * p = str;
        int len = 0,check=0xFD,i;

        while( *p++ != 0 )
        {
            len++;
        }

        len+=3;

        SYN6288_Send_Byte(0xFD);

        SYN6288_Send_Byte( len / 256 );
        SYN6288_Send_Byte( len % 256 );
        check  = check ^ ( len / 256 ) ^ ( len % 256 );

        SYN6288_Send_Byte( 0x01 );
        SYN6288_Send_Byte( 0x01 );
        check = check ^ 0x01 ^ 0x01;

        for( i = 0; i < len-3; i++ )
        {
            SYN6288_Send_Byte(*str);
            check ^= ( *str );
            str++;
        }
        SYN6288_Send_Byte(check);
        delay_ms(16);
    }

    //其实是初始化USART2
    void SYN6288_Init(unsigned int bound)
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   // GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口2时钟使能

        USART_DeInit(USART2);  //复位串口2
         //USART2_TX   PA2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
        GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2

        //USART2_RX   PA3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
        GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PA3

        USART_InitStructure.USART_BaudRate = bound;//波特率设置
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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(USART2, &USART_InitStructure); //初始化串口2

        USART_Cmd(USART2, ENABLE);                    //使能串口 

        //使能接收中断
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断   

        //设置中断优先级
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
    }

    //其实是USART2_Send_Byte
    void SYN6288_Send_Byte( unsigned char byte )
    {
        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);
            USART_SendData(USART2,byte);
    }

  /* End of File ------------------------------------------------------------- */

原文地址:https://www.cnblogs.com/velscode/p/10105505.html

时间: 2024-10-07 00:45:10

基于STM32F1的语音合成芯片SYN6288驱动的相关文章

基于STM32F1的局域网通信模块W5500驱动

目录 说明 W5500 W5500.c 使用方法 说明 需要调整的内容为W5500.h中关于IP地址.端口号.子网掩码.网关等参数 W5500 #ifndef _W5500_H_ #define _W5500_H_ /****************** Parameter **********************/ //网关地址 #define GATEWAY_IP_0 125 #define GATEWAY_IP_1 217 #define GATEWAY_IP_2 54 #define

sst15vf016bFlash芯片的驱动基于msp430F149单片机

恶心啦好几个星期啦 ,今天终于实现对flash芯片的驱动啦.心情舒服多拉. 所以在这里想记下点东西,供大家分享,被像我一样恶心这么久...废话少说,进入正题把: 首先介绍一下芯片,这是一款SPI接口的2Mbyte大小的存储芯片. 我的硬件电路连接: #hold  #wp vdd都是高电平, so si clk   用与spi CE片选 #wp接高电平,就可以随意读寄存器啦,BPL位的功能被禁止 #hold接高电平,可以随意传输数据,不会中断. 而且开机默认是全部块都保护的. 这是Flash中寄存

基于MCP2515的Linux CAN总线驱动程序设计

MCP2515简介 MCP2515是一种独立的CAN总线通信控制器,是Microchip公司首批独立CAN解决方案的升级器件,其传输能力较Microchip公司原有CAN控制器(MCP2510)高两倍,最高通信速率可达到1Mbps.MCP2515能够接收和发送标准数据帧和扩展数据帧以及远程帧,通过两个接收屏蔽寄存器和六个接收过滤寄存器滤除无关报文,从而减轻CPU负担. MCP2515主要功能参数及电气特性如下: (1)支持CAN技术规范2.0A/B, 最高传输速率达到1Mbps: (2)支持标准

基于STM32F1 的BASIC解码实验 vb basic 液晶显示执行过程及结果

基于STM32F1 的BASIC解码实验 1.basic程序以文件形式存储 2.程序文件存储在sd卡 3.解释结果显示在液晶屏上 主函数部分 int main(void){ u16 i,j; delay_init(72); //延时初始化 Init_Io(); GLCD_Init(); //初始化液晶 BACK_COLOR=0x001F; LCD_ShowString(30,10,"Mini STM32 SD Card TEST"); LCD_ShowString(30,30,__DA

LCD显示--Ht1621b芯片显示屏驱动

Ht1621b芯片显示屏驱动 关于HT1621b芯片的详细信息可以参考数据手册上的内容:百度文库HT1621b中文资料 以下为芯片驱动程序(STM8单片机): /* Includes ------------------------------------------------------------------*/ #include "stm8s.h" #include "global.h" /* Private typedef ----------------

东芝线阵CCD芯片TCD1305DG驱动时序设计

最近在做微型光谱仪,用到了东芝的CCD芯片TCD1305DG,该芯片是单行3648像素,输出信号是时间上离散的模拟信号,典型输出速率为0.5M,即每2000ns输出一个像素值(模拟信号),芯片内部集成了相关双采样电路,直接输出稳定的像元电压值,而不是传统的三阶梯信号.TCD1305DG需要三路驱动信号,分别是主时钟CLK,移位输出信号SH,积分清除信号ICG,芯片手册上给出的时序波形如下: 图1 TCD1305DG驱动时序 该CCD的基本工作原理如下:光敏元接收外部光信号并将其转换为电荷储存在光

基于Linux的v4l2视频架构驱动编写(转载)

转自:http://www.linuxidc.com/Linux/2011-03/33022.htm 其实,我刚开始一直都不知道怎么写驱动,什么都不懂的,只知道我需要在做项目的过程中学习,所以,我就自己找了一个关于编写Linux下的视频采集监控项 目做,然后上学期刚开学的时候听师兄说,跟院长做项目,没做出来也没关系,所以直接退出博士的团队,投靠了院长的门下,呵呵,说到这里其实并不是我太见风 使驼了,而是····老是让我做单片机的东东,我嫌没意思,他也知道我一开始就要学嵌入式,所以,最后,我想了一

windows10 下使用Pycharm2016 基于Anaconda3 Python3.6 安装Mysql驱动总结

本文记录:在PyCharm2016.3.3 中基于Anaconda3 Python3.6版本安装Python for Mysql驱动.尝试了安装Mysql-Connector成功,但是连接数据库时驱动有bug而失败:尝试安装MySQLdb,因Python版本兼容问题 失败.最终安装PyMysql成功.现将详细安装过程记录如下. 若不想折腾,且系统环境与我的一致,建议直接就安装PyMysql吧. 一,系统环境 windows10 64位,安装了Anaconda3 和PyCharm2016.3.3.

【华为云技术分享】基于小熊派STM32芯片的通过MQTT上报JSON数据到华为物联网平台的自动售货机Demo解析

[摘要] STM32的工程在文章末尾,可自行下载. 一.工程配置 1.MCU类型选择STM32L431RC 2.烧录器选择OpenOCD,参数 -f interface/stlink-v2-1.cfg -f target/stm32l4x.cfg 3.输出目录选择 LiteOS_Lab_STM32\targets\STM32L431_BearPi\GCC\appbuild 4.编译器Makefile选择 targets\STM32L431_BearPi\GCC\Makefile 5.平台参数配置