STM32传感器外设集--语音识别模块(LD3320)

2023-11-07

目录

本节主要贴上以前写的语音识别外设LD3320,希望对大家有用,本人已经测试过有用

如何使用,将下面这段函数添加到功能函数中

LD3320.h

LD3320.c


本节主要贴上以前写的语音识别外设LD3320,希望对大家有用,本人已经测试过有用

 

如何使用,将下面这段函数添加到功能函数中

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识别结果										 
					 printf("\r\n识别码:%d", nAsrRes);			 		
								
					 switch(nAsrRes)		   			//对结果执行相关操作,客户修改
						{
							case CODE_LSD:					//命令“流水灯”
							{
									printf(" 流水灯 指令识别成功\r\n"); 
							    //SYN6288_Speech(DEBUG_USARTx,"现在展示流水灯");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															 break;
							}
							case CODE_SS:	 					//命令“闪烁”
							{
								printf(" 名字 指令识别成功\r\n"); 
								// SYN6288_Speech(DEBUG_USARTx,"现在展示闪烁");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															 break;
							}
							case LDE_1:					
							{
								printf(" 红灯打开\r\n"); 
								 //SYN6288_Speech(DEBUG_USARTx,"按键触发");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}
							
							case LDE_2:						
							{
								printf(" 绿灯打开\r\n");
								 //SYN6288_Speech(DEBUG_USARTx,"全灭 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}
							case LDE_3:						
							{
								printf(" 蓝灯打开\r\n");
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}	
							case LDE_1_1:					
							{
								printf(" 红灯关闭\r\n"); 
								 //SYN6288_Speech(DEBUG_USARTx,"按键触发");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}
							
							case LDE_2_1:						
							{
								printf(" 绿灯关闭\r\n");
								 //SYN6288_Speech(DEBUG_USARTx,"全灭 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}
							case LDE_3_1:						
							{
								printf(" 蓝灯关闭\r\n");
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
								break;
							}
								
							case LDE_All_OFF:						//命令“状态”
							{
								printf(" 全灯关闭打开\r\n");
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
								break;
							}	
							case chen:						
							{
								
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
								break;
							}
							case chen_1:						
							{
								
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
								break;
							}
							case voice_J_0:						
							{
			
								printf(" 音量提高\r\n");
								 //SYN6288_Speech(DEBUG_USARTx,"全灭 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
															break;
							}
							case voice_J_1:						
							{
								printf(" 音量降低\r\n");
						
								// SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
									Delay_ms(200);
								break;
							}								
							default:break;
						}	
					nAsrStatus = LD_ASR_NONE;
					break;
			case LD_ASR_FOUNDZERO:
			default:
					nAsrStatus = LD_ASR_NONE;
					break;
			}//switch

LD3320.h

#ifndef _LD3320_H__
#define _LD3320_H__
#include "stm32f10x_exti.h"
#include "stm32f10x_spi.h"

///以下三个状态定义用来记录程序是在运行ASR识别还是在运行MP3播放
#define LD_MODE_IDLE			0x00
#define LD_MODE_ASR_RUN		0x08
#define LD_MODE_MP3		 		0x40
///以下五个状态定义用来记录程序是在运行ASR识别过程中的哪个状态
#define LD_ASR_NONE					0x00	//表示没有在作ASR识别
#define LD_ASR_RUNING				0x01	//表示LD3320正在作ASR识别中
#define LD_ASR_FOUNDOK			0x10	//表示一次识别流程结束后,有一个识别结果
#define LD_ASR_FOUNDZERO 		0x11	//表示一次识别流程结束后,没有识别结果
#define LD_ASR_ERROR	 			0x31	//	表示一次识别流程中LD3320芯片内部出现不正确的状态

#define CLK_IN   					24/* user need modify this value according to clock in */
#define LD_PLL_11					(uint8_t)((CLK_IN/2.0)-1)
#define LD_PLL_MP3_19			0x0f
#define LD_PLL_MP3_1B			0x18
#define LD_PLL_MP3_1D   	(uint8_t)(((90.0*((LD_PLL_11)+1))/(CLK_IN))-1)

#define LD_PLL_ASR_19 		(uint8_t)(CLK_IN*32.0/(LD_PLL_11+1) - 0.51)
#define LD_PLL_ASR_1B 		0x48
#define LD_PLL_ASR_1D 		0x1f

#define MIC_VOL 0x43
///识别码(客户修改处)
#define CODE_LSD	1	 //唤醒
#define CODE_SS	  2	 //名字
#define LDE_1	  3	 //打开红
#define LDE_2	  4	 //打开绿
#define LDE_3		5  //打开蓝
#define LDE_All_OFF		6  //状态
#define voice_J_0  7	//提高音量

#define LDE_1_1	  51	 //打开红
#define LDE_2_1	  52	 //打开绿
#define LDE_3_1		53  //打开蓝
#define voice_J_1  57	//降低音量




#define chen		90  //娱乐
#define chen_1		91  //娱乐


///LD3320引脚相关定义
#define LD3320RST_PIN					GPIO_Pin_15		
#define LD3320RST_GPIO_PORT		GPIOB
#define LD3320RST_GPIO_CLK		RCC_APB2Periph_GPIOB
#define LD_RST_H() 						GPIO_SetBits(GPIOB, GPIO_Pin_15)
#define LD_RST_L() 						GPIO_ResetBits(GPIOB, GPIO_Pin_15)

///LD3320引脚相关定义
#define LD3320CS_PIN					GPIO_Pin_4		
#define LD3320CS_GPIO_PORT		GPIOA
#define LD3320CS_GPIO_CLK			RCC_APB2Periph_GPIOA
#define LD_CS_H()							GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define LD_CS_L()							GPIO_ResetBits(GPIOA, GPIO_Pin_4)

#define LD3320IRQ_GPIO_CLK		RCC_APB2Periph_GPIOB
#define LD3320IRQ_PIN					GPIO_Pin_12
#define LD3320IRQ_GPIO_PORT		GPIOB
#define LD3320IRQEXIT_PORTSOURCE		GPIO_PortSourceGPIOB
#define LD3320IRQPINSOURCE		GPIO_PinSource12
#define LD3320IRQEXITLINE			EXTI_Line12
#define LD3320IRQN						EXTI15_10_IRQn

#define LD3320WR_PIN					GPIO_Pin_13
#define LD3320WR_GPIO_PORT		GPIOB
#define LD3320WR_GPIO_CLK			RCC_APB2Periph_GPIOB
#define LD_SPIS_H()  					GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define LD_SPIS_L()  					GPIO_ResetBits(GPIOB, GPIO_Pin_13)

#define	LD3320SPI							SPI1
#define LD3320SPI_CLK					RCC_APB2Periph_SPI1						

#define LD3320SPIMISO_PIN					GPIO_Pin_6
#define LD3320SPIMISO_GPIO_PORT		GPIOA
#define LD3320SPIMISO_GPIO_CLK		RCC_APB2Periph_GPIOA

#define LD3320SPIMOSI_PIN					GPIO_Pin_7
#define LD3320SPIMOSI_GPIO_PORT		GPIOA
#define LD3320SPIMOSI_GPIO_CLK		RCC_APB2Periph_GPIOA

#define LD3320SPISCK_PIN					GPIO_Pin_5
#define LD3320SPISCK_GPIO_PORT		GPIOA
#define LD3320SPISCK_GPIO_CLK			RCC_APB2Periph_GPIOA

///相关初始化
void LD3320_main(void);
void LD3320_init(void);
static void LD3320_GPIO_Cfg(void);
static void LD3320_EXTI_Cfg(void);
static void LD3320_SPI_cfg(void);
///中间层
static void LD3320_delay(unsigned long uldata);
uint8_t RunASR(void);
void LD_reset(void);
void LD_AsrStart(void);
uint8_t LD_Check_ASRBusyFlag_b2(void);
///寄存器操作
uint8_t spi_send_byte(uint8_t byte);
void LD_WriteReg(uint8_t data1,uint8_t data2);
uint8_t LD_ReadReg(uint8_t reg_add);
uint8_t LD_AsrAddFixed(void);
uint8_t LD_GetResult(void);
uint8_t LD_AsrRun(void);
void ProcessInt(void);
void LD_Init_Common(void);
void LD_Init_ASR(void);

#endif

LD3320.c

#include "LD3320.h"
#include "string.h"
#include "bsp_SysTick.h"
#include <string.h>
#include "bsp_usart1.h"
#include "SYN6288.h"
#include "bsp_led.h"

/************************************************************************************
//	nAsrStatus 用来在main主程序中表示程序运行的状态,不是LD3320芯片内部的状态寄存器
//	LD_ASR_NONE:			表示没有在作ASR识别
//	LD_ASR_RUNING:		表示LD3320正在作ASR识别中
//	LD_ASR_FOUNDOK:		表示一次识别流程结束后,有一个识别结果
//	LD_ASR_FOUNDZERO:	表示一次识别流程结束后,没有识别结果
//	LD_ASR_ERROR:			表示一次识别流程中LD3320芯片内部出现不正确的状态
首先:
LD3320
SPI总线

RST—PB15,
CS--PA4,
IRQ—PB12,
WR—PB13,
MISO—PA6,
MOSI—PA7,
SCK—PA5
*********************************************************************************/
extern uint8_t nAsrStatus;	
uint8_t nLD_Mode = LD_MODE_IDLE;//用来记录当前是在进行ASR识别还是在播放MP3
uint8_t ucRegVal;


static 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);
}
static 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);
}
static void LD3320_SPI_cfg(void)
{
	SPI_InitTypeDef  SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
  //spi端口配置
	RCC_APB2PeriphClockCmd(LD3320SPI_CLK,ENABLE);		
  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;				
	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);
}

