OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14128|回复: 8

基于stm32的syn6288语音模块驱动程序

[复制链接]

5

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2015-8-3
在线时间
7 小时
发表于 2015-8-3 11:06:27 | 显示全部楼层 |阅读模式
5金钱
自己写了几个但是没有驱动成功,希望能找到一份可以用的例程。谢谢各位了 

最佳答案

查看完整内容[请看2#楼]

TTS.c /* 引脚链接用的串口3 VCC--+5V GND--GND BUSY--PD2 RXD--PB10 TXD--PB11 喇叭按电路图正负接 */ #include "sys.h" #include "usart.h" #include "delay.h" #include "tts.h" //发声程序 #define LEN_OFFSET 2 //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度) //数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数) unsigned char head[] = {0xfd,0x00,0x0 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
126
金钱
126
注册时间
2014-3-20
在线时间
16 小时
发表于 2015-8-3 11:06:28 | 显示全部楼层
TTS.c

/*         引脚链接用的串口3
VCC--+5V
GND--GND
BUSY--PD2
RXD--PB10
TXD--PB11
喇叭按电路图正负接

*/
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "tts.h"
//发声程序
#define LEN_OFFSET    2  //长度字节的偏移量(本例中长度不超过255字节,因此只使用1字节长度)

//数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
unsigned char head[] = {0xfd,0x00,0x00,0x01,0x00};
    /****/         
u8 text1[]={"[v16]欢迎使用水肥一体化智能控制系统"};
u8 text2[]={"当前空气温度为   度"};
u8 text3[]={"湿度为百分之   "};
u8 text4[]={"土壤湿度为百分之  "};
u8 text5[]={"光照强度为      "};
u8 text6[]={"已浇水量      升"}; //已浇水量  12.5  升
u8 text7[]={"在浇水在施肥"};
u8 text8[]={"在浇水没有施肥"};
u8 text9[]={"没有浇水没有施肥"};
u8 text10[]={"您设定的土壤相对湿度下限值为  "};
u8 text11[]={"您设定的土壤相对湿度上限值为  "};
u8 text12[]={"播报完毕,谢谢"};
void TTS_Init(void)
{
          
GPIO_InitTypeDef  GPIO_InitStructure;
       
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);         //使能PD端口时钟
       
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2;                                 //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
GPIO_Init(GPIOD, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOD.6               
               
}
void Speech(unsigned char *buf, unsigned char len)
{
        unsigned char i = 0;          //循环计数变量
        unsigned char xor = 0x00;     //校验码初始化
                       
        head[LEN_OFFSET] = len + 3;  //计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)

        //发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
        for(i = 0; i < 5; i++)
        {
                xor ^= head[i];
                UART3_SendByte(head[i]);
                delay_ms(2);
           }

        //发送文字内容
        for(i = 0; i < len; i++)
        {
                xor ^= buf[i];
                UART3_SendByte(buf[i]);
                delay_ms(2);
        }

UART3_SendByte(xor);        //发送校验位
}

TTS.h
#ifndef __tts_H
#define __tts_H       
extern u8 text1[];
extern u8 text2[];
extern u8 text3[];
extern u8 text4[];
extern u8 text5[];
extern u8 text6[];
extern u8 text7[];
extern u8 text8[];
extern u8 text9[];
extern u8 text10[];
extern u8 text11[];
extern u8 text12[];
#define  TTS_Busy        PDin(2)
void TTS_Init(void);
void Speech(unsigned char *buf, unsigned char len);// 语音播报程序

#endif


usart.c
#include "sys.h"
#include "usart.h"

#include "delay.h"

#include <string.h>       


#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数                 
struct __FILE
{
        int handle;

};

FILE __stdout;      
//定义_sys_exit()以避免使用半主机模式   
_sys_exit(int x)
{
        x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
        while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
        return ch;
}
#endif

/*使用microLib的方法*/
/*
int fputc(int ch, FILE *f)
{
        USART_SendData(USART1, (uint8_t) ch);

        while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}       

    return ch;
}
int GetKey (void)  {

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/

//串口1发送单个字节
void UART1_SendByte(u16 Data)
{
   EXTI->IMR = 0x00000000;
   while (!(USART1->SR & USART_FLAG_TXE));
   USART1->DR = (Data & (uint16_t)0x01FF);         
   EXTI->IMR = 0xfffff;
}
//串口2发送单个字节
void UART2_SendByte(u16 Data)
{
   EXTI->IMR = 0x00000000;
   while (!(USART2->SR & USART_FLAG_TXE));
   USART2->DR = (Data & (uint16_t)0x01FF);         
   EXTI->IMR = 0xfffff;   
}
//串口3发送单个字节
void UART3_SendByte(u16 Data)
{
   EXTI->IMR = 0x00000000;
   while (!(USART3->SR & USART_FLAG_TXE));
   USART3->DR = (Data & (uint16_t)0x01FF);         
   EXTI->IMR = 0xfffff;   
}
//串口1发送字符串
void UART1Write(char* data)
{
        u16 i,len;
        len=strlen((char*)data);
//        DIR485_H ;
        for (i=0; i<len; i++){
                UART1_SendByte(data[i]);
        }               
}

//串口2发送字符串
void UART2Write(char* data)
{
        u16 i,len;
        len=strlen((char*)data);

        for (i=0; i<len; i++){
                UART2_SendByte(data[i]);
        }       
}
//串口3发送字符串
void UART3Write(char* data)
{
        u16 i,len;
        len=strlen((char*)data);

        for (i=0; i<len; i++){
                UART3_SendByte(data[i]);
        }       
}               
//串口1发送HEX
void UART1Write_Hex(char* data, int len)
{
        u16 i,len1;
        len1=len;

        for (i=0; i<len1; i++){
                UART1_SendByte(data[i]);
        }       
}
//串口2发送HEX
void UART2Write_Hex(char* data, int len)
{
        u16 i,len1;
        len1=len;

        for (i=0; i<len1; i++){
                UART2_SendByte(data[i]);
        }       
}

void uart_init(u32 bound)
{
    //GPIO端口设置
  //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
//        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
        USART_DeInit(USART1);  //复位串口1
        USART_DeInit(USART2);  //复位串口2
        USART_DeInit(USART3);  //复位串口2
         //USART1_TX   PA.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART1_RX          PA.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

      //USART2_TX   PA.2
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    //USART2_RX          PA.3
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);  

    //USART3_TX   PB.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10

    //USART3_RX          PB.11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PB11

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1

    //Usart2 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //

        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
   //Usart3 NVIC 配置
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器  
   //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        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(USART1, &USART_InitStructure);
           USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断1         
    USART_Cmd(USART1, ENABLE);                    //使能串口

        USART_Init(USART2, &USART_InitStructure);
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断2   
    USART_Cmd(USART2, ENABLE);                    //使能串口

        USART_Init(USART3, &USART_InitStructure); //初始化串口3
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断3
    USART_Cmd(USART3, ENABLE);                    //使能串口3
}

unsigned int tmpdata;
void USART3_IRQHandler(void)                        //串口3中断服务程序
{
        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断
                {
                USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                tmpdata=USART_ReceiveData(USART3);//(USART3->DR);        //读取接收到的数据
                }
}

usart.h
#ifndef __USART_H
#define __USART_H
#include "stdio.h"

void uart_init(u32 bound);
void UART1_SendByte(u16 Data);
void UART2_SendByte(u16 Data);
void UART3_SendByte(u16 Data);
void UART1Write(char* data);
void UART1Write_Hex(char* data, int len);
void UART2Write(char* data);
void UART2Write_Hex(char* data, int len);
void UART3Write(char* data);


#endif



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-3 23:02:12 | 显示全部楼层
帮顶。。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2016-8-9
在线时间
7 小时
发表于 2016-10-17 10:32:15 | 显示全部楼层
cxy 发表于 2015-8-3 11:06
TTS.c

/*         引脚链接用的串口3

这个程序可行吗?
回复

使用道具 举报

37

主题

148

帖子

0

精华

高级会员

Rank: 4

积分
969
金钱
969
注册时间
2017-1-4
在线时间
431 小时
发表于 2018-1-25 13:41:39 | 显示全部楼层
cxy 发表于 2015-8-3 11:06
TTS.c

/*         引脚链接用的串口3

你的数字变量怎么读出来的?
回复

使用道具 举报

5

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
259
金钱
259
注册时间
2013-4-4
在线时间
46 小时
发表于 2018-1-25 15:45:43 | 显示全部楼层
还是觉得软件有意思些,在转型中。。。。
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6567
金钱
6567
注册时间
2018-6-27
在线时间
552 小时
发表于 2019-1-28 16:36:22 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-7-18
在线时间
1 小时
发表于 2019-8-4 18:37:18 | 显示全部楼层
想问main函数怎么写
回复

使用道具 举报

0

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2020-5-16
在线时间
11 小时
发表于 2021-3-21 11:02:00 | 显示全部楼层
可以实现吧?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-29 02:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表