找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3340|回复: 0
打印 上一主题 下一主题
收起左侧

LD3320语音识别控制LED STM32源代码

[复制链接]
跳转到指定楼层
楼主
ld3320 语音控制LED
1、如果您采用的不是keil4 编译器 可以自行建立工程进行编译,本工程建立的格式如下图,客户可以参考下图添加所需要的C文件。


单片机源程序如下:
  1. /*****************************************************
  2. **  工程名称:YIXIN 语音识别开发板程序
  3. **        CPU: STM32f103VET6
  4. **        晶振:8MHZ
  5. **        波特率:9600 bit/S
  6. **  说明:本程序 具备语音识别、串口通信、开发板基本功能演示。
  7. *********************************************************/
  8. #include "includes.h"

  9. /* Private function prototypes -----------------------------------------------*/
  10. void RCC_Configuration(void);
  11. //void NVIC_Configuration(void);
  12. void  USART_Configuration(void);
  13. void PrintCom(USART_TypeDef* USARTx, uint8_t *Data);

  14. extern void  LD3320_main(void);
  15. /***********************************************************
  16. * 名    称: 主函数
  17. * 功    能:        程序入口
  18. * 入口参数:  无
  19. * 出口参数:        无
  20. * 说    明:        无
  21. * 调用方法:         无
  22. **********************************************************/
  23. int main(void)
  24. {
  25.   /* System Clocks Configuration */
  26.   RCC_Configuration();  //外设时钟配置
  27.   USART_Configuration();//USART 配置       
  28.         LD3320_main();                                //LD3320执行函数
  29.         while (1)
  30.     {       
  31.                   ;
  32.         }
  33.        
  34. }
  35. /***********************************************************
  36. * 名    称: void  USART_Configuration(void)
  37. * 功    能: 串口配置
  38. * 入口参数:  
  39. * 出口参数:
  40. * 说    明:
  41. * 调用方法:
  42. **********************************************************/
  43. void  USART_Configuration(void)
  44. {
  45.         USART_InitTypeDef USART_InitStructure;
  46.         GPIO_InitTypeDef GPIO_InitStructure;

  47.   USART_InitStructure.USART_BaudRate = 9600;
  48.   USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  49.   USART_InitStructure.USART_StopBits = USART_StopBits_1;
  50.   USART_InitStructure.USART_Parity = USART_Parity_No;
  51.   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  52.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;

  53.   /* Configure USART1 */
  54.   USART_Init(USART1, &USART_InitStructure);        //类似与GPIO口,配置完后初始化一次
  55.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);  //使能接收 中断
  56.   USART_ITConfig(USART1, USART_IT_TXE, ENABLE);  //使能发送 中断
  57.   USART_Cmd(USART1, ENABLE);
  58.        
  59.        
  60.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                 //USART1 TX
  61.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  62.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
  63.   GPIO_Init(GPIOA, &GPIO_InitStructure);                    //A端口

  64.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                 //USART1 RX
  65.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //复用开漏输入
  66.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.   GPIO_Init(GPIOA, &GPIO_InitStructure);                         //A端口
  68. }
  69. /***********************************************************
  70. * 名    称:void PrintCom(USART_TypeDef* USARTx, uint8_t *Data)
  71. * 功    能:串口数据打印
  72. * 入口参数:  
  73. * 出口参数:
  74. * 说    明:
  75. * 调用方法:
  76. **********************************************************/
  77. void PrintCom(USART_TypeDef* USARTx, uint8_t *Data)
  78. {
  79.        
  80.                 while(*Data)
  81.                 {
  82.                         USART_SendData(USARTx, *Data++);    /*发送单个数据 */
  83.                         while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);/* 检查指定的USART标志位即RESET=1时发送完成*/
  84.                 }                                                                                                       
  85. }

  86. /***********************************************************
  87. * 名    称:void RCC_Configuration(void)
  88. * 功    能:配置外设时钟
  89. * 入口参数:  
  90. * 出口参数:
  91. * 说    明:
  92. * 调用方法:
  93. **********************************************************/
  94. void RCC_Configuration(void)
  95. {
  96.   SystemInit();  
  97.   /* Enable USART1, GPIOA, GPIOx and AFIO clocks */
  98.     RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 |RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |
  99.                          RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD |
  100.                          RCC_APB2Periph_GPIOE, ENABLE); //开启相关的AHP外设时钟
  101.   /* Enable USART2 clock */
  102.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
  103. }

  104. /**
  105.   * @brief  Configures the different GPIO ports.
  106.   * @param  None
  107.   * @retval : None
  108.   */
