国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee
ELEOK
標題:
基于STM32的LD3320語音識別程序源碼
[打印本頁]
作者:
coolice
時間:
2021-8-14 01:17
標題:
基于STM32的LD3320語音識別程序源碼
1、STM32的用戶 可以直接 在工程里面 添加如下4個文件1》LD3320_main.c 2》LDChip.c 3》Reg_RW.c 4》delay.c
2、51單片機的用戶同時可以根據以上操作來做相關的修改。
162311mvvsfppvtowops3w.png
(35.4 KB)
下載附件
2021-8-14 01:11 上傳
所有語音識別程序源代碼下載:
基于STM32 的 LD3320基本驅動程序.zip
(59.24 KB, 售價: 2 E幣)
2021-8-14 01:16 上傳
點擊文件名下載附件
售價: 2 E幣
[記錄]
[
購買
]
部分源碼:
************************************************************************************/
// 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;
#define DEMO_SOUND_SIZE 1235
void LD3320_Init(void);
uint8 RunASR(void);
void ProcessInt0(void);
void LD3320_EXTI_Cfg(void);
void LD3320_NVIC_Cfg(void);
u8 ld3320_exti=0; //中斷標志信號,為1是代表中斷產生。以下采用查詢方式。
/************************************************************************************/
// 這個示范程序是基于STC10L08XE編譯的完整地,可以執行的程序
// 實現了從數組中播放的功能
//
// verygood_withHead.mp3(verygood_withoutHead)是一段MP3格式的聲音文件,播放內容為英文單詞"very good"
// demosound.h 中定義了數組 bpDemoSound[],
// 數組的內容就是 verygood_withHead.mp3(verygood_withoutHead)文件的內容
// 用戶可以用16進制閱讀器(比如 UltraEdit )打開verygood_withHead.mp3文件和 bpDemoSound 數組相對照
//
// 關于兩個MP3文件的差異:
// 這兩個MP3文件只差有沒有ID3文件頭,MP3的數據都是一樣的,
// ID3文件頭傳入LD芯片與否不影響播放
// 用Windows自帶的MediaPlayer播放沒有ID3頭的vertygood_withoutHead.mp3 后,會自動加上ID3文件頭
// PlayDemoSound_Once/PlayDemoSound_Continue 函數就是把 bpDemoSound數組中的數據依次傳入LD3320芯片進行播放
//
// 與LD3320芯片有關的函數功能,都在"開發手冊.pdf"中有詳細說明
// 請開發者對照"開發手冊.pdf“閱讀
//
// 開發者在學習LD3320開始時,可以直接把在這個main函數拷貝到自己單片機中編譯運行
//
// 當然,用戶要根據自己實際的單片機去修改 mcu_init ,以及對應的管腳連接的定義,中斷定義
/************************************************************************************/
void LD3320_main(void)
{
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:
LD_GetResult(); // 一次ASR識別流程結束,去取ASR識別結果
nAsrStatus = LD_ASR_NONE;
break;
case LD_ASR_FOUNDZERO:
default:
nAsrStatus = LD_ASR_NONE;
break;
}
if(ld3320_exti !=0) { /*采用查詢方式進入中斷處理*/
ld3320_exti =0;
ProcessInt0();
}
OSTimeDlyHMSM(0,0,0,50);
}// while
}
/************************************************************************
功能描述:
調用函數:
入口參數:
返回函數:
**************************************************************************/
void LD3320_Init(void)
{
LD3320_GPIO_config();
LD3320_EXTI_Cfg();
LD3320_NVIC_Cfg();
LD_reset();
}
/************************************************************************
功能描述:
調用函數:
入口參數:
返回函數:
**************************************************************************/
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_us(120);
}
}
}
/*********************************************************************
//為了消除編譯時的 警告 *** WARNING L15: MULTIPLE CALL TO SEGMENT
//把在中斷函數中需要調用的函數重新復制并命名
//消除警告 Warning L15,并且避免由于函數重入可能帶來的隱藏Bug
*********************************************************************/
void LD3320_delay_2(unsigned long uldata)
{
unsigned int j = 0;
unsigned int g = 0;
for (j=0;j<5;j++)
{
for (g=0;g<uldata;g++)
{
delay_us(120);
}
}
}
/************************************************************************************/
// RunASR()函數實現了一次完整的ASR語音識別流程
// LD_AsrStart() 函數實現了ASR初始化
// LD_AsrAddFixed() 函數實現了添加關鍵詞語到LD3320芯片中
// LD_AsrRun() 函數啟動了一次ASR語音識別流程
//
// 任何一次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;
}
/************************************************************************
功能描述: STM32 嵌套中斷配置
調用函數:
入口參數:
返回函數:
**************************************************************************/
void LD3320_NVIC_Cfg(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/************************************************************************
功能描述: STM32 外部中斷和 IO口配置,利用外部中斷線1
調用函數:
入口參數:
返回函數:
**************************************************************************/
void LD3320_EXTI_Cfg(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource1);
EXTI_InitStructure.EXTI_Line = EXTI_Line1;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
EXTI_GenerateSWInterrupt(EXTI_Line1);
GPIO_SetBits(GPIOD,GPIO_Pin_1);
}
/*******************************************************************************
* Function Name : EXTI1_IRQHandler
* Description : This function handles External interrupt Line 1 request.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void EXTI1_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line1)!= RESET )
{
ld3320_exti=1;//進入中斷標志 LD3320
EXTI_ClearFlag(EXTI_Line1);
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
復制代碼
歡迎光臨 ELEOK (http://m.afoofa.cn/)
Powered by Discuz! X5.0