田海龍 遲耀丹 姜旭東



【摘要】本文提出了一種基于嵌入式的指紋識別系統的體系架構,由內置DSP運算單元的AS608指紋芯片作為檢測模塊,通過串口實現和嵌入式之間的通信,嵌入式接受處理后實現指紋識別的功能。
【關鍵詞】指紋識別 嵌入式 串口 AS608
隨著科技的蓬勃發展,人們越來越重視自己的個人隱私,由此個人身份識別的需求日益增加。由于指紋擁有獨特的不變性,使得指紋識別技術與傳統的身份識別方法相比起來,更加的安全和可操作,所以基于傳統的身份識別技術的不足可以被克服,指紋識別日益被認可。指紋識別歷來通常在PC平臺上運行,但隨著現代社會的高速發展,指紋識別系統的需求不斷提升,同時市場對便攜性和易用性的要求更加走高,指紋產品正在朝著嵌入式技術的發展方向。
一、系統結構概述
本系統由指紋識別部分和指紋處理部分組成,他們之間通過串口通信,指紋識別芯片使用AS608,通過搭建設計出具有采集指紋的功能,并引出8條引腳,分別為電源正輸入端,串行數據輸出端,串行數據輸入端,信號地,感應信號輸出端,觸摸感應電源輸入端USB D+和USB D-端,指紋處理部分由32位單片機處理,通過串口和采集端通信。
二、指紋采集部分
系統內設有一個72K字節的圖像緩沖區和兩個512Bytes大小的特征文件緩沖區,通過指令可以讀寫任意一個緩沖區,通過串口上傳或下載圖像時為了加快速度,只用到像素字節的高4位,即將兩個像素合成一個字節傳送。系統內部集成了硬件32位隨機數生成器,可以通過指令讓其產生一個隨機數給上位機。指紋采集端和MCU通訊的數據按一定的格式打包,指令格式分為3種,命令包格式,數據包格式和結束包格式,數據包的格式如下表1。
數據包不是單獨發送和接收,必須在發送指令包之后或接收了應答包的后面。包長度等于包長度至校驗和(指令、參數或數據)的總字節數,包含校驗和,但不包含包長度本身的字節數。校驗和是從包標識至校驗和之間所有字節之和。模塊地址在沒有生成之前為缺省的OxFFFFFFFF,一旦上位機通過指令生成了模塊地址,則所有的數據包都必須按照生成的地址收發。模塊將拒絕地址錯誤的數據包。
應答是將有關命令執行情況與結果上報給上位機,應答包含有參數,并可跟后續數據包。上位機只有在收到模塊的應答包后才能確認模塊收包情況與指令執行情況。模塊應答包中包含一個參數即確認碼,確認碼表示執行指令完畢的情況,模塊應答格式如表2所示。
三、串口通信部分
在STM32中串口被描述成通用同步異步收發器(USART),它提供了一種靈活的方法與使用工業標準NRZ異步串行數據格式的外部設備之間進行全雙工數據交換。USART利用分數波特率發生器提供寬范圍的波特率選擇。它支持同步單向通信和半雙工單線通信,也支持LIN(局部互聯網),智能卡協議和IrDA(紅外數據組織)SIR?ENDEC規范,以及調制解調器(CTS/RTS)操作。它還允許多處理器通信。還可以使用DMA方式,實現高速數據通信。
USART通過3個引腳與其他設備連接在一起,任何USART雙向通信至少需要2個引腳,接受數據輸入(RX)和發送數據輸出(TX),RX是接受數據串行輸入,通過過采樣技術來區別數據和噪音,從而恢復數據;TX是發送數據輸出,當發送器被禁止時,輸出引腳恢復到它的I/O端口配置。當發送器被激活,并且不發送數據時,TX引腳處處于高電平。在單線和智能卡模式里,此I/O口被同時用于數據的發送和接收。
圖1中的源碼實例是串口的初始化和中斷的初始化USART_InitStructure表示將結構體設置為缺省狀態,USART_BaudRate=115200:代表波特率設置為115200,USART_InitStructure.USART_wordLength=USART_WordLength_8b:表示在幀結尾傳輸1個停止位,USART_InitStructure.USART_StopBits表示奇偶失能模式,無奇偶校驗。
四、嵌入式控制部分
硬件電路的搭建如同房子的地基一樣重要,它將直接影響到讀寫器的性能。硬件電路的核心是主控芯片有著無可替代的作用,因此選擇一款合適的主控芯片至關重要。為了設計一款功耗低、體積小、有巨大的信息容量、數據處理能力強、測量精度高,本文選用STM32芯片作為主控芯片,并在此基礎上設計指紋識別系統。STM32是32位的單片機,集成嵌入式Flash和SRAM存儲器的ARMCortex-M3內核。和8/16位設備相比,ARM Cortex-M3 32位RISC處理器提供了更高的代碼效率。STM32F103xx微控制器帶有一個嵌入式的APM核,所以可以兼容所有的APM工具和軟件。首先,是讀AS608模塊觸摸感應狀態引腳,初始化函數為void PS_StaGPio_Init(void)。因為當感應到的時候是輸出高電平,所以狀態引腳(PA6)配置為下拉輸入模式。往下就是配置串口發送指令的包頭、指令碼、校驗和之類。第二個函數static u8*JudgeStr(u16 waittime),里面調用了