发 帖  
原厂入驻New
【大联大品佳 Nuvoton ISD9160语音识别试用体验】Nuvoton ISD9160语音识别之项目应用
2020-8-29 15:54:03  50
分享
上次给大家分享了一些资料,这次继续给大家补全一些资料。
b71ba2210066b51ac18da683aad7222.png
74c4f3edc2735f309ea831149c0c3a4.png
由于文件太大,传起来很是麻烦,所以,大家自己下载下吧,里面PCB,,原理图,Demo都很详细,也很周全。
链接:https://pan.baidu.com/s/1k5nFwFDRUKTFaabAE1qpCw
提取码:xtt7
下面就进入我们的正题吧,
之前一直想做智能家居这块,现在有了这个小板子,可以很大程度上,帮助我们解放双手,来实现很多语音指令及控制的交互,我这边先测试,调试通demo,然后烧录到我们的ISD9160板子上,后面的话,还计划串一块显示屏在这边,可以用语音控制,也可以用触摸控制,给家里老人,小朋友一个更好的体验。

919e3304b73cf110dbbaa2438ddb897.jpg

8c5c2a68d56480d6b70f8c17116cff9.jpg
bb6caeb0174b0aa6d1da845d7a9bc7d.jpg
这个喇叭,是之前废旧的笔记本电脑上拆解下来的,大家莫觉得怪。测试嘛,成功最重要。demo测试完成后,我这边又链接到了我的单片机
9750337a57b4dc63cc2370db7204a58.jpg
f0c477e688068772d1ebd70cc71ea00.jpg
那么也就是在语音识别成功后,我这边会叫他开启或者关闭继电器,用于电器控制,
到此,还没有完全结束。
5abe7a3a566b7ab44fed49ca1eecdd2.png
我这边写了一份协议,用于和带屏主板那边的交互,控制,至此,我这边还在调试成功,下期报告的时候,我会给大家带来一些成果。
GPIO部分,
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2011 nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. /*                                                                                                         */
  7. /*  Note:                                                                                                  */
  8. /*     IF you meet Nu-Link (ICE) connection problem after program this code.                               */
  9. /*   It may be caused by ISD9160 is still in power down mode. Just need to remove all power of PCBA        */
  10. /*   including the ICE. After power removal, keep hoding the wakeup button two seconds to consume the      */
  11. /*   remain power in ISD9160. After that you can try to connect with ICE again.                            */
  12. /*----------------------------------------------------------------------------------------------------------*/
  13. /*        GPA0-GPA7 belong to LDO power plane, if LDO is off, and external pwoer is used for LDO power plane                */
  14. /*        Need to handle the circuit for external device on correct state after power down.                                                */
  15. /*        Like pull-high on  CS, CLK, DI pins of SPI-flash.                                                                                                                */
  16. /*        All GPA0~GPA7 are in tri-state (high impedance) no matter LDO is on or off                                                                */
  17. /*----------------------------------------------------------------------------------------------------------*/

  18. #include <stdio.h>
  19. #include "Driver\DrvUART.h"
  20. #include "Driver\DrvGPIO.h"
  21. #include "Driver\DrvRTC.h"
  22. #include "Driver\DrvOSC.h"
  23. #include "Driver\DrvPMU.h"
  24. //#include "Driver\DrvPWM.h"
  25. #include "Driver\DrvI2S.h"
  26. #include "ISD9xx.h"

  27. /*---------------------------------------------------------------------------------------------------------*/
  28. /* Global variables                                                                                        */
  29. /*---------------------------------------------------------------------------------------------------------*/

  30. /*---------------------------------------------------------------------------------------------------------*/
  31. /* Define functions prototype                                                                              */
  32. /*---------------------------------------------------------------------------------------------------------*/


  33. void SysTimerDelay(uint32_t us)
  34. {
  35.     SysTick->LOAD = us * 22; /* Assume the internal 22MHz RC used */
  36.     SysTick->VAL   =  (0x00);
  37.     SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE);

  38.     /* Waiting for down-count to zero */
  39.     while((SysTick->CTRL & (1 << 16)) == 0);
  40. }

  41. void Smpl_DrvPMU_SYSCLKinit(void)
  42. {
  43.         UNLOCKREG();
  44.         SYSCLK->CLKSEL0.HCLK_S = 0; /* Select HCLK source as OSC48 */
  45.         SYSCLK->CLKDIV.HCLK_N  = 9;        /* Select no division          */
  46.         SYSCLK->CLKSEL0.OSCFSel = 1;        /* 1= 32MHz, 0=48MHz */
  47.     SYSCLK->PWRCON.XTL32K_EN = 1;
  48.     SYSCLK->PWRCON.OSC10K_EN = 1;
  49.     /* Enable RTC clock */
  50.         //SYSCLK->APBCLK.RTC_EN =1;
  51.         //SYSCLK->APBCLK.I2S_EN   = 1;
  52.         //SYSCLK->APBCLK.ANA_EN   = 1;
  53.         LOCKREG();
  54. }


  55. void Smpl_DrvPMU_UARTinit(void)
  56. {
  57.     STR_UART_T sParam;
  58.         /* Set UART Pin */
  59.         DrvGPIO_InitFunction(FUNC_UART0);

  60.         /* UART Setting */
  61.     sParam.u32BaudRate                 = 115200;
  62.     sParam.u8cDataBits                 = DRVUART_DATABITS_8;
  63.     sParam.u8cStopBits                 = DRVUART_STOPBITS_1;
  64.     sParam.u8cParity                 = DRVUART_PARITY_NONE;
  65.     sParam.u8cRxtriggerLevel= DRVUART_FIFO_1BYTES;

  66.     DrvUART_Open(UART_PORT0,&sParam);
  67. }



  68. void PrintPwrCon(void)
  69. {
  70.     printf("ICER register %08X\n",         NVIC->ICER[0]);
  71.     printf("PFLAG register %02X\n", M32(&SYSCLK->PFLAGCON));
  72.         M32(&SYSCLK->PFLAGCON) = 0xff;
  73.         printf("RSTSRC register %02X\n", M32(&SYS->RSTSRC));
  74.         M32(&SYS->RSTSRC) = 0xff;
  75.         printf("PWRCON register %08X\n", M32(&SYSCLK->PWRCON));
  76.         printf("XTLEN=%d, OSC49=%d OSC10=%d STOP=%d SBPD=%d DPD=%d\n",
  77.            SYSCLK->PWRCON.XTL32K_EN,
  78.            SYSCLK->PWRCON.OSC49M_EN,
  79.            SYSCLK->PWRCON.OSC10K_EN,
  80.            SYSCLK->PWRCON.STOP,
  81.            SYSCLK->PWRCON.STANDBY_PD,
  82.            SYSCLK->PWRCON.DEEP_PD);
  83.         printf("PIN_ENB=%d, DPD_10K=%d TIMER=%d PIN_WAKE=%d TIMER_WAKE=%d POI_WAKE=%d TIMER=%d\n",
  84.            SYSCLK->PWRCON.PIN_ENB,
  85.            SYSCLK->PWRCON.OSC10K_ENB,
  86.            SYSCLK->PWRCON.TIMER_SEL,
  87.            SYSCLK->PWRCON.PIN_WAKE,
  88.            SYSCLK->PWRCON.TIMER_WAKE,
  89.            SYSCLK->PWRCON.POI_WAKE,
  90.            SYSCLK->PWRCON.TIMER_SEL_RD);

  91. }


  92. void Smpl_DrvPMU_SPDGPABCallback(uint32_t u32GpaStatus, uint32_t u32GpbStatus)
  93. {
  94.     //DrvGPIO_DisableInt(GPA, 1);
  95.     //printf("GPIO Wake up from Standby-Power-Down Mode\n");

  96. }

  97. void InitGPIOWakeupInSPD(void)
  98. {
  99.     // Clear interrupts.
  100.        
  101.         GPIOB->ISRC = GPIOB->ISRC;
  102.         ////INT from GPA pin1 as an example wake up
  103.   
  104.         DrvGPIO_Open(GPB, 6, IO_INPUT);
  105.     DrvGPIO_SetIntCallback(Smpl_DrvPMU_SPDGPABCallback);
  106.     DrvGPIO_SetDebounceTime(3, DBCLKSRC_HCLK);
  107.     DrvGPIO_EnabLEDebounce(GPB, 6);
  108.     //DrvGPIO_EnableInt(GPB, 6, IO_BOTH_EDGE, MODE_EDGE);
  109.         DrvGPIO_EnableInt(GPB, 6, IO_FALLING, MODE_EDGE);
  110. }


  111. void LdoOn(void)
  112. {
  113.         SYSCLK->APBCLK.ANA_EN=1;
  114.         ANA->LDOPD.PD=0;
  115.         ANA->LDOSET=3;

  116.         SysTimerDelay(6000);
  117. }  


  118. /*-----------------------------------------------------------------------------------*/
  119. /* Using UART for testing PMU Samples                                                        */
  120. /* Test Item                                                                                             */
  121. /* It sends the messages to HyperTerminal.                                                                                         */
  122. /*-----------------------------------------------------------------------------------*/

  123. int32_t main(void)
  124. {
  125.         uint32_t u32Temp, u32Counter;
  126.         uint8_t u8Item;
  127.         //S_DRVRTC_TIME_DATA_T sInitcTime;

  128.     // Initial SYSCLK
  129.         Smpl_DrvPMU_SYSCLKinit();


  130.          LdoOn();                //May have leakage if no power on GPA0~A7, marked this line if power provided from outside
  131.     //Initial UART
  132.         //Smpl_DrvPMU_UARTinit();

  133.         //printf("\n SPD WakeUp Test.\n");


  134.     // Set GPA1 to input
  135.         DrvGPIO_Open(GPB, 6, IO_INPUT);
  136.         GPIOB->ISRC = GPIOB->ISRC;

  137.    
  138.         UNLOCKREG();
  139.         SYSCLK->APBCLK.SBRAM_EN = 1;                 //Enable standby RAM
  140.         u32Counter= SBRAM->D[0];

  141.         if(SYSCLK-> PFLAGCON.PD_FLAG == 0)                                 //If power on, not wakeup from SPD
  142.         {
  143.                 DrvGPIO_Open(GPB,2, IO_OUTPUT);                                 //Use GPIOB2 to know the problem point
  144.                 DrvGPIO_ClrBit(GPB,2);
  145.                 DrvGPIO_Open(GPB,3, IO_OUTPUT);                                 //Use GPIOB3 to know the problem point
  146.                 DrvGPIO_ClrBit(GPB,3);
  147.                 DrvGPIO_Open(GPB,4, IO_OUTPUT);                                 //Use GPIOB4 to know the problem point
  148.                 DrvGPIO_SetBit(GPB,4);


  149.                 //SYSCLK->APBCLK.RTC_EN = 1;                         //Enable RTC clock
  150.                 SYSCLK->APBCLK.SBRAM_EN = 1;                 //Enable standby RAM

  151.                 u32Counter=0;
  152.                 SBRAM->D[0]=0;
  153.                 //printf("First Power on \n ===================== \n");
  154.                 //printf("=================== \n");
  155.         }
  156.         else
  157.         {
  158.                 DrvGPIO_ClrBit(GPB,4);
  159.                 u32Counter++;
  160.                 SBRAM->D[0]=u32Counter;
  161.                 if((u32Counter&1)==1)  
  162.             {
  163.               DrvGPIO_SetBit(GPB,2);
  164.                   //printf("u32Counter= %4d, GPB2 high\n",u32Counter);
  165.             }
  166.                 else
  167.                 {
  168.               DrvGPIO_ClrBit(GPB,2);
  169.                   //printf("u32Counter= %4d, GPB2 low\n",u32Counter);
  170.             }
  171.          }

  172.           //PrintPwrCon();

  173.          SYSCLK-> PFLAGCON.PD_FLAG = 1;                //Clear the Standby PD flag

  174.                 InitGPIOWakeupInSPD();
  175.                     DrvPMU_StandbyPowerDown();
  176.                                 DrvGPIO_SetBit(GPB,3);                           //Not really enter SPD if this instruction executed, remove Nu-Link dongle(ICE)
  177.                                 while(1);

  178. }


