久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
LD3320的STM32測試源代碼
[打印本頁]
作者:
xiaojiabo
時間:
2018-8-20 02:41
標題:
LD3320的STM32測試源代碼
這是LD3320的測試代碼
單片機源程序如下:
#include "LD3320.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;
uint8 nLD_Mode = LD_MODE_IDLE;//用來記錄當前是在進行ASR識別還是在播放MP3
uint8 ucRegVal;
///用戶修改
void LD3320_main(void)
{
uint8 nAsrRes=0;
LD3320_init();
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");
break;
case CODE_SS: //命令“閃爍”
printf(" 閃爍 指令識別成功\r\n");
break;
case CODE_AJCF: //命令“按鍵觸發”
printf(" 按鍵觸發 指令識別成功\r\n");
break;
case CODE_QM: //命令“全滅”
printf(" 全滅 指令識別成功\r\n");
break;
case CODE_JT: //命令“狀態”
printf(" 狀態 指令識別成功\r\n");
default:break;
}
nAsrStatus = LD_ASR_NONE;
break;
case LD_ASR_FOUNDZERO:
default:
nAsrStatus = LD_ASR_NONE;
break;
}//switch
//開發板測試
Board_text(nAsrRes );
}// while
}
static uint8 LD_AsrAddFixed(void)
{
uint8 k, flag;
uint8 nAsrAddLength;
#define DATE_A 5 //數組二維數值
#define DATE_B 20 //數組一維數值
//添加關鍵詞,用戶修改
uint8 sRecog[DATE_A][DATE_B] = {
"liu shui deng",\
"shan shuo",\
"an jian chu fa",\
"quan mie",\
"zhuang tai"\
};
uint8 pCode[DATE_A] = {
CODE_LSD, \
CODE_SS, \
CODE_AJCF,\
CODE_QM, \
CODE_JT \
}; //添加識別碼,用戶修改
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;
}
static void Board_text(uint8 Code_Val)
{
switch(Code_Val) //對結果執行相關操作
{
case CODE_LSD: //命令“流水燈”
Glide_LED();
break;
case CODE_SS: //命令“閃爍”
Flicker_LED();
break;
case CODE_AJCF: //命令“按鍵觸發”
Key_LED();
break;
case CODE_QM: //命令“全滅”
Off_LED();
break;
case CODE_JT: //命令“狀態”
Jt_LED();
break;
default:break;
}
}
static void Delayms(uint16 i)
{
unsigned char a,b;
for(;i>0;i--)
for(b=4;b>0;b--)
for(a=113;a>0;a--);
}
static void Glide_LED(void)
{
LED1_ON();
Delayms(0xfff);
LED2_ON();
Delayms(0xfff);
LED3_ON();
Delayms(0xfff);
LED4_ON();
Delayms(0xfff);
LED1_OFF();
Delayms(0xfff);
LED2_OFF();
Delayms(0xfff);
LED3_OFF();
Delayms(0xfff);
LED4_OFF();
Delayms(0xfff);
}
static void Flicker_LED(void)
{
LED1_ON();
LED2_ON();
Delayms(0XFFF);
LED1_OFF();
LED2_OFF();
Delayms(0XFFF);
}
static void Key_LED(void)
{
LED3_ON();
Delayms(0XFFF);
LED3_OFF();
Delayms(0XFFF);
}
static void Off_LED(void)
{
LED1_OFF();
LED2_OFF();
LED3_OFF();
LED4_OFF();
}
static void Jt_LED(void)
{
LED4_ON();
Delayms(0XFFF);
LED4_OFF();
Delayms(0XFFF);
}
///用戶修改 end
///相關初始化
static void LD3320_init(void)
{
LD3320_GPIO_Cfg();
LD3320_EXTI_Cfg();
LD3320_SPI_cfg();
LED_GPIO_cfg();
LD_reset();
}
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);
}
static 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();
}
///相關初始化 end
///中間層
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(LD3320IRQEXITLINE)!= RESET )
{
ProcessInt();
printf("進入中斷12\r\n");
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--);
}
}
}
static 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;
}
static void LD_reset(void)
{
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);
}
static void LD_AsrStart(void)
{
LD_Init_ASR();
}
uint8 LD_Check_ASRBusyFlag_b2(void)
{
uint8 j;
uint8 flag = 0;
for (j=0; j<10; j++)
{
if (LD_ReadReg(0xb2) == 0x21)
{
flag = 1;
break;
}
LD3320_delay(10);
}
return flag;
}
///中間層end
///寄存器操作
static uint8 spi_send_byte(uint8 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);
}
static void LD_WriteReg(uint8 data1,uint8 data2)
{
LD_CS_L();
LD_SPIS_L();
spi_send_byte(0x04);
spi_send_byte(data1);
spi_send_byte(data2);
LD_CS_H();
}
static uint8 LD_ReadReg(uint8 reg_add)
{
uint8 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);
}
static uint8 LD_GetResult(void)
{
return LD_ReadReg(0xc5);
}
static uint8 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;
}
static void ProcessInt(void)
{
uint8 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
}
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
UNV-LD3320 基本識別工程-STM32F103ZET6.rar
(306.4 KB, 下載次數: 38)
2018-8-20 17:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
xiaojiabo
時間:
2018-8-20 02:44
這是STM32F103ZET6的代碼
作者:
burgundy
時間:
2019-4-12 12:30
請問stm32和ld3320怎么接線?
歡迎光臨 (http://m.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
日韩av不卡在线
|
免费黄网站在线观看
|
日韩毛片在线播放
|
日韩免费一区二区
|
一级片aa
|
加勒比综合
|
国内精品在线播放
|
国产精品成人国产乱一区
|
亚洲精品在线视频观看
|
亚洲成人一区二区
|
日韩福利在线观看
|
成人免费视频一区二区
|
在线免费观看日韩av
|
免费一级大片
|
91久久久久久久久久
|
国产一级黄色
|
黄片毛片在线观看
|
成人免费网站黄
|
欧美日韩亚洲一区二区
|
欧洲精品一区二区三区
|
91成人精品一区在线播放
|
成人免费视频播放
|
99精品色
|
一区二区三区亚洲
|
国产又粗又猛视频免费
|
久久精品一区二区三区四区五区
|
日日夜夜天天
|
一区二区三区在线免费
|
日韩中文字幕在线观看
|
日韩欧美国产一区二区三区
|
亚洲黄色av
|
黄视频网站在线观看
|
久久免费国产视频
|
欧美日韩精品久久久免费观看
|
天天躁日日躁狠狠很躁
|
久久久综合网
|
国产成人精品三级麻豆
|
国产免费一级
|
日本特黄特色aaa大片免费
|
亚洲视频免费
|
日韩伦理一区二区
|