国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

 找回密碼
 注冊
搜索

基于STM32的LD3320語音識別程序源碼

[復制鏈接]
樓主
coolice 發表于 2021-8-14 01:17:22 | 只看該作者 |只看大圖 |倒序瀏覽 |閱讀模式
1、STM32的用戶 可以直接 在工程里面 添加如下4個文件1》LD3320_main.c  2》LDChip.c  3》Reg_RW.c 4》delay.c
2、51單片機的用戶同時可以根據以上操作來做相關的修改。
基于STM32的LD3320語音識別程序源碼 162311mvvsfppvtowops3w.png
所有語音識別程序源代碼下載: 基于STM32 的 LD3320基本驅動程序.zip (59.24 KB, 售價: 2 E幣)
部分源碼:
  1. ************************************************************************************/
  2. //        nAsrStatus 用來在main主程序中表示程序運行的狀態,不是LD3320芯片內部的狀態寄存器
  3. //        LD_ASR_NONE:                表示沒有在作ASR識別
  4. //        LD_ASR_RUNING:                表示LD3320正在作ASR識別中
  5. //        LD_ASR_FOUNDOK:                表示一次識別流程結束后,有一個識別結果
  6. //        LD_ASR_FOUNDZERO:        表示一次識別流程結束后,沒有識別結果
  7. //        LD_ASR_ERROR:                表示一次識別流程中LD3320芯片內部出現不正確的狀態
  8. /***********************************************************************************/
  9. uint8 nAsrStatus=0;       

  10. #define DEMO_SOUND_SIZE 1235

  11. void LD3320_Init(void);

  12. uint8 RunASR(void);
  13. void ProcessInt0(void);
  14. void LD3320_EXTI_Cfg(void);
  15. void LD3320_NVIC_Cfg(void);

  16. u8 ld3320_exti=0;         //中斷標志信號,為1是代表中斷產生。以下采用查詢方式。
  17. /************************************************************************************/
  18. //        這個示范程序是基于STC10L08XE編譯的完整地,可以執行的程序
  19. //        實現了從數組中播放的功能
  20. //  
  21. //  verygood_withHead.mp3(verygood_withoutHead)是一段MP3格式的聲音文件,播放內容為英文單詞"very good"
  22. //        demosound.h 中定義了數組 bpDemoSound[],
  23. //  數組的內容就是 verygood_withHead.mp3(verygood_withoutHead)文件的內容
  24. //  用戶可以用16進制閱讀器(比如 UltraEdit )打開verygood_withHead.mp3文件和 bpDemoSound 數組相對照
  25. //
  26. //        關于兩個MP3文件的差異:  
  27. //        這兩個MP3文件只差有沒有ID3文件頭,MP3的數據都是一樣的,
  28. //        ID3文件頭傳入LD芯片與否不影響播放
  29. //  用Windows自帶的MediaPlayer播放沒有ID3頭的vertygood_withoutHead.mp3 后,會自動加上ID3文件頭
  30. //  PlayDemoSound_Once/PlayDemoSound_Continue 函數就是把 bpDemoSound數組中的數據依次傳入LD3320芯片進行播放
  31. //
  32. //  與LD3320芯片有關的函數功能,都在"開發手冊.pdf"中有詳細說明
  33. //        請開發者對照"開發手冊.pdf“閱讀
  34. //       
  35. //        開發者在學習LD3320開始時,可以直接把在這個main函數拷貝到自己單片機中編譯運行
  36. //       
  37. //        當然,用戶要根據自己實際的單片機去修改 mcu_init ,以及對應的管腳連接的定義,中斷定義
  38. /************************************************************************************/

  39. void  LD3320_main(void)
  40. {

  41.         nAsrStatus = LD_ASR_NONE;                //        初始狀態:沒有在作ASR
  42.         while(1)
  43.         {
  44.         switch(nAsrStatus)
  45.                 {
  46.                         case LD_ASR_RUNING:
  47.                         case LD_ASR_ERROR:               
  48.                                                                                                 break;
  49.                         case LD_ASR_NONE:

  50.                                                                                         nAsrStatus=LD_ASR_RUNING;
  51.                                                                                         if (RunASR()==0)        //        啟動一次ASR識別流程:ASR初始化,ASR添加關鍵詞語,啟動ASR運算
  52.                                                                                         {               
  53.                                                                                                 nAsrStatus = LD_ASR_ERROR;
  54.                                                                                         }
  55.                                                                                         break;

  56.                         case LD_ASR_FOUNDOK:

  57.                                                                                         LD_GetResult();        //        一次ASR識別流程結束,去取ASR識別結果                               
  58.                                                                                         nAsrStatus = LD_ASR_NONE;
  59.                                                                                         break;
  60.                        
  61.                         case LD_ASR_FOUNDZERO:
  62.                         default:
  63.                                                                 nAsrStatus = LD_ASR_NONE;
  64.                                                                 break;
  65.                         }
  66.        
  67.           if(ld3320_exti !=0) {        /*采用查詢方式進入中斷處理*/

  68.                  ld3320_exti =0;
  69.                  ProcessInt0();               
  70.                 }

  71.                   OSTimeDlyHMSM(0,0,0,50);
  72.        
  73.        
  74.         }// while

  75. }
  76. /************************************************************************
  77. 功能描述:
  78. 調用函數:
  79. 入口參數:
  80. 返回函數:
  81. **************************************************************************/
  82. void LD3320_Init(void)
  83. {
  84.         LD3320_GPIO_config();       
  85.         LD3320_EXTI_Cfg();
  86.   LD3320_NVIC_Cfg();
  87.         LD_reset();
  88. }
  89. /************************************************************************
  90. 功能描述:
  91. 調用函數:
  92. 入口參數:
  93. 返回函數:
  94. **************************************************************************/
  95. void  LD3320_delay(unsigned long uldata)
  96. {
  97.         unsigned int j  =  0;
  98.         unsigned int g  =  0;
  99.         for (j=0;j<5;j++)
  100.         {
  101.                 for (g=0;g<uldata;g++)
  102.                 {
  103.                         delay_us(120);
  104.                 }
  105.         }
  106. }

  107. /*********************************************************************
  108. //為了消除編譯時的 警告 *** WARNING L15: MULTIPLE CALL TO SEGMENT
  109. //把在中斷函數中需要調用的函數重新復制并命名
  110. //消除警告 Warning L15,并且避免由于函數重入可能帶來的隱藏Bug
  111. *********************************************************************/
  112. void  LD3320_delay_2(unsigned long uldata)
  113. {
  114.         unsigned int j  =  0;
  115.         unsigned int g  =  0;
  116.         for (j=0;j<5;j++)
  117.         {
  118.                 for (g=0;g<uldata;g++)
  119.                 {
  120.                         delay_us(120);
  121.                 }
  122.         }
  123. }


  124. /************************************************************************************/
  125. //        RunASR()函數實現了一次完整的ASR語音識別流程
  126. //        LD_AsrStart() 函數實現了ASR初始化
  127. //        LD_AsrAddFixed() 函數實現了添加關鍵詞語到LD3320芯片中
  128. //        LD_AsrRun()        函數啟動了一次ASR語音識別流程
  129. //
  130. //        任何一次ASR識別流程,都需要按照這個順序,從初始化開始進行
  131. /************************************************************************************/

  132. uint8 RunASR(void)
  133. {
  134.         uint8 i=0;
  135.         uint8 asrflag=0;
  136.         for (i=0; i<5; i++)                        //        防止由于硬件原因導致LD3320芯片工作不正常,所以一共嘗試5次啟動ASR識別流程
  137.         {
  138.                 LD_AsrStart();                        //初始化ASR
  139.                 LD3320_delay(100);
  140.                 if (LD_AsrAddFixed()==0)        //添加關鍵詞語到LD3320芯片中
  141.                 {
  142.                         LD_reset();                        //        LD3320芯片內部出現不正常,立即重啟LD3320芯片
  143.                         LD3320_delay(50);                        //        并從初始化開始重新ASR識別流程
  144.                         continue;
  145.                 }

  146.                 LD3320_delay(10);

  147.                 if (LD_AsrRun() == 0)
  148.                 {
  149.                         LD_reset();                        //        LD3320芯片內部出現不正常,立即重啟LD3320芯片
  150.                         LD3320_delay(50);                        //        并從初始化開始重新ASR識別流程
  151.                         continue;
  152.                 }

  153.                 asrflag=1;
  154.                 break;                                        //        ASR流程啟動成功,退出當前for循環。開始等待LD3320送出的中斷信號
  155.         }

  156.         return asrflag;
  157. }

  158. /************************************************************************
  159. 功能描述:                 STM32 嵌套中斷配置
  160. 調用函數:
  161. 入口參數:
  162. 返回函數:
  163. **************************************************************************/
  164. void LD3320_NVIC_Cfg(void)
  165. {
  166.   NVIC_InitTypeDef NVIC_InitStructure;
  167.    
  168.   NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
  169.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  170.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  171.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  172.   NVIC_Init(&NVIC_InitStructure);

  173. }
  174. /************************************************************************
  175. 功能描述:         STM32 外部中斷和 IO口配置,利用外部中斷線1
  176. 調用函數:
  177. 入口參數:
  178. 返回函數:
  179. **************************************************************************/
  180. void LD3320_EXTI_Cfg(void)
  181. {
  182.   EXTI_InitTypeDef EXTI_InitStructure;
  183.   GPIO_InitTypeDef GPIO_InitStructure;

  184.   /* Enable GPIOC clock */
  185.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
  186.   GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
  187.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  188.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  189.   GPIO_Init(GPIOD, &GPIO_InitStructure);

  190.   GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1);
  191.   EXTI_InitStructure.EXTI_Line = EXTI_Line1;
  192.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  193.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  194.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  195.   EXTI_Init(&EXTI_InitStructure);
  196.   EXTI_GenerateSWInterrupt(EXTI_Line1);
  197.        
  198.         GPIO_SetBits(GPIOD,GPIO_Pin_1);

  199. }


  200. /*******************************************************************************
  201. * Function Name  : EXTI1_IRQHandler
  202. * Description    : This function handles External interrupt Line 1 request.
  203. * Input          : None
  204. * Output         : None
  205. * Return         : None
  206. *******************************************************************************/
  207. void EXTI1_IRQHandler(void)
  208. {
  209.         if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
  210.         {

  211.                        
  212.                         ld3320_exti=1;//進入中斷標志 LD3320
  213.                                                  
  214.                                 EXTI_ClearFlag(EXTI_Line1);
  215.                                 EXTI_ClearITPendingBit(EXTI_Line1);

  216.                 }
  217. }
復制代碼

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

手機版|小黑屋|ELEOK |網站地圖

GMT+8, 2026-5-26 04:04

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回復 返回頂部 返回列表