///中间层
void EXTI15_10_IRQHandler(void)
{
	if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET ) 
	{
		ProcessInt(); 
	
		EXTI_ClearFlag(LD3320IRQEXITLINE);
		EXTI_ClearITPendingBit(LD3320IRQEXITLINE);//清除LINE上的中断标志位  
	} 
}
static void LD3320_delay(unsigned long uldata)
{
	unsigned int i  =  0;
	unsigned int j  =  0;
	unsigned int k  =  0;
	for (i=0;i<5;i++)
	{
		for (j=0;j<uldata;j++)
		{
			k = 200;
			while(k--);
		}
	}
}
uint8_t RunASR(void)
{
	uint8_t i=0;
	uint8_t 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;
}

void LD_reset(void)
{
	uint8_t i;
	LD_RST_H();
	LD3320_delay(100);
	LD_RST_L();
	LD3320_delay(100);
	LD_RST_H();
	LD3320_delay(100);
	LD_CS_L();
	LD3320_delay(100);
	LD_CS_H();		
	LD3320_delay(100);
	
	i=LD_ReadReg(0x6);
	LD_WriteReg(0x35, 0x33);
	LD_WriteReg(0x1b, 0x55);
	LD_WriteReg(0xb3, 0xaa);
	i=LD_ReadReg(0x35);
	i=LD_ReadReg(0x1b);
	i=LD_ReadReg(0xb3);
	i=i;
	LD_RST_H();
	LD3320_delay(100);
	LD_RST_L();
	LD3320_delay(100);
	LD_RST_H();
	LD3320_delay(100);
	LD_CS_L();
	LD3320_delay(100);
	LD_CS_H();		
	i=LD_ReadReg(0x6);
	LD3320_delay(100);
	i=LD_ReadReg(0x35);
	i=LD_ReadReg(0x1b);
	i=LD_ReadReg(0xb3);
	i=i;
}
void LD_AsrStart(void)
{
	LD_Init_ASR();
}

