本文章是基于野火指南者F103板載LCD屏的控制,如有不妥之處,歡迎指正交流!
基于STM32F1系列和LDV5語言模塊的語音控制LCD螢屏的點亮
- 前言
- 一、STM32外部中斷EXTI
- 1.什么是外部中斷EXTI
- a.例外(中斷)型別
- b.EXTI簡介
- c.EXTI功能框圖
- 2.NVIC簡介
- 3.初始化外部中斷EXTI
- a.EXTI初始化結構體
- b.采用宏定義的方法定義EXTI的埠
- c.初始化EXTI函式
- d.嵌套向量中斷控制器 NVIC 配置
- 二、LDV5語音模塊
- 1.簡介
- 2.系統內部呼叫檔案介紹(不可洗掉、改名)
- a.主選單檔案——Fyydz.ini
- b.系統引陣列態檔——parameter.ini
- c.系統提示音頻mp3檔案
- 三、語音控制LCD屏點亮
- 1.連線
- 2.中斷程式(LCD屏)
- a.配置LCD背光控制管腳BK
- b.ILI9341背光LED控制函式
- c.ILI9341初始化函式(背光控制不使能)
- d.EXTI中斷函式(使能背光)
- 總結與改進
前言
本文章先簡單介紹STM32外部中斷EXTI原理及初始化以及LDV5語音模塊,再利用外部中斷EXTI控制野火指南針F103板載RGB燈的亮滅,最后將其推廣至LCD屏上,實作語音點亮LCD螢屏的預期,
一、STM32外部中斷EXTI
1.什么是外部中斷EXTI
a.例外(中斷)型別
F103 在內核水平上搭載了一個例外回應系統, 支持為數眾多的系統例外和外部中斷,其中系統例外有 8 個(如果把 Reset 和 HardFault 也算上的話就是 10 個),外部中斷有 60個,除了個別例外的優先級被定死外,其它例外的優先級都是可編程的,有關具體的系統例外和外部中斷可在標準庫檔案stm32f10x.h 這個頭檔案查詢到,在 IRQn_Type 這個結構體里面包含了 F103 系列全部的例外宣告,
b.EXTI簡介
EXTI(External interrupt/event controller)—外部中斷/事件控制器,管理了控制器的 20個中斷/事件線,每個中斷/事件線都對應有一個邊沿檢測器,可以實作輸入信號的上升沿檢測和下降沿的檢測,EXTI 可以實作對每個中斷/事件線進行單獨配置,可以單獨配置為中斷或者事件,以及觸發事件的屬性,
c.EXTI功能框圖