复制代码
  1. /*******************************************************
  2. **  文件名称:语音模块底层驱动
  3. **        CPU: STM32f103RBT6
  4. **        晶振:8MHZ
  5. **        波特率:9600 bit/S
  6. **  说明:本程序 具备语音识别、串口通信、开发板基本功能演示。
  7. *********************************************************/
  8. #include "includes.h"

  9. uint8 nLD_Mode = LD_MODE_IDLE;                //        用来记录当前是在进行ASR识别还是在播放MP3

  10. uint8 ucRegVal;
  11. extern uint8  nAsrStatus;


  12. /***********************************************************
  13. * 名    称:void LD_reset(void)
  14. * 功    能:LD芯片硬件初始化
  15. * 入口参数:  
  16. * 出口参数:
  17. * 说    明:
  18. * 调用方法:
  19. **********************************************************/
  20. void LD_reset(void)
  21. {
  22.         LD_RST_H();
  23.         LD3320_delay(100);
  24.         LD_RST_L();
  25.         LD3320_delay(100);
  26.         LD_RST_H();
  27.         LD3320_delay(100);
  28.         LD_CS_L();
  29.         LD3320_delay(100);
  30.         LD_CS_H();               
  31.         LD3320_delay(100);
  32. }

  33. /***********************************************************
  34. * 名    称: void LD_Init_Common(void)
  35. * 功    能: 初始化命令
  36. * 入口参数:  
  37. * 出口参数:
  38. * 说    明:
  39. * 调用方法:
  40. **********************************************************/
  41. void LD_Init_Common(void)
  42. {

  43.         LD_ReadReg(0x06);  
  44.         LD_WriteReg(0x17, 0x35);
  45.         LD3320_delay(5);
  46.         LD_ReadReg(0x06);  

  47.         LD_WriteReg(0x89, 0x03);  
  48.         LD3320_delay(5);
  49.         LD_WriteReg(0xCF, 0x43);   
  50.         LD3320_delay(5);
  51.         LD_WriteReg(0xCB, 0x02);
  52.        
  53.         /*PLL setting*/
  54.         LD_WriteReg(0x11, LD_PLL_11);      
  55.         if (nLD_Mode == LD_MODE_MP3)
  56.         {
  57.                 LD_WriteReg(0x1E, 0x00);
  58.                 LD_WriteReg(0x19, LD_PLL_MP3_19);   
  59.                 LD_WriteReg(0x1B, LD_PLL_MP3_1B);   
  60.                 LD_WriteReg(0x1D, LD_PLL_MP3_1D);
  61.         }
  62.         else
  63.         {
  64.                 LD_WriteReg(0x1E,0x00);
  65.                 LD_WriteReg(0x19, LD_PLL_ASR_19);
  66.                 LD_WriteReg(0x1B, LD_PLL_ASR_1B);               
  67.             LD_WriteReg(0x1D, LD_PLL_ASR_1D);
  68.         }
  69.         LD3320_delay(5);
  70.        
  71.         LD_WriteReg(0xCD, 0x04);
  72.         LD_WriteReg(0x17, 0x4c);
  73.         LD3320_delay(1);
  74.         LD_WriteReg(0xB9, 0x00);
  75.         LD_WriteReg(0xCF, 0x4F);
  76.         LD_WriteReg(0x6F, 0xFF);
  77. }

  78. /***********************************************************
  79. * 名    称:void LD_Init_ASR(void)
  80. * 功    能:初始化ASR
  81. * 入口参数:  
  82. * 出口参数:
  83. * 说    明:
  84. * 调用方法:
  85. **********************************************************/        
  86. void LD_Init_ASR(void)
  87. {
  88.         nLD_Mode=LD_MODE_ASR_RUN;
  89.         LD_Init_Common();

  90.         LD_WriteReg(0xBD, 0x00);
  91.         LD_WriteReg(0x17, 0x48);       
  92.         LD3320_delay( 5 );
  93.         LD_WriteReg(0x3C, 0x80);   
  94.         LD_WriteReg(0x3E, 0x07);
  95.         LD_WriteReg(0x38, 0xff);   
  96.         LD_WriteReg(0x3A, 0x07);
  97.         LD_WriteReg(0x40, 0);         
  98.         LD_WriteReg(0x42, 8);
  99.         LD_WriteReg(0x44, 0);   
  100.         LD_WriteReg(0x46, 8);
  101.         LD3320_delay( 1 );
  102. }

  103. /***********************************************************
  104. * 名    称:void ProcessInt0(void)
  105. * 功    能:识别处理函数
  106. * 入口参数:  
  107. * 出口参数:
  108. * 说    明:可以利用查询方式,或中断方式进行调用
  109. * 调用方法:
  110. **********************************************************/
  111. void ProcessInt0(void)
  112. {
  113.         uint8 nAsrResCount=0;

  114.         ucRegVal = LD_ReadReg(0x2B);

  115.                 // 语音识别产生的中断
  116.                         // (有声音输入,不论识别成功或失败都有中断)
  117.                         LD_WriteReg(0x29,0) ;
  118.                         LD_WriteReg(0x02,0) ;
  119.        
  120.                         if((ucRegVal & 0x10) && LD_ReadReg(0xb2)==0x21 && LD_ReadReg(0xbf)==0x35)               
  121.                                 {         
  122.                                                 nAsrResCount = LD_ReadReg(0xba);
  123.                        
  124.                                                 if(nAsrResCount>0 && nAsrResCount<=4)
  125.                                                 {
  126.                                                         nAsrStatus=LD_ASR_FOUNDOK;                                
  127.                                                 }
  128.                                                 else
  129.                                             {
  130.                                                         nAsrStatus=LD_ASR_FOUNDZERO;
  131.                                                         }       
  132.                                 }
  133.                         else
  134.                          {
  135.                                         nAsrStatus=LD_ASR_FOUNDZERO;        //执行没有识别
  136.                                 }

  137.                   LD_WriteReg(0x2b, 0);
  138.                   LD_WriteReg(0x1C,0);/*写0:ADC不可用*/
  139.                
  140.                         LD_WriteReg(0x29,0) ;
  141.                         LD_WriteReg(0x02,0) ;
  142.                         LD_WriteReg(0x2B,  0);
  143.                         LD_WriteReg(0xBA, 0);       
  144.                         LD_WriteReg(0xBC,0);       
  145.                         LD_WriteReg(0x08,1);         /*清除FIFO_DATA*/
  146.                         LD_WriteReg(0x08,0);        /*清除FIFO_DATA后 再次写0*/

  147.                         //LD3320_delay(1);

  148. }

  149. /***********************************************************
  150. * 名    称:uint8 LD_Check_ASRBusyFlag_b2(void)
  151. * 功    能:检测 ASR 是否忙状态
  152. * 入口参数:flag ---1:空闲状态  
  153. * 出口参数:
  154. * 说    明:
  155. * 调用方法:
  156. **********************************************************/
  157. uint8 LD_Check_ASRBusyFlag_b2(void)
  158. {
  159.         uint8 j;
  160.         uint8 flag = 0;
  161.         for (j=0; j<10; j++)
  162.         {
  163.                 if (LD_ReadReg(0xb2) == 0x21)
  164.                 {
  165.                         flag = 1;
  166.                         break;
  167.                 }
  168.                 LD3320_delay(10);               
  169.         }
  170.         return flag;
  171. }
  172. /***********************************************************
  173. * 名    称: void LD_AsrStart(void)
  174. * 功    能:
  175. * 入口参数:  ASR初始化
  176. * 出口参数:
  177. * 说    明:
  178. * 调用方法:
  179. **********************************************************/
  180. void LD_AsrStart(void)
  181. {
  182.         LD_Init_ASR();
  183. }
  184. /***********************************************************
  185. * 名    称: uint8 LD_AsrRun(void)
  186. * 功    能: ASR执行函数
  187. * 入口参数:  
  188. * 出口参数:
  189. * 说    明:
  190. * 调用方法:
  191. **********************************************************/
  192. uint8 LD_AsrRun(void)
  193. {
  194.         LD_WriteReg(0x35, MIC_VOL);
  195.         LD_WriteReg(0x1C, 0x09);
  196.         LD_WriteReg(0xBD, 0x20);
  197.         LD_WriteReg(0x08, 0x01);
  198.         LD3320_delay( 5 );
  199.         LD_WriteReg(0x08, 0x00);
  200.         LD3320_delay( 5);

  201.         if(LD_Check_ASRBusyFlag_b2() == 0)
  202.         {
  203.                 return 0;
  204.         }

  205.         LD_WriteReg(0xB2, 0xff);       
  206.         LD_WriteReg(0x37, 0x06);
  207.         LD_WriteReg(0x37, 0x06);
  208.         LD3320_delay( 5);
  209.         LD_WriteReg(0x1C, 0x0b);
  210.         LD_WriteReg(0x29, 0x10);
  211.        
  212.         LD_WriteReg(0xBD, 0x00);   
  213.         return 1;
  214. }

  215. /***********************************************************
  216. * 名    称:uint8 LD_AsrAddFixed(void)
  217. * 功    能:添加识别关键词语
  218. * 入口参数:  
  219. * 出口参数: flag-- 1:success
  220. * 说    明:开发者可以学习"语音识别芯片LD3320高阶秘籍.pdf"中
  221.                                                 关于垃圾词语吸收错误的用法,提高识别率。
  222. * 调用方法:
  223. **********************************************************/
  224. uint8 LD_AsrAddFixed(void)
  225. {
  226.         uint8 k, flag;
  227.         uint8 nAsrAddLength;                                                                          
  228.         #define DATE_A 4    /*数组二维数值*/
  229.         #define DATE_B 20                /*数组一维数值*/
  230.          uint8  sRecog[DATE_A][DATE_B] = {
  231.                                                                                                                                                                  "liu shui deng you yi",\
  232.                                                                                                                                                                 "shan shuo",\
  233.                                                                                                                                                                 "liu shui deng zuo yi",\
  234.                                                                                                                                                                  "quan mie"\
  235.                                                                                                                                                                 };        /*添加关键词,用户修改*/
  236.          uint8  pCode[DATE_A] = {
  237.                                                                                                                                  CODE_LSDYY,\
  238.                                                                                                                                 CODE_SS,\
  239.                                                                                                                                  CODE_LSDZY,\
  240.                                                                                                                                   CODE_QM\
  241.                                                                                                                         };        /*添加识别码,用户修改*/
  242.         flag = 1;
  243.         for (k=0; k<DATE_A; k++)
  244.         {                       
  245.                 if(LD_Check_ASRBusyFlag_b2() == 0)
  246.                 {
  247.                         flag = 0;
  248.                         break;
  249.                 }
  250.                
  251.                 LD_WriteReg(0xc1, pCode[k] );
  252.                 LD_WriteReg(0xc3, 0 );
  253.                 LD_WriteReg(0x08, 0x04);
  254.                 LD3320_delay(1);
  255.                 LD_WriteReg(0x08, 0x00);
  256.                 LD3320_delay(1);

  257.                 for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
  258.                 {
  259.                         if (sRecog[k][nAsrAddLength] == 0)
  260.                                 break;
  261.                         LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
  262.                 }
  263.                 LD_WriteReg(0xb9, nAsrAddLength);
  264.                 LD_WriteReg(0xb2, 0xff);
  265.                 LD_WriteReg(0x37, 0x04);
  266. //                LD_WriteReg(0x37, 0x04);
  267.         }         

  268.     return flag;
  269. }

  270. /***********************************************************
  271. * 名    称: uint8 LD_GetResult(void)
  272. * 功    能: 获取识别结果
  273. * 入口参数:  
  274. * 出口参数: 返回识别码 LD_ReadReg(0xc5 );
  275. * 说    明:
  276. * 调用方法:
  277. **********************************************************/
  278. uint8 LD_GetResult(void)
  279. {
  280.         return LD_ReadReg(0xc5 );
  281. }



复制代码


所有资料51hei提供下载:
YS-V0.4 stm32 - 副本.7z (161.25 KB, 下载次数: 58)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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