• 正文
    • 一模塊來源
    • 二規(guī)格參數(shù)
    • 三移植過程
    • 四移植驗(yàn)證
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

語音合成播報(bào)模塊:CW32F030C8T6開發(fā)板實(shí)現(xiàn)播報(bào)語音

03/01 10:54
1342
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

SYN6288E 中文語音合成芯片是北京宇音天下科技有限公司在 2010 年初推出的一款性/價(jià)比更高的 SYN6288 芯片的基礎(chǔ)上更改封裝方式的,效果更自然的一款中高端語音合成芯片。SYN6288E 通過異步串 口(UART)通訊方式,接收待合成的文本數(shù)據(jù),實(shí)現(xiàn)文本到語音(或 TTS 語音)的轉(zhuǎn)換。

模塊來源

模塊實(shí)物展示:

資料鏈接:https://pan.baidu.com/s/1FjoAuJm387bxaZxS6g9HEg

資料提取碼:8888

規(guī)格參數(shù)

輸入電壓:2.4V~5.1V

額定電流:2.0uA~280mA

控制方式:串口

以上信息見廠家資料文件

移植過程

我們的目標(biāo)是將例程移植至CW32F030C8T6開發(fā)板上【能夠播報(bào)語音的功能】。首先要獲取資料,查看數(shù)據(jù)手冊應(yīng)如何實(shí)現(xiàn)讀取數(shù)據(jù),再移植至我們的工程。

3.1查看資料

語音播報(bào)控制,只要配置出串口,再根據(jù)數(shù)據(jù)手冊要求的命令幀格式發(fā)送數(shù)據(jù),就能實(shí)現(xiàn)播報(bào)功能。

注意!該模塊只能實(shí)現(xiàn)語音播報(bào),沒有語音識別功能!也無法錄音。

3.2引腳選擇

想要使用uart串口,需要確定使用的引腳是否有串口外設(shè)功能,可以通過用戶手冊進(jìn)行查看。在用戶手冊的第146頁。

這里選擇使用PA2和PA3的附加串口2功能。

有串口功能的引腳

模塊接線圖

3.3移植至工程

移植步驟中的導(dǎo)入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_syn6288.c與bsp_syn6288.h。這里不再過多講述,移植完成后面修改相關(guān)代碼。

在文件bsp_syn6288.c中,編寫如下代碼。

/* * Change Logs: * Date           Author       Notes * 2024-06-25     LCKFB-LP    first version */#include "bsp_syn6288.h"#include "stdio.h"#include "stdlib.h"#include "string.h"
#define SYN6288RX_LEN_MAX 255
unsigned char SYN6288RX_BUFF[SYN6288RX_LEN_MAX];unsigned char SYN6288RX_LEN = 0;