uint8_t LD_Check_ASRBusyFlag_b2(void)
{
	uint8_t j;
	uint8_t flag = 0;
	for (j=0; j<10; j++)
	{
		if (LD_ReadReg(0xb2) == 0x21)
		{
			flag = 1;
			break;
		}
		LD3320_delay(10);		
	}
	return flag;
}


///寄存器操作
uint8_t spi_send_byte(uint8_t byte)
{
	while (SPI_I2S_GetFlagStatus(LD3320SPI, SPI_I2S_FLAG_TXE) == RESET);
	SPI_I2S_SendData(LD3320SPI,byte);
	while (SPI_I2S_GetFlagStatus(LD3320SPI,SPI_I2S_FLAG_RXNE) == RESET);
	return SPI_I2S_ReceiveData(LD3320SPI);
}

void LD_WriteReg(uint8_t data1,uint8_t data2)
{
	LD_CS_L();
	LD_SPIS_L();
	spi_send_byte(0x04);
	spi_send_byte(data1);
	spi_send_byte(data2);
	LD_CS_H();
}

uint8_t LD_ReadReg(uint8_t reg_add)
{
	uint8_t i;
	LD_CS_L();
	LD_SPIS_L();
	spi_send_byte(0x05);
	spi_send_byte(reg_add);
	i=spi_send_byte(0x00);
	LD_CS_H();
	return(i);
}