2.NVIC簡介
NVIC 是嵌套向量中斷控制器,控制著整個芯片中斷相關的功能,它跟內核緊密耦合,是內核里面的一個外設,
以下為NVIC 結構體定義,來自韌體庫頭檔案:core_cm3.h
/** @addtogroup CMSIS_CM3_NVIC CMSIS CM3 NVIC
memory mapped structure for Nested Vectored Interrupt Controller (NVIC)
@{
*/
typedef struct
{
__IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable Register 中斷使能暫存器 */
uint32_t RESERVED0[24];
__IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable Register 中斷清除暫存器 */
uint32_t RSERVED1[24];
__IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending Register 中斷使能懸起暫存器 */
uint32_t RESERVED2[24];
__IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending Register 中斷清除懸起暫存器 */
uint32_t RESERVED3[24];
__IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit Register 中斷有效位暫存器 */
uint32_t RESERVED4[56];
__IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register (8Bit wide) 中斷優先級暫存器*/
uint32_t RESERVED5[644];
__O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt Register 軟體觸發中斷暫存器 */
} NVIC_Type;
/*@}*/ /* end of group CMSIS_CM3_NVIC */
在配置中斷的時候我們一般只用 ISER、ICER 和 IP 這三個暫存器,ISER 用來使能中斷,ICER 用來失能中斷,IP 用來設定中斷優先級,
3.初始化外部中斷EXTI
a.EXTI初始化結構體
typedef struct
{
uint32_t EXTI_Line; /*!< Specifies the EXTI lines to be enabled or disabled.
This parameter can be any combination of @ref EXTI_Lines */
EXTIMode_TypeDef EXTI_Mode; /*!< Specifies the mode for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
EXTITrigger_TypeDef EXTI_Trigger; /*!< Specifies the trigger signal active edge for the EXTI lines.
This parameter can be a value of @ref EXTIMode_TypeDef */
FunctionalState EXTI_LineCmd; /*!< Specifies the new state of the selected EXTI lines.
This parameter can be set either to ENABLE or DISABLE */
}EXTI_InitTypeDef;
- EXTI_Line:EXTI 中斷/事件線選擇,可選 EXTI0 至 EXTI19,
- EXTI_Mode:EXTI 模式選擇,可選為產生中斷(EXTI_Mode_Interrupt)或者產生事件(EXTI_Mode_Event),
- EXTI_Trigger:EXTI 邊沿觸發事件,可選上升沿觸發(EXTI_Trigger_Rising)、下降沿觸發 ( EXTI_Trigger_Falling) 或者上升沿和下降沿都觸發( EXTI_Trigger_Rising_Falling),
- EXTI_LineCmd:控制是否使能 EXTI 線,可選使能 EXTI 線(ENABLE)或禁用(DISABLE),
b.采用宏定義的方法定義EXTI的埠
以下為bsp_exti.h檔案,定義GPIO埠、埠時鐘以及連接到SCL時鐘線的GPIO,
#ifndef __BSP_EXTI_H
#define __BSP_EXTI_H
#include "stm32f10x.h"
#define INT_GPIO_PORT GPIOD /* GPIO埠 */
#define INT_GPIO_CLK RCC_APB2Periph_GPIOD /* GPIO埠時鐘 */
#define INT_GPIO_PIN GPIO_Pin_2 /* 連接到SCL時鐘線的GPIO */
void EXIT_Int_Config(void);
#endif /* __BSP_EXTI_H */
c.初始化EXTI函式
void EXIT_Int_Config(void)
{
//初始化結構體
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//配置中斷優先級
EXTI_NVIC_Config();
// 初始化GPIO
RCC_APB2PeriphClockCmd( INT_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = INT_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(INT_GPIO_PORT, &GPIO_InitStructure);
// 初始化EXTI
RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
d.嵌套向量中斷控制器 NVIC 配置
static void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
二、LDV5語音模塊
1.簡介

將語音模塊用USB線連接至電腦后,會播報開機語音,模塊三個按鍵從左向右分別是U盤按鍵、復位按鍵、觸發按鍵,U盤按鍵按下后,電腦將讀取語音模塊中插入的TF卡中的檔案,如果我們需要更改語音模塊程式,則需要更給該TF卡中的特定檔案內容;復位按鍵按下后,語音模塊將進行復位;觸發按鍵需要配合語音模塊的模式來使用,可作為觸發條件之一,
語音模塊預留了8個I/O口,可以控制I/O口的高低電平變化(高電平為3.3V),從而實作進一步操作,同時,在語音模塊右下方還有串口通信埠,可以連接單片機的串口進行通信,
注意:RXD、TXD需要交叉連線;與單片機連接時,需要共地,
2.系統內部呼叫檔案介紹(不可洗掉、改名)
插入語音模塊的TF卡中含有以下幾個檔案為系統內部呼叫檔案,不可洗掉和改名,
a.主選單檔案——Fyydz.ini

(1)每一行的開頭數字,為選單檔案序號,
序號 0 為“口令關鍵詞”,即在口令模式下所喊的名字,這個名字必須要存放在序號 0 處,其他意思和普通關鍵詞一樣,
序號1-88為“普通關鍵詞”,其中序號1-32可以控制I/O口高低電平的變化,模塊上預留了 PA0-PA7 這 8 個 IO 口,用戶只需要簡單設定 TF 卡中的選單檔案對應的序號即可對 IO 口進行利用,每個埠具備高電平、低電平、高電平 0.5s 點動、高電平 1s 點動功能,
序號 89 為“退出關鍵詞”,即我們可以通過這句話來讓系統退回到主選單或者退出運行,例如我們在二級選單,可以加入 89 序號這個名字來讓他跳出二級選單回到主選單繼續待命,或者在口令模式下識別口令后,不行再操作了,就可以用這個命令來停止繼續操作, 這個 89 序號的關鍵詞可以自行定義修改,和其他普通關鍵詞一樣撰寫,
序號 90-99 一共 10 個序號,這寫序號是進入二級選單的序號,它的關鍵詞可以自行定義修改,和其他普通關鍵詞一樣撰寫,例如識別到需要 90 這條關鍵詞后,系統會自動進入 T90.txt 的二級選單文本中,這是只有這個文本的關鍵詞才能識別,原主選單關鍵詞已經不能識別,系統只在當前 T90.TXT 選單文本中作業,當然我們可以說出 89 序號命令回到主選單,或者去其他 91-99 選單,只要說出對應序號的命令,同時注意 TF 卡中要有對應的檔案存在,
(2)每一行中間為串口除錯資訊,
串口除錯資訊為15個十六進制的陣列成,從左向右讀取,若連續出現3個FF,則說明資料終止,則串口資料為三個連續FF前的所有資料,通過模塊上的串口通信埠輸出,
(3)每一行的最后為觸發條件和音頻回應
最后的部分為此行命令的觸發條件,當喚醒語音模塊后,識別到觸發條件后,將執行此行命令,觸發條件為拼音,如“打開螢屏”則為“da kai ping mu”,后面加上.mp3檔案,為觸發后的音頻回應,注意,此mp3檔案需要在TF卡中存在,


b.系統引陣列態檔——parameter.ini

1、 波特率
波特率是針對串口通信功能的一個通信速度引數調整,引數值如下:
1------4800bps
2------9600bps
3------19200bps
4------57600bps
5------115200bps
以上不同序號代表不同波特率值,默認為 9600bps,
2、 音量
音量調整為喇叭的音量大小調整引數,具體引數如下:
引數范圍:0-15 ;0:最小音量 15:最大音量
3、 麥克風靈敏度
麥克風靈敏度即識別距離、識別率的調整,正常情況下我們不做任何調整,感興趣可以調整測驗,但效果不一定能改善,具體引數如下:
引數范圍:1-99
1:最低靈敏度 99:最高靈敏度
說明:靈敏度越高識別距離越遠但誤識別率越高,反之則反;
4、 識別模式
語音模塊具備3種識別模式,分別有口令模式、普通模式、
按鍵模式,不同模式對應有不同的功能,引數值如下:
引數值:0----口令模式
1----普通模式
2----按鍵模式(結合觸發按鍵使用)
口令模式:即每次識別時都需要喊出一級口令,如“小石頭”喊出一級口令后 10s 左右無發音將自動退出,如有發音可以重新恢復計時并等待,直到讓他退出或者自動到時退出,(默認用模式,有效提高抗干擾能力和實用性強)
普通模式:該模式不需要喊一級口令,直接可以喊二級口令操作,沒有延時等待和退出功能,(安靜的環境中使用,嘈雜容易產生誤觸發)
按鍵模式:按鍵模式和口令模式差不多,只在于按鍵模塊需要按按鍵,而口令模式是喊一級口令,其他都一樣,
5、 延時引數
延時引數即是在口令模式和按鍵模式中的一個延時等待功能,例如默認設定的引數為 12,那么大概延時等待時間為 10s 左右,同修改這個引數可以改變等待的時間,數值越大,等待越久,這個延時只作為一個延時時間參考,非絕對準確的時間引數,
c.系統提示音頻mp3檔案
sys_sound.mp3-----系統開機聲音(名字不能改,內容可替換)
knock.mp3----------按鍵模式,按鍵按下提示聲(同上)
exit.mp3-------------退出提示聲(同上)
三、語音控制LCD屏點亮
1.連線
依據中斷初始化,設定埠D,引腳2為中斷觸發引腳,連接語音模塊PA0,
通過語音觸發,使得語音模塊PA0埠從低電平轉化為高電平,得到上升沿電平,觸發單片機中斷,進入中斷程式(在stm32f10x_it.c檔案中),實作RGB燈的點亮或者LCD螢屏的點亮,
2.中斷程式(LCD屏)
首先在LCD屏的初始化檔案中,找到控制LCD屏背光的GPIO,以及控制LCD屏背光的函式,操作該函式,使得LCD屏背光首先不點亮(即不使能),再中斷函式中,如果進入中斷,則讓LCD屏背光點亮(即使能),
a.配置LCD背光控制管腳BK
/* 配置LCD背光控制管腳BK*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = ILI9341_BK_PIN;
GPIO_Init ( ILI9341_BK_PORT, & GPIO_InitStructure );
b.ILI9341背光LED控制函式
/**
* @brief ILI9341背光LED控制
* @param enumState :決定是否使能背光LED
* 該引數為以下值之一:
* @arg ENABLE :使能背光LED
* @arg DISABLE :禁用背光LED
* @retval 無
*/
void ILI9341_BackLed_Control ( FunctionalState enumState )
{
if ( enumState )
GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
else
GPIO_SetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
}
c.ILI9341初始化函式(背光控制不使能)
/**
* @brief ILI9341初始化函式,如果要用到lcd,一定要呼叫這個函式
* @param 無
* @retval 無
*/
void ILI9341_Init ( void )
{
ILI9341_GPIO_Config ();
ILI9341_FSMC_Config ();
ILI9341_BackLed_Control ( DISABLE );
ILI9341_Rst ();
ILI9341_REG_Config ();
//設定默認掃描方向,其中 6 模式為大部分液晶例程的默認顯示方向
ILI9341_GramScan(LCD_SCAN_MODE);
}
d.EXTI中斷函式(使能背光)
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2) != RESET)
{
GPIO_ResetBits ( ILI9341_BK_PORT, ILI9341_BK_PIN );
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
總結與改進
本方案實作了采用語音控制LCD屏的點亮,達到了人機互動的效果,整體難度不大,
方案二:可以利用語音模塊的串口通信,與stm32進行串口通信,當語音模塊送入一個hex資料到單片機,單片機接收串口資料后,做出相應的回應,也可以達到這個效果,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291739.html
標籤:其他
