找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3406|回复: 2
收起左侧

LD3320语音控制LED STM32单片机源码下载

[复制链接]
ID:191767 发表于 2017-4-20 19:28 | 显示全部楼层 |阅读模式
LD3320语音芯片的stm32单片机驱动源码工程:
0.png
完整源码下载:
基于语音检测的机器人控制.rar (303.11 KB, 下载次数: 58)






主程序:
  1. #include  <stm32f10x.h>
  2. #include "stm32f10x_conf.h"
  3. #include "LDchip.h"
  4. #include "Reg_RW.h"
  5. #include "LD3320_config.h"


  6. /************************************************************************************
  7. //        nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
  8. //        LD_ASR_NONE:                表示没有在作ASR识别
  9. //        LD_ASR_RUNING:                表示LD3320正在作ASR识别中
  10. //        LD_ASR_FOUNDOK:                表示一次识别流程结束后,有一个识别结果
  11. //        LD_ASR_FOUNDZERO:        表示一次识别流程结束后,没有识别结果
  12. //        LD_ASR_ERROR:                表示一次识别流程中LD3320芯片内部出现不正确的状态
  13. *********************************************************************************/
  14. uint8 nAsrStatus=0;       

  15. void LD3320_Init(void);
  16. uint8 RunASR(void);
  17. void ProcessInt0(void);
  18. void LD3320_EXTI_Cfg(void);
  19. void LD3320_Spi_cfg(void);
  20. void LD3320_GPIO_Cfg(void);
  21. void LED_gpio_cfg(void);

  22. /***********************************************************
  23. * 名    称: LD3320_main(void)
  24. * 功    能: 主函数LD3320程序入口
  25. * 入口参数:  
  26. * 出口参数:
  27. * 说    明:
  28. * 调用方法:
  29. **********************************************************/

  30. void  LD3320_main(void)
  31. {
  32.         uint8 nAsrRes=0;
  33.         LD3320_Init();          
  34.   PrintCom(TEST_USART," 串口运行中....\r\n");
  35.         PrintCom(TEST_USART,"口令:1、流水灯\r\n");
  36.         PrintCom(TEST_USART,"2、闪烁\r\n");                                
  37.         PrintCom(TEST_USART,"3、按键触发\r\n");                
  38.         PrintCom(TEST_USART,"4、全灭\r\n");                        

  39.         nAsrStatus = LD_ASR_NONE;                //        初始状态:没有在作ASR

  40.         while(1)
  41.         {
  42.         switch(nAsrStatus)
  43.                 {
  44.                         case LD_ASR_RUNING:
  45.                         case LD_ASR_ERROR:               
  46.                                         break;
  47.                         case LD_ASR_NONE:
  48.                                         nAsrStatus=LD_ASR_RUNING;
  49.                                         if (RunASR()==0)        //        启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
  50.                                         {               
  51.                                                 nAsrStatus = LD_ASR_ERROR;
  52.                                         }
  53.                                         break;

  54.                         case LD_ASR_FOUNDOK:
  55.                                          nAsrRes = LD_GetResult( );        //        一次ASR识别流程结束,去取ASR识别结果                                                                                 
  56.                                                 PrintCom(TEST_USART,"\r\n识别码:");                       
  57.                                                 USART_SendData(TEST_USART,nAsrRes+0x30);                
  58.                                                                
  59.                                          switch(nAsrRes)                   /*对结果执行相关操作,客户修改*/
  60.                                                 {
  61.                                                         case CODE_LSD:                        /*命令“流水灯”*/
  62.                                                                 PrintCom(TEST_USART,"“流水灯”命令识别成功\r\n");
  63.                                                                                                                          break;
  64.                                                         case CODE_SS:         /*命令“闪烁”*/
  65.                                                                 PrintCom(TEST_USART,"“闪烁”命令识别成功\r\n");
  66.                                                                                                                          break;
  67.                                                         case CODE_AJCF:                /*命令“按键触发”*/
  68.                                        
  69.                                                                 PrintCom(TEST_USART,"“按键触发”命令识别成功\r\n");
  70.                                                                                                                         break;
  71.                                                         case CODE_QM:                /*命令“全灭”*/
  72.                                        
  73.                                                                 PrintCom(TEST_USART,"“全灭”命令识别成功\r\n");
  74.                                                                                                                         break;
  75.                                                         default:break;
  76.                                                 }       
  77.                                                 nAsrStatus = LD_ASR_NONE;
  78.                                         break;
  79.                        
  80.                         case LD_ASR_FOUNDZERO:
  81.                         default:
  82.                                                 nAsrStatus = LD_ASR_NONE;
  83.                                                 break;
  84.                         }//switch
  85.         //开发板测试延时部分(用户可删除)               
  86.                 Board_text(nAsrRes );
  87.         }// while

  88. }
  89. /***********************************************************
  90. * 名    称:LD3320_Init(void)
  91. * 功    能:模块驱动端口初始配置
  92. * 入口参数:  
  93. * 出口参数:
  94. * 说    明:
  95. * 调用方法:
  96. **********************************************************/
  97. void LD3320_Init(void)
  98. {
  99.         LD3320_GPIO_Cfg();       
  100.         LD3320_EXTI_Cfg();
  101.         LD3320_Spi_cfg();         
  102.         LED_gpio_cfg();
  103.         LD_reset();
  104. }

  105. /***********************************************************
  106. * 名    称: void Delay_(int i)
  107. * 功    能: 短延时
  108. * 入口参数:  
  109. * 出口参数:
  110. * 说    明:
  111. * 调用方法:
  112. **********************************************************/
  113. void Delay_( int i)
  114. {     
  115.     while(i--);
  116. }       
  117. /***********************************************************
  118. * 名    称:        LD3320_delay(unsigned long uldata)
  119. * 功    能:        长延时函数
  120. * 入口参数:  
  121. * 出口参数:
  122. * 说    明:
  123. * 调用方法:
  124. **********************************************************/
  125. void LD3320_delay(unsigned long uldata)
  126. {
  127.         unsigned int j  =  0;
  128.         unsigned int g  =  0;
  129.         for (j=0;j<5;j++)
  130.         {
  131.                 for (g=0;g<uldata;g++)
  132.                 {
  133.                         Delay_(120);
  134.                 }
  135.         }
  136. }

  137. /***********************************************************
  138. * 名    称:        RunASR(void)
  139. * 功    能:        运行ASR
  140. * 入口参数:  
  141. * 出口参数:
  142. * 说    明:
  143. * 调用方法:
  144. **********************************************************/
  145. uint8 RunASR(void)
  146. {
  147.         uint8 i=0;
  148.         uint8 asrflag=0;
  149.         for (i=0; i<5; i++)                                        //        防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
  150.         {
  151.                 LD_AsrStart();                                                //初始化ASR
  152.                 LD3320_delay(100);
  153.                 if (LD_AsrAddFixed()==0)        //添加关键词语到LD3320芯片中
  154.                 {
  155.                         LD_reset();                                                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  156.                         LD3320_delay(50);                                //        并从初始化开始重新ASR识别流程
  157.                         continue;
  158.                 }
  159.                 LD3320_delay(10);
  160.                 if (LD_AsrRun() == 0)
  161.                 {
  162.                         LD_reset();                                                        //        LD3320芯片内部出现不正常,立即重启LD3320芯片
  163.                         LD3320_delay(50);                                //        并从初始化开始重新ASR识别流程
  164.                         continue;
  165.                 }
  166.                 asrflag=1;
  167.                 break;                                                                                //        ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
  168.         }       
  169.         return asrflag;
  170. }

  171. /***********************************************************
  172. * 名    称:LD3320_GPIO_Cfg(void)
  173. * 功    能:初始化需要用到的IO口
  174. * 入口参数:  
  175. * 出口参数:
  176. * 说    明:
  177. * 调用方法:
  178. **********************************************************/
  179. void LD3320_GPIO_Cfg(void)
  180. {       
  181.                 GPIO_InitTypeDef GPIO_InitStructure;       
  182.                 RCC_APB2PeriphClockCmd(LD3320RST_GPIO_CLK | LD3320CS_GPIO_CLK,ENABLE);
  183.                 //LD_CS        /RSET
  184.                 GPIO_InitStructure.GPIO_Pin =LD3320CS_PIN;
  185.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  186.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  187.                 GPIO_Init(LD3320CS_GPIO_PORT,&GPIO_InitStructure);
  188.                 GPIO_InitStructure.GPIO_Pin =LD3320RST_PIN;
  189.                 GPIO_Init(LD3320RST_GPIO_PORT,&GPIO_InitStructure);

  190. }
  191. /***********************************************************
  192. * 名    称:LD3320_Spi_cfg(void)
  193. * 功    能:配置SPI功能和端口初始化
  194. * 入口参数:  
  195. * 出口参数:
  196. * 说    明:
  197. * 调用方法:
  198. **********************************************************/
  199. void LD3320_Spi_cfg(void)
  200. {
  201.         SPI_InitTypeDef  SPI_InitStructure;
  202.         GPIO_InitTypeDef GPIO_InitStructure;
  203.   //spi端口配置
  204.         RCC_APB2PeriphClockCmd(LD3320SPI_CLK,ENABLE);           //使能SPI2外设时钟
  205.   RCC_APB2PeriphClockCmd(LD3320WR_GPIO_CLK | LD3320SPIMISO_GPIO_CLK | LD3320SPIMOSI_GPIO_CLK | LD3320SPISCK_GPIO_CLK,ENABLE);
  206.        
  207.         GPIO_InitStructure.GPIO_Pin = LD3320SPIMISO_PIN;
  208.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  209.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  210.         GPIO_Init(LD3320SPIMISO_GPIO_PORT,&GPIO_InitStructure);
  211.        
  212.         GPIO_InitStructure.GPIO_Pin = LD3320SPIMOSI_PIN;
  213.         GPIO_Init(LD3320SPIMOSI_GPIO_PORT,&GPIO_InitStructure);

  214.         GPIO_InitStructure.GPIO_Pin = LD3320SPISCK_PIN;
  215.         GPIO_Init(LD3320SPISCK_GPIO_PORT,&GPIO_InitStructure);
  216.        
  217.         GPIO_InitStructure.GPIO_Pin = LD3320WR_PIN;                        //WR
  218.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  219.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  220.         GPIO_Init(LD3320WR_GPIO_PORT, &GPIO_InitStructure);
  221.        
  222.         LD_CS_H();
  223.        
  224.         SPI_Cmd(LD3320SPI, DISABLE);

  225.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;           //全双工
  226.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                                                                                   //主模式
  227.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                                                                                   //8位
  228.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                                                                                           //时钟极性 空闲状态时,SCK保持低电平
  229.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;                                                                                                   //时钟相位 数据采样从第一个时钟边沿开始
  230.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                                                                                                   //软件产生NSS
  231.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;   //波特率控制 SYSCLK/128
  232.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                                                                           //数据高位在前
  233.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                                                                                                   //CRC多项式寄存器初始值为7
  234.         SPI_Init(LD3320SPI, &SPI_InitStructure);

  235.         SPI_Cmd(LD3320SPI, ENABLE);

  236. }
  237. /***********************************************************
  238. * 名    称: LD3320_EXTI_Cfg(void)
  239. * 功    能: 外部中断功能配置和相关端口配置
  240. * 入口参数:  
  241. * 出口参数:
  242. * 说    明:
  243. * 调用方法:
  244. **********************************************************/
  245. void LD3320_EXTI_Cfg(void)
  246. {
  247.   EXTI_InitTypeDef EXTI_InitStructure;
  248.         NVIC_InitTypeDef NVIC_InitStructure;
  249.   GPIO_InitTypeDef GPIO_InitStructure;
  250.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //使能复用功能时钟

  251.         RCC_APB2PeriphClockCmd(LD3320IRQ_GPIO_CLK, ENABLE);
  252.   GPIO_InitStructure.GPIO_Pin =LD3320IRQ_PIN;
  253.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  254.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  255.   GPIO_Init(LD3320IRQ_GPIO_PORT, &GPIO_InitStructure);
  256.         //外部中断线配置
  257.   GPIO_EXTILineConfig(LD3320IRQEXIT_PORTSOURCE, LD3320IRQPINSOURCE);
  258.   EXTI_InitStructure.EXTI_Line = LD3320IRQEXITLINE;
  259.   EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  260.   EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
  261.   EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  262.   EXTI_Init(&EXTI_InitStructure);
  263.         //中断嵌套配置
  264.   NVIC_InitStructure.NVIC_IRQChannel = LD3320IRQN;
  265.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  266.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  267.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  268.   NVIC_Init(&NVIC_InitStructure);
  269. }


  270. /***********************************************************
  271. * 名    称:  EXTI IRQHandler(void)
  272. * 功    能: 外部中断函数
  273. * 入口参数:  
  274. * 出口参数:
  275. * 说    明:
  276. * 调用方法:
  277. **********************************************************/
  278. void EXTI15_10_IRQHandler(void)
  279. {
  280.         if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET )
  281.         {
  282.                 ProcessInt0();
  283.                 PrintCom(TEST_USART,"进入中断12\r\n");       
  284.                 EXTI_ClearFlag(LD3320IRQEXITLINE);
  285.                 EXTI_ClearITPendingBit(LD3320IRQEXITLINE);  //清除LINE2上的中断标志位  
  286.         }
  287. }

  288. /***********************************************************
  289. * 名    称:void LED_gpio_cfg(void)
  290. * 功    能:LED端口配置
  291. * 入口参数:  
  292. * 出口参数:
  293. * 说    明:
  294. * 调用方法:
  295. **********************************************************/
  296. void LED_gpio_cfg(void)
  297. {       
  298.                 GPIO_InitTypeDef GPIO_InitStructure;
  299.        
  300.                 RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK,ENABLE);
  301.        
  302.                 GPIO_InitStructure.GPIO_Pin = LED1_PIN;
  303.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  304.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  305.                 GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
  306.                 GPIO_InitStructure.GPIO_Pin = LED2_PIN;
  307.                 GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
  308.                 GPIO_InitStructure.GPIO_Pin = LED3_PIN;
  309.                 GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
  310.                 GPIO_InitStructure.GPIO_Pin = LED4_PIN;
  311.                 GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);       
  312.        
  313.                 LED1_OFF;
  314.                 LED2_OFF;
  315.                 LED3_OFF;
  316.                 LED4_OFF;
  317. }
复制代码

评分

参与人数 1黑币 +6 收起 理由
gracture + 6 赞一个!

查看全部评分

回复

使用道具 举报

ID:85865 发表于 2017-4-22 12:36 | 显示全部楼层
原理图呢?有原理图吗?
回复

使用道具 举报

ID:325874 发表于 2018-8-20 02:53 | 显示全部楼层
没有.h文件吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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