uint8_t LD_GetResult(void)
{
	return LD_ReadReg(0xc5);
}

uint8_t LD_AsrRun(void)
{
	LD_WriteReg(0x35, MIC_VOL);
	LD_WriteReg(0x1C, 0x09);
	LD_WriteReg(0xBD, 0x20);
	LD_WriteReg(0x08, 0x01);
	LD3320_delay( 5 );
	LD_WriteReg(0x08, 0x00);
	LD3320_delay( 5);

	if(LD_Check_ASRBusyFlag_b2() == 0)
	{
		return 0;
	}

	LD_WriteReg(0xB2, 0xff);	
	LD_WriteReg(0x37, 0x06);
	LD_WriteReg(0x37, 0x06);
	LD3320_delay(5);
	LD_WriteReg(0x1C, 0x0b);
	LD_WriteReg(0x29, 0x10);
	LD_WriteReg(0xBD, 0x00);   
	return 1;
}
void ProcessInt(void)
{
	uint8_t nAsrResCount=0;

	ucRegVal = LD_ReadReg(0x2B);

// 语音识别产生的中断
//(有声音输入,不论识别成功或失败都有中断)
	LD_WriteReg(0x29,0) ;
	LD_WriteReg(0x02,0) ;

	if((ucRegVal & 0x10) && LD_ReadReg(0xb2)==0x21 && LD_ReadReg(0xbf)==0x35)		
	{	 
			nAsrResCount = LD_ReadReg(0xba);

			if(nAsrResCount>0 && nAsrResCount<=4) 
			{
				nAsrStatus=LD_ASR_FOUNDOK; 				
			}
			else
			{
				nAsrStatus=LD_ASR_FOUNDZERO;
			}	
	}
	else
	{
		nAsrStatus=LD_ASR_FOUNDZERO;//执行没有识别
	}

	LD_WriteReg(0x2b,0);
	LD_WriteReg(0x1C,0);//写0:ADC不可用
	LD_WriteReg(0x29,0);
	LD_WriteReg(0x02,0);
	LD_WriteReg(0x2B,0);
	LD_WriteReg(0xBA,0);	
	LD_WriteReg(0xBC,0);	
	LD_WriteReg(0x08,1);//清除FIFO_DATA
	LD_WriteReg(0x08,0);//清除FIFO_DATA后 再次写0
}