/****************************************************************** * 函 數(shù) 名 稱:SYN6288_GPIO_Init * 函 數(shù) 說 明:SYN6288引腳初始化 * 函 數(shù) 形 參:band_rate GPS通信波特率 * 函 數(shù) 返 回:無 * 作       者:LC * 備       注:默認(rèn)波特率為9600******************************************************************/void SYN6288_GPIO_Init(uint32_t band_rate){    GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結(jié)構(gòu)體
    BSP_SYN6288_GPIO_RCC_ENABLE();        // 使能GPIO時(shí)鐘    BSP_SYN6288_UART_RCC_ENABLE();        // 使能UART時(shí)鐘
    GPIO_InitStruct.Pins = BSP_SYN6288_TX_PIN;           // GPIO引腳    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;          // 推挽輸出    GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;             // 輸出速度高    GPIO_Init(BSP_SYN6288_GPIO_PORT, &GPIO_InitStruct);  // 初始化
    GPIO_InitStruct.Pins = BSP_SYN6288_RX_PIN;           // GPIO引腳    GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP;       // 上拉輸入    GPIO_Init(BSP_SYN6288_GPIO_PORT, &GPIO_InitStruct);  // 初始化
    BSP_SYN6288_AF_UART_TX(); // UART_TX復(fù)用    BSP_SYN6288_AF_UART_RX(); // UART_RX復(fù)用
    // 配置UART    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate = band_rate;                     // 波特率    USART_InitStructure.USART_Over = USART_Over_16;                     // 配置USART的過采樣率。    USART_InitStructure.USART_Source = USART_Source_PCLK;               // 設(shè)置時(shí)鐘源    USART_InitStructure.USART_UclkFreq = 64000000;                      //設(shè)置USART時(shí)鐘頻率(和主頻一致即可)    USART_InitStructure.USART_StartBit = USART_StartBit_FE;             //RXD下降沿開始    USART_InitStructure.USART_StopBits = USART_StopBits_1;              // 停止位1    USART_InitStructure.USART_Parity = USART_Parity_No ;                // 不使用校驗(yàn)    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;     // 收發(fā)模式    USART_Init(BSP_SYN6288, &USART_InitStructure);               // 初始化串口2
    // 優(yōu)先級,無優(yōu)先級分組    NVIC_SetPriority(BSP_SYN6288_IRQ, 0);
    // UARTx中斷使能    NVIC_EnableIRQ(BSP_SYN6288_IRQ);
    // 使能UARTx RC中斷    USART_ITConfig(BSP_SYN6288, USART_IT_RC, ENABLE);}
/****************************************************************** * 函 數(shù) 名 稱:SYN6288_Send_Bit * 函 數(shù) 說 明:向SYN6288發(fā)送單個(gè)字符 * 函 數(shù) 形 參:ch發(fā)送的字符 * 函 數(shù) 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void SYN6288_Send_Bit(unsigned char ch){    USART_SendData(BSP_SYN6288, (uint8_t)ch);
    while( RESET == USART_GetFlagStatus(BSP_SYN6288, USART_FLAG_TXE) ){} // 等待發(fā)送數(shù)據(jù)緩沖區(qū)標(biāo)志置位}
/****************************************************************** * 函 數(shù) 名 稱:SYN6288_send_String * 函 數(shù) 說 明:SYN6288發(fā)送字符串 * 函 數(shù) 形 參:str要發(fā)送的字符串 * 函 數(shù) 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void SYN6288_send_String(unsigned char *str){        while( str && *str ) // 地址為空或者值為空跳出        {                SYN6288_Send_Bit(*str++);        }}//獲取串口接收的數(shù)據(jù)unsigned char *Get_SYN6288RX_BUFF(void){        return SYN6288RX_BUFF;}
//清除串口接收的數(shù)據(jù)void Clear_SYN6288RX_BUFF(void){        unsigned char i = SYN6288RX_LEN_MAX-1;        while(i)        {                SYN6288RX_BUFF[i--] = '';        }        SYN6288RX_LEN = 0;}
/************************************************************ * 函數(shù)名稱:SYN6288_Send_Cmd * 函數(shù)說明:向SYN6288發(fā)送命令 * 型    參: * 【CmdType=命令字】           可使用參數(shù)有: *                                              0x01        語音合成命令 *                                              0x31        設(shè)置波特率(默認(rèn)9600) *                                              0x02        停止合成命令 *                                              0x03        暫停合成命令 *                                              0x04        恢復(fù)合成命令 *                                              0x21        芯片狀態(tài)查詢命令 *                                              0x88        芯片進(jìn)入低功耗模式 * 【CmdPar=命令參數(shù)】          可使用參數(shù)有: *                                              字節(jié)高5位的十進(jìn)制為0時(shí),表示不加背景音樂 *                                              字節(jié)高5位的十進(jìn)制為1~15時(shí),表示所選背景音樂的編號 *                                              字節(jié)低3位的十進(jìn)制為0~3,并且命令字為語音合成命令時(shí),分別代表設(shè)置文本為GB2312格式、GBK格式、BIG5格式、UNICODE格式; *                                              字節(jié)低3位的十進(jìn)制為0~2,并且命令字為設(shè)置波特率時(shí),分別代表設(shè)置波特率為9600、19200、38400; * 【text=播報(bào)的文本】
 * 返 回 值:0=發(fā)送成功 * 備    注:
 * 接收到控制命令幀,芯片會向上位機(jī)發(fā)送1個(gè)字節(jié)的狀態(tài)回傳,上位機(jī)可根據(jù)這個(gè)回傳來判斷芯片目前的工作狀態(tài) * 初始化成功回傳            0X4A * 收到正確的命令幀回傳      0x41 * 收到不能識別命令幀回傳    0x45 * 芯片播音狀態(tài)回傳          0x4E * 芯片空閑狀態(tài)回傳          0x4F*************************************************************/unsigned char SYN6288_Send_Cmd(uint8_t CmdType, uint8_t CmdPar, uint8_t *text){        unsigned char frame_header = 0XFD;       //幀頭        unsigned int Text_Len = strlen((const char*)text);//待發(fā)送文本的長度        unsigned int Data_Len = Text_Len + 3;              //數(shù)據(jù)區(qū)長度;3=幀頭、幀尾和異或校驗(yàn)        unsigned char Xor_Check = 0;                       //異或校驗(yàn)存儲        unsigned char Send_Buff[210];                     //待發(fā)送的命令幀,命令幀最大206個(gè)字節(jié)        uint8_t i = 0;
        Send_Buff[0] = frame_header;   //幀頭        Send_Buff[1] = Data_Len>>8;      //高位在前        Send_Buff[2] = Data_Len&0x00ff; //低位在前        Send_Buff[3] = CmdType;         //命令字        Send_Buff[4] = CmdPar;          //命令數(shù)據(jù)        sprintf((char*)Send_Buff+5, "%s", text );
        //發(fā)送數(shù)據(jù)        for( i = 0; i < Text_Len+5; i++ )        {                Xor_Check = Xor_Check ^ Send_Buff[i];//對每一個(gè)數(shù)據(jù)進(jìn)行異或校驗(yàn)保存                SYN6288_Send_Bit( Send_Buff[i] );//發(fā)送數(shù)據(jù)        }        SYN6288_Send_Bit( Xor_Check );//發(fā)送最后一位:異或校驗(yàn)數(shù)據(jù)
        return 0;}

/****************************************************************** * 函 數(shù) 名 稱:BSP_SYN6288_IRQHandler * 函 數(shù) 說 明:串口中斷服務(wù)函數(shù) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作       者:LC * 備       注:無******************************************************************/void BSP_SYN6288_IRQHandler(void){        if(USART_GetITStatus(BSP_SYN6288,USART_IT_RC) != RESET) // 接收緩沖區(qū)不為空        {                SYN6288RX_BUFF[ SYN6288RX_LEN ] = USART_ReceiveData(BSP_SYN6288);                SYN6288RX_LEN = ( SYN6288RX_LEN + 1 ) % SYN6288RX_LEN_MAX;
                SYN6288RX_BUFF[SYN6288RX_LEN] = '';
                USART_ClearITPendingBit(BSP_SYN6288, USART_IT_RC); // 清除中斷標(biāo)志位        }}

在文件bsp_syn6288.h中,編寫如下代碼。

/* * Change Logs: * Date           Author       Notes * 2024-06-25     LCKFB-LP    first version */#ifndef _BSP_SYN6288_H#define _BSP_SYN6288_H
#include "board.h"
#define BSP_SYN6288_GPIO_RCC_ENABLE()    __RCC_GPIOA_CLK_ENABLE()   // GPIO端口時(shí)鐘#define BSP_SYN6288_UART_RCC_ENABLE()    __RCC_UART2_CLK_ENABLE()   // 串口2的時(shí)鐘

#define BSP_SYN6288_AF_UART_TX()         PA02_AFx_UART2TXD()#define BSP_SYN6288_AF_UART_RX()         PA03_AFx_UART2RXD()
#define BSP_SYN6288_GPIO_PORT            CW_GPIOA               // GPIO的端口
#define BSP_SYN6288_TX_PIN               GPIO_PIN_2             // 串口TX的引腳#define BSP_SYN6288_RX_PIN               GPIO_PIN_3             // 串口RX的引腳
#define BSP_SYN6288                      CW_UART2               // 串口2#define BSP_SYN6288_IRQ                  UART2_IRQn             // 串口2中斷#define BSP_SYN6288_IRQHandler           UART2_IRQHandler       // 串口2中斷服務(wù)函數(shù)


void SYN6288_GPIO_Init(uint32_t band_rate);unsigned char SYN6288_Send_Cmd(uint8_t CmdType, uint8_t CmdPar, uint8_t *text);#endif

移植驗(yàn)證

在自己工程中的main主函數(shù)中,編寫如下。

/* * Change Logs: * Date           Author       Notes * 2024-06-25     LCKFB-LP    first version */#include "board.h"#include "stdio.h"#include "bsp_uart.h"#include "bsp_syn6288.h"
int32_t main(void){    board_init();
    uart1_init(9600);
    SYN6288_GPIO_Init(9600);    printf("startrn");    delay_ms(1000);
    SYN6288_Send_Cmd(0x01,0x00,(uint8_t *)"立創(chuàng)開發(fā)板");
    while(1)    {
    }}

移植現(xiàn)象:模塊播報(bào)"立創(chuàng)開發(fā)板"。

模塊移植成功案例代碼:

鏈接:https://pan.baidu.com/s/1eaj1otbe_v5xWZtn7We84w?pwd=LCKF

提取碼:LCKF

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

以開放、共享、互助為理念,致力于構(gòu)建武漢芯源半導(dǎo)體CW32系列MCU生態(tài)社區(qū)。無論是嵌入式MCU小自還是想要攻破技術(shù)難題的工程師,亦或是需求解決方案的產(chǎn)品經(jīng)理都可在CW32生態(tài)社區(qū)汲取營養(yǎng)、共同成長。

B站