复制代码
MIC部分。
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2009 NUVoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/
  6. #include <stdio.h>
  7. #include "ISD9xx.h"
  8. #include "Driver\DrvUART.h"
  9. #include "Driver\DrvGPIO.h"
  10. #include "Driver\DrvSYS.h"
  11. #include "NVTTypes.h"


  12. /*---------------------------------------------------------------------------------------------------------*/
  13. /* Define Function Prototypes                                                                              */
  14. /*---------------------------------------------------------------------------------------------------------*/
  15. void InitialUART(void);
  16. void RecordStart(void);
  17. void PlayStart(void);

  18. void S7Init(void);
  19. void S7EncDec(void);


  20. /*---------------------------------------------------------------------------------------------------------*/
  21. /* Define global variables                                                                                 */
  22. /*---------------------------------------------------------------------------------------------------------*/

  23. extern volatile uint32_t CallBackCounter;        //in RecordPCM.c
  24. extern BOOL        bMicBufferReady;                                //in RecordPCM.c



  25. //====================
  26. // Functions & main

  27. void UartInit(void)
  28. {
  29.         /* Reset IP */
  30.         SYS->IPRSTC2.UART0_RST = 1;
  31.         SYS->IPRSTC2.UART0_RST = 0;
  32.         /* Enable UART clock */
  33.     SYSCLK->APBCLK.UART0_EN = 1;
  34.     /* Data format */
  35.     UART0->LCR.WLS = 3;
  36.     /* Configure the baud rate */
  37.     M32(&UART0->BAUD) = 0x3F0001A8; /* Internal 48MHz, 115200 bps */

  38.     /* Multi-Function Pin: Enable UART0:Tx Rx */
  39.         SYS->GPA_ALT.GPA8 = 1;
  40.         SYS->GPA_ALT.GPA9 = 1;
  41. }

  42. /*---------------------------------------------------------------------------------------------------------*/
  43. /* SysTimerDelay                                                                                           */
  44. /*---------------------------------------------------------------------------------------------------------*/
  45. void SysTimerDelay(uint32_t us)
  46. {
  47.     SysTick->LOAD = us * 49; /* Assume the internal 49MHz RC used */
  48.     SysTick->VAL  =  (0x00);
  49.     SysTick->CTRL = (1 << SYSTICK_CLKSOURCE) | (1<<SYSTICK_ENABLE);

  50.     /* Waiting for down-count to zero */
  51.     while((SysTick->CTRL & (1 << 16)) == 0);
  52. }


  53. /*---------------------------------------------------------------------------------------------------------*/
  54. /*  Main Function                                                                                                                                              */
  55. /*---------------------------------------------------------------------------------------------------------*/
  56. int32_t main (void)
  57. {
  58.    
  59.         UNLOCKREG();
  60.         SYSCLK->PWRCON.OSC49M_EN = 1;
  61.         SYSCLK->CLKSEL0.HCLK_S = 0; /* Select HCLK source as 48MHz */
  62.         SYSCLK->CLKDIV.HCLK_N  = 0;        /* Select no division          */
  63.         SYSCLK->CLKSEL0.OSCFSel = 0;        /* 1= 32MHz, 0=48MHz */

  64.         DrvADC_AnaOpen();

  65.         //DrvGPIO_Open(GPA,15, IO_OUTPUT);
  66.         //DrvGPIO_SetBit(GPA,15);                 

  67.         /* Set UART Configuration */
  68.     UartInit();
  69.         S7Init();

  70.         //printf("\n=== 16K sampling PCM Recording to DataFlash  ===\n");
  71.         RecordStart();
  72.         while(CallBackCounter == 0)        ;

  73.         PlayBufferSet();
  74.         S7EncDec();

  75.         while(CallBackCounter == 1)        ;
  76.                
  77.         //printf("\n=== Play PCM from DataFlash ===\n");
  78.         PlayStart();

  79.         while(1)
  80.         {
  81.                 if (bMicBufferReady==TRUE)
  82.                 {
  83.                         //DrvGPIO_ClrBit(GPA,15);                 //For measurement
  84.                         S7EncDec();
  85.                         //DrvGPIO_SetBit(GPA,15);
  86.                 }
  87.         }

  88.         /* Lock protected registers */
  89.        
  90. }



复制代码
很多例程,都在资料里面写的很详细,这里就不一一给大家赘述了,
不过,再次感谢大大通的支持,
0
2020-8-29 15:54:03   评论 分享淘帖

只有小组成员才能发言,加入小组>>

71个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /8 下一条

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