void LD_Init_Common(void)
{
	LD_ReadReg(0x06);  
	LD_WriteReg(0x17, 0x35); 
	LD3320_delay(5);
	LD_ReadReg(0x06);  

	LD_WriteReg(0x89, 0x03);  
	LD3320_delay(5);
	LD_WriteReg(0xCF, 0x43);   
	LD3320_delay(5);
	LD_WriteReg(0xCB, 0x02);
	
	/*PLL setting*/
	LD_WriteReg(0x11, LD_PLL_11);       
	if (nLD_Mode == LD_MODE_MP3)
	{
		LD_WriteReg(0x1E, 0x00); 
		LD_WriteReg(0x19, LD_PLL_MP3_19);   
		LD_WriteReg(0x1B, LD_PLL_MP3_1B);   
		LD_WriteReg(0x1D, LD_PLL_MP3_1D);
	}
	else
	{
		LD_WriteReg(0x1E,0x00);
		LD_WriteReg(0x19, LD_PLL_ASR_19); 
		LD_WriteReg(0x1B, LD_PLL_ASR_1B);		
	  LD_WriteReg(0x1D, LD_PLL_ASR_1D);
	}
	LD3320_delay(5);
	
	LD_WriteReg(0xCD, 0x04);
	LD_WriteReg(0x17, 0x4c); 
	LD3320_delay(1);
	LD_WriteReg(0xB9, 0x00);
	LD_WriteReg(0xCF, 0x4F); 
	LD_WriteReg(0x6F, 0xFF); 
}

void LD_Init_ASR(void)
{
	nLD_Mode=LD_MODE_ASR_RUN;
	LD_Init_Common();

	LD_WriteReg(0xBD, 0x00);
	LD_WriteReg(0x17, 0x48);	
	LD3320_delay(5);
	LD_WriteReg(0x3C, 0x80);    
	LD_WriteReg(0x3E, 0x07);
	LD_WriteReg(0x38, 0xff);    
	LD_WriteReg(0x3A, 0x07);
	LD_WriteReg(0x40, 0);          
	LD_WriteReg(0x42, 8);
	LD_WriteReg(0x44, 0);    
	LD_WriteReg(0x46, 8); 
	LD3320_delay( 1 );
}

///相关初始化
void LD3320_init(void)
{
	LD3320_GPIO_Cfg();	
	LD3320_EXTI_Cfg();
	LD3320_SPI_cfg();
	LD_reset();
}
static uint8_t LD_AsrAddFixed(void)
{
	uint8_t k, flag;
	uint8_t nAsrAddLength;
	#define DATE_A 20    //数组二维数值
	#define DATE_B 50		//数组一维数值
	//添加关键词,用户修改
	uint8_t  sRecog[DATE_A][DATE_B] = {
	 			"xiao die xiao die",\
				"ni jiao shen me",\
				"ni shi shei",\
				"da kai hong deng",\
				"da kai lv deng",\
				"da kai lan deng",\
				"guan bi hong deng",\
				"guan bi lv deng",\
				"guan bi lan deng",\
				"chen meng die shi shei",\
				"chen xiang xin shi shei",\
				"yin liang ti gao",\
				"yin liang jiang da",\
				"guan bi suo you deng" \
		
		
																	};	
	uint8_t  pCode[DATE_A] = {
	 															CODE_LSD,	\
																CODE_SS,	\
																CODE_SS,	\
																LDE_1,   \
																LDE_2,	\
																LDE_3,		\
																LDE_1_1,   \
																LDE_2_1,	\
																LDE_3_1,		\
																chen,		\
																chen_1,		\
																voice_J_0,		\
																voice_J_1,		\
																LDE_All_OFF		\
															};	//添加识别码,用户修改
	flag = 1;
	for (k=0; k<DATE_A; k++)
	{			
		if(LD_Check_ASRBusyFlag_b2() == 0)
		{
			flag = 0;
			break;
		}

		LD_WriteReg(0xc1, pCode[k] );
		LD_WriteReg(0xc3, 0);
		LD_WriteReg(0x08, 0x04);
		LD3320_delay(1);
		LD_WriteReg(0x08, 0x00);
		LD3320_delay(1);

		for (nAsrAddLength=0; nAsrAddLength<DATE_B; nAsrAddLength++)
		{
			if (sRecog[k][nAsrAddLength] == 0)
				break;
			LD_WriteReg(0x5, sRecog[k][nAsrAddLength]);
		}
		LD_WriteReg(0xb9, nAsrAddLength);
		LD_WriteReg(0xb2, 0xff);
		LD_WriteReg(0x37, 0x04);
	}	 
	return flag;
}


