LD3320语音芯片的stm32单片机驱动源码工程:
完整源码下载:
基于语音检测的机器人控制.rar
(303.11 KB, 下载次数: 58)
主程序:
- #include <stm32f10x.h>
- #include "stm32f10x_conf.h"
- #include "LDchip.h"
- #include "Reg_RW.h"
- #include "LD3320_config.h"
- /************************************************************************************
- // nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
- // LD_ASR_NONE: 表示没有在作ASR识别
- // LD_ASR_RUNING: 表示LD3320正在作ASR识别中
- // LD_ASR_FOUNDOK: 表示一次识别流程结束后,有一个识别结果
- // LD_ASR_FOUNDZERO: 表示一次识别流程结束后,没有识别结果
- // LD_ASR_ERROR: 表示一次识别流程中LD3320芯片内部出现不正确的状态
- *********************************************************************************/
- uint8 nAsrStatus=0;
- void LD3320_Init(void);
- uint8 RunASR(void);
- void ProcessInt0(void);
- void LD3320_EXTI_Cfg(void);
- void LD3320_Spi_cfg(void);
- void LD3320_GPIO_Cfg(void);
- void LED_gpio_cfg(void);
- /***********************************************************
- * 名 称: LD3320_main(void)
- * 功 能: 主函数LD3320程序入口
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_main(void)
- {
- uint8 nAsrRes=0;
- LD3320_Init();
- PrintCom(TEST_USART," 串口运行中....\r\n");
- PrintCom(TEST_USART,"口令:1、流水灯\r\n");
- PrintCom(TEST_USART,"2、闪烁\r\n");
- PrintCom(TEST_USART,"3、按键触发\r\n");
- PrintCom(TEST_USART,"4、全灭\r\n");
- nAsrStatus = LD_ASR_NONE; // 初始状态:没有在作ASR
- while(1)
- {
- switch(nAsrStatus)
- {
- case LD_ASR_RUNING:
- case LD_ASR_ERROR:
- break;
- case LD_ASR_NONE:
- nAsrStatus=LD_ASR_RUNING;
- if (RunASR()==0) // 启动一次ASR识别流程:ASR初始化,ASR添加关键词语,启动ASR运算
- {
- nAsrStatus = LD_ASR_ERROR;
- }
- break;
- case LD_ASR_FOUNDOK:
- nAsrRes = LD_GetResult( ); // 一次ASR识别流程结束,去取ASR识别结果
- PrintCom(TEST_USART,"\r\n识别码:");
- USART_SendData(TEST_USART,nAsrRes+0x30);
-
- switch(nAsrRes) /*对结果执行相关操作,客户修改*/
- {
- case CODE_LSD: /*命令“流水灯”*/
- PrintCom(TEST_USART,"“流水灯”命令识别成功\r\n");
- break;
- case CODE_SS: /*命令“闪烁”*/
- PrintCom(TEST_USART,"“闪烁”命令识别成功\r\n");
- break;
- case CODE_AJCF: /*命令“按键触发”*/
-
- PrintCom(TEST_USART,"“按键触发”命令识别成功\r\n");
- break;
- case CODE_QM: /*命令“全灭”*/
-
- PrintCom(TEST_USART,"“全灭”命令识别成功\r\n");
- break;
- default:break;
- }
- nAsrStatus = LD_ASR_NONE;
- break;
-
- case LD_ASR_FOUNDZERO:
- default:
- nAsrStatus = LD_ASR_NONE;
- break;
- }//switch
- //开发板测试延时部分(用户可删除)
- Board_text(nAsrRes );
- }// while
- }
- /***********************************************************
- * 名 称:LD3320_Init(void)
- * 功 能:模块驱动端口初始配置
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_Init(void)
- {
- LD3320_GPIO_Cfg();
- LD3320_EXTI_Cfg();
- LD3320_Spi_cfg();
- LED_gpio_cfg();
- LD_reset();
- }
- /***********************************************************
- * 名 称: void Delay_(int i)
- * 功 能: 短延时
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void Delay_( int i)
- {
- while(i--);
- }
- /***********************************************************
- * 名 称: LD3320_delay(unsigned long uldata)
- * 功 能: 长延时函数
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_delay(unsigned long uldata)
- {
- unsigned int j = 0;
- unsigned int g = 0;
- for (j=0;j<5;j++)
- {
- for (g=0;g<uldata;g++)
- {
- Delay_(120);
- }
- }
- }
- /***********************************************************
- * 名 称: RunASR(void)
- * 功 能: 运行ASR
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- uint8 RunASR(void)
- {
- uint8 i=0;
- uint8 asrflag=0;
- for (i=0; i<5; i++) // 防止由于硬件原因导致LD3320芯片工作不正常,所以一共尝试5次启动ASR识别流程
- {
- LD_AsrStart(); //初始化ASR
- LD3320_delay(100);
- if (LD_AsrAddFixed()==0) //添加关键词语到LD3320芯片中
- {
- LD_reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
- LD3320_delay(50); // 并从初始化开始重新ASR识别流程
- continue;
- }
- LD3320_delay(10);
- if (LD_AsrRun() == 0)
- {
- LD_reset(); // LD3320芯片内部出现不正常,立即重启LD3320芯片
- LD3320_delay(50); // 并从初始化开始重新ASR识别流程
- continue;
- }
- asrflag=1;
- break; // ASR流程启动成功,退出当前for循环。开始等待LD3320送出的中断信号
- }
- return asrflag;
- }
- /***********************************************************
- * 名 称:LD3320_GPIO_Cfg(void)
- * 功 能:初始化需要用到的IO口
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_GPIO_Cfg(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(LD3320RST_GPIO_CLK | LD3320CS_GPIO_CLK,ENABLE);
- //LD_CS /RSET
- GPIO_InitStructure.GPIO_Pin =LD3320CS_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LD3320CS_GPIO_PORT,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin =LD3320RST_PIN;
- GPIO_Init(LD3320RST_GPIO_PORT,&GPIO_InitStructure);
- }
- /***********************************************************
- * 名 称:LD3320_Spi_cfg(void)
- * 功 能:配置SPI功能和端口初始化
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_Spi_cfg(void)
- {
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- //spi端口配置
- RCC_APB2PeriphClockCmd(LD3320SPI_CLK,ENABLE); //使能SPI2外设时钟
- RCC_APB2PeriphClockCmd(LD3320WR_GPIO_CLK | LD3320SPIMISO_GPIO_CLK | LD3320SPIMOSI_GPIO_CLK | LD3320SPISCK_GPIO_CLK,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = LD3320SPIMISO_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
- GPIO_Init(LD3320SPIMISO_GPIO_PORT,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = LD3320SPIMOSI_PIN;
- GPIO_Init(LD3320SPIMOSI_GPIO_PORT,&GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LD3320SPISCK_PIN;
- GPIO_Init(LD3320SPISCK_GPIO_PORT,&GPIO_InitStructure);
-
- GPIO_InitStructure.GPIO_Pin = LD3320WR_PIN; //WR
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LD3320WR_GPIO_PORT, &GPIO_InitStructure);
-
- LD_CS_H();
-
- SPI_Cmd(LD3320SPI, DISABLE);
- SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全双工
- SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式
- SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
- SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //时钟极性 空闲状态时,SCK保持低电平
- SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //时钟相位 数据采样从第一个时钟边沿开始
- SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件产生NSS
- SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64; //波特率控制 SYSCLK/128
- SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //数据高位在前
- SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC多项式寄存器初始值为7
- SPI_Init(LD3320SPI, &SPI_InitStructure);
- SPI_Cmd(LD3320SPI, ENABLE);
- }
- /***********************************************************
- * 名 称: LD3320_EXTI_Cfg(void)
- * 功 能: 外部中断功能配置和相关端口配置
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LD3320_EXTI_Cfg(void)
- {
- EXTI_InitTypeDef EXTI_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
- RCC_APB2PeriphClockCmd(LD3320IRQ_GPIO_CLK, ENABLE);
- GPIO_InitStructure.GPIO_Pin =LD3320IRQ_PIN;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(LD3320IRQ_GPIO_PORT, &GPIO_InitStructure);
- //外部中断线配置
- GPIO_EXTILineConfig(LD3320IRQEXIT_PORTSOURCE, LD3320IRQPINSOURCE);
- EXTI_InitStructure.EXTI_Line = LD3320IRQEXITLINE;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
- //中断嵌套配置
- NVIC_InitStructure.NVIC_IRQChannel = LD3320IRQN;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- }
- /***********************************************************
- * 名 称: EXTI IRQHandler(void)
- * 功 能: 外部中断函数
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void EXTI15_10_IRQHandler(void)
- {
- if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET )
- {
- ProcessInt0();
- PrintCom(TEST_USART,"进入中断12\r\n");
- EXTI_ClearFlag(LD3320IRQEXITLINE);
- EXTI_ClearITPendingBit(LD3320IRQEXITLINE); //清除LINE2上的中断标志位
- }
- }
- /***********************************************************
- * 名 称:void LED_gpio_cfg(void)
- * 功 能:LED端口配置
- * 入口参数:
- * 出口参数:
- * 说 明:
- * 调用方法:
- **********************************************************/
- void LED_gpio_cfg(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
-
- RCC_APB2PeriphClockCmd(LED1_GPIO_CLK | LED2_GPIO_CLK | LED3_GPIO_CLK | LED4_GPIO_CLK,ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = LED1_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED2_PIN;
- GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED3_PIN;
- GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = LED4_PIN;
- GPIO_Init(LED4_GPIO_PORT, &GPIO_InitStructure);
-
- LED1_OFF;
- LED2_OFF;
- LED3_OFF;
- LED4_OFF;
- }
复制代码
|