用户修改
//void LD3320_main(void)
//{
//	uint8_t nAsrRes=0;
//	  
// 	printf("1、流水灯\r\n"); 
//	printf("2、闪烁\r\n"); 				
//	printf("3、按键触发\r\n"); 		
//	printf("4、全灭\r\n"); 			
//	printf("5、状态\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识别结果										 
//					 printf("\r\n识别码:%d", nAsrRes);			 		
//								
//					 switch(nAsrRes)		   			//对结果执行相关操作,客户修改
//						{
//							case CODE_LSD:					//命令“流水灯”
//							{
//									printf(" 流水灯 指令识别成功\r\n"); 
//							    SYN6288_Speech(DEBUG_USARTx,"现在展示流水灯");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
//									Delay_ms(500);
//															 break;
//							}
//							case CODE_SS:	 					//命令“闪烁”
//							{
//								printf(" 闪烁 指令识别成功\r\n"); 
//								 SYN6288_Speech(DEBUG_USARTx,"现在展示闪烁");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
//									Delay_ms(500);
//															 break;
//							}
//							case CODE_AJCF:					//命令“按键触发”
//							{
//								printf(" 按键触发 指令识别成功\r\n"); 
//								 SYN6288_Speech(DEBUG_USARTx,"按键触发");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
//									Delay_ms(500);
//															break;
//							}
//							
//							case CODE_QM:						//命令“全灭”
//							{
//								printf(" 全灭 指令识别成功\r\n");
//								 SYN6288_Speech(DEBUG_USARTx,"全灭 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
//									Delay_ms(500);
//															break;
//							}
//							case CODE_ZT:						//命令“状态”
//							{
//								printf(" 状态 指令识别成功\r\n");
//								 SYN6288_Speech(DEBUG_USARTx,"状态 指令识别成功");  /*播放声音,播放声音时候LED会灭掉,就是BY接口用来检测是否繁忙的*/
//									Delay_ms(500);
//							}							
//							default:break;
//						}	
//					nAsrStatus = LD_ASR_NONE;
//					break;
//			case LD_ASR_FOUNDZERO:
//			default:
//					nAsrStatus = LD_ASR_NONE;
//					break;
//			}//switch
//		//开发板测试
//		Board_text(nAsrRes );
//	}// while
//}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32传感器外设集--语音识别模块(LD3320) 的相关文章

  • SH367309芯片

    博主 主要纪录自己常用的几种模式 以及自己觉得需要注意的点 具体的请看数据手册 且大部分都是从数据手册中截取 1 烧写模式 VPRO管脚外接EEPROM烧写电压V PRO 且延时10mS SH367309进入烧写模式 关闭充放电MOSFET
  • 高速风筒方案中的共膜电感--【其利天下技术】

    我们知道 高速吹风筒的电源采用的是日常我们用的市电 市电是高压交流电源 所以高压电路的噪声是比较大的 为了使产品符合安规要求 我们的电路设计必须要符合安规设计 所以这也是高速吹风筒为什么要加安规电容和共模电感的主要原因 那么什么是共膜电感呢
  • 嵌入式培训机构到底怎么选?培训了能找到工作吗

    嵌入式作为一种广泛应用于企业级开发的编程语言 对于想要从事软件开发行业的人来说 掌握嵌入式技能是非常重要的 而参加嵌入式培训机构是一个快速提升技能的途径 然而 很多人可能会担心 参加嵌入式培训了能找到工作吗 如何选择靠谱的嵌入式培训机构 要
  • 【Proteus仿真】【Arduino单片机】光照强度检测系统

    文章目录 一 功能简介 二 软件设计 三 实验现象 联系作者 一 功能简介 本项目使用Proteus8仿真Arduino单片机控制器 使共阳数码管 ADC模块 光敏传感器等 主要功能 系统运行后 数码管显示光传感器采集光照强度值 范围0 1
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • allegro画PCB如何更新元件的PCB封装

    allegro画PCB如何更新元件的PCB封装 一 更新单个器件的PCB封装 首先菜单栏选择Place gt Update Symbols 如下图 注意此案例是更新了C0805封装 中更新封装 就将上图第二个红色方框中的勾选即可 二 更新某
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 普冉32位单片机 PY32C642,M0+内核,1.7 V ~ 5.5 V宽工作电压

    PY32C642 单片机采用高性能的 32 位 ARM Cortex M0 内核 宽电压工作范围 嵌入 24Kbytes Flash 和 3 Kbytes SRAM 存储器 最高工作频率 24 MHz 包含多种不同封装类型产品 工作温度范围
  • Freertos低功耗管理

    空闲任务中的低功耗Tickless处理 在整个系统运行得过程中 其中大部分时间都是在执行空闲任务的 空闲任务之所以执行 因为在系统中的其他任务处于阻塞或者被挂起时才会执行 因此可以将空闲任务的执行时间转换成低功耗模式 在其他任务解除阻塞而准
  • 库函数点亮Led

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 例如 随着人工智能的不断发展 机器学习这门
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 通过JTAG恢复STM32 MCU磨掉的标记

    我有一块可能带有 STM32 MCU 的板 我想为该板制作定制固件 因为库存板有很多问题 不幸的是 电路板制造商很友善地磨掉了所有标记 有没有办法通过 jtag 获取设备 系列 ID 并将其交叉引用到型号 我能找到的一切都是关于获取芯片的唯
  • PWM DMA 到整个 GPIO

    我有一个 STM32F4 我想对一个已与掩码进行 或 运算的 GPIO 端口进行 PWM 处理 所以 也许我们想要 PWM0b00100010一段时间为 200khz 但随后 10khz 后 我们现在想要 PWM0b00010001 然后
  • 在 Contiki 程序中使用 malloc

    考虑以下 Contiki 程序 include
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • DX杂记之细分着色器和利用贝塞尔曲面平滑模型

    细分着色器的构成 细分着色器是为了将一大块的区域继续划分 划分成很多的小块 大体上由三部分构成 但也会涉及一些其它阶段的内容 这三个阶段分别为 Hull Shader Stage Tesslator Stage Domain Shader
  • Day3: 前端路由(基础篇)

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 主要面向群体 前端开发工程师 初 中 高级 应届 转行 培训等同学 Day3 今日话题 想必大家经常会在面试中或者工作生活中听到 前端路由 相关的问题或者
  • Training a deep autoencoder or a classifier on MNIST digits_Rbm训练(Matlab)

    这是第一次阅读matlab版的RBM程序所做的笔记 其中有好多没有理解的地方 希望能跟各位博友一起学习 一起研究 一起讨论 共同进步 一 Rbm阅读材料 http en wikipedia org wiki Restricted Boltz
  • statsmodels 0.10.0中文文档

    为什么翻译 本人会计出身 转行数据分析 更多是用excel sql spss等工具 30岁开始入坑python 在学习statsmodels包的过程中 在知乎 百度 CSDN和github上均没有找到statsmodels的中文文档 一开始
  • 自然图像目标检测数据集汇总

    参考 自然图像目标检测数据集汇总 云 社区 腾讯云 目录 一 PASCAL VOC 1 Challenge and tasks 2 Dataset 3 Detection Ground Truth 4 Evaluation 二 ImageN
  • 测试离线音频转文本模型Whisper.net的基本用法

    微信公众号 dotNET跨平台 中的文章 OpenAI的离线音频转文本模型Whisper的 NET封装项目 介绍了基于 net封装的开源语音辨识Whisper神经网络项目Whisper net 其GitHub地址见参考文献2 本文基于Whi
  • springMvc 自定义注解以及自定义异常处理

    上一篇写到自定义错误处理 那么有这么个需求 如果每个模块需要错误处理页面不同 那么上面一篇写死为error jsp就不合理了 所以就需要我们想跳哪个错误页面就哪个页面 这样就灵活多了 我采用自定义注解的方式了指定我们需求跳转的错误页面 具体
  • 菜鸡刷题-1

    很久不刷题了 再次刷题手太生了 痛定思痛 还是继续刷吧 立帖为证 天天坚持 217 存在重复元素 给定一个整数数组 判断是否存在重复元素 如果存在一值在数组中出现至少两次 函数返回 true 如果数组中每个元素都不相同 则返回 false
  • 目标检测详解

    文章目录 前言 一 基本概念 目标检测的思路 边界框 锚框 交并比 loU 标注锚框 在训练数据中标注锚框 将真实边界框分配给锚框 标记类别和偏移量 使用非极大值抑制预测边界框 二 模型介绍 两阶段 R CNN Fast R CNN Fas
  • Spring Boot如何让自己的bean优先加载

    背景介绍 在一些需求中 可能存在某些场景 比如先加载自己的bean 然后自己的bean做一些DB操作 初始化配置问题 然后后面的bean基于这个配置文件 继续做其他的业务逻辑 因此有了本文的这个题目 实现方法 DependsOn注解 这个
  • word交叉引用——在正文中给参考文献做链接

    word交叉引用只需两步即可 3分钟即会 第一步 插入编号 文档中有如下参考文献 但还没有 1 2 3 等编号 那么先给参考文献编号序号 使用word gt 开始 gt 编号 接下来给参考文献标好序号 光标选到某参考文献前 点编号即可自动编
  • opencv-python实现去雾操作

    通过仿真自动色阶算法 发现其去雾效果十分明显 并且速度快于暗通道算法 python实现 python3 6 import numpy as np import cv2 def ComputeHist img h w img shape hi
  • LINUX下编译c++11的代码

    C 11 即ISO IEC 14882 2011 是目前的C 编程语言的最新正式标准 它取代了第二版标准 第一版公开于1998年 第二版于2003年更新 分别通称C 98以及C 03 两者差异很小 新的标准包含核心语言的新机能 而且扩展C
  • Ubuntu 18 系统中对openssl进安降级安装方法总结

    1 下载openssl 下载链接 https www openssl org source snapshot 里边是当前仍支持版本的快照 同版本不同日期内容可能不同的 所以下载一般下对应版本的最新快照 安装出错则尝试另一个快照 解压后的文件
  • qt中的菜单栏的隐藏功能

    有时候为了能让菜单栏中的部分功能进行隐藏 我们就需要在构造函数中进行操作 一般的控件隐藏可以直接hide 就行 然后菜单栏中的部分功能进行隐藏 就需要ui gt 菜单栏名称 gt menuAction gt setVisible false
  • 5G NR 网络切片是什么意思

    网络切片可以理解为支持特定使用场景或商业模式的通信服务要求的一组逻辑网络功能的集合 是基于物理基础设施对服务的实现 这些逻辑网络功能可以看作是由EPC下的网络功能 NetworkFuncTIon 分解而来的一系列子功能 Networksub
  • 线性代数—学习笔记

    对分类超平面方程
  • ubutun安装停留在界面

    这几天都在折腾 都在出问题记录一下 ubuntu安装时停留在界面 怎么办解决方法 重新开机 光标选中 Install Ubuntu 按 e 进入grub界面 将倒数第二行中的 quiet splash 改为 nomodeset F10保存
  • 比例谐振(PR)控制器的学习过程记录

    目录 0 前言 1 PR控制器和PI控制器对比 1 1 传递函数表达式对比 1 2 波特图对比 2 离散化预备知识 2 1 离散化表达式 2 2 离散化方法 2 3 离散化练习题 3 使用Matlab离散PR控制器 4 逆变器仿真模型中使用
  • STM32传感器外设集--语音识别模块(LD3320)

    目录 本节主要贴上以前写的语音识别外设LD3320 希望对大家有用 本人已经测试过有用 如何使用 将下面这段函数添加到功能函数中 LD3320 h LD3320 c 本节主要贴上以前写的语音识别外设LD3320 希望对大家有用 本人已经测试