目錄
一、前言
二、詳細步驟
? ? ? ? 1.光學指紋模塊
? ? ? ? 2.配置STM32CUBEMX
? ? ? ? 3.程序設計
? ? ? ? 3.1 輸出重定向
? ? ? ? 3.2 導入AS608庫? ?
????????3.3?更改端口宏定義
????????3.4?添加中斷處理部分
? ? ? ? 3.5 初始化AS608
? ? ? ? 3.6 函數總覽
? ? ? ? 3.7 錄入指紋
? ? ? ? 3.8 驗證指紋
? ? ? ? 3.9 刪除指紋
? ? ? ? 3.10 清空指紋庫
三、總結及資源
一、前言
? ? ? ? 本文將使用HAL庫進行指紋識別模塊的開發,需要注意的是,本文使用到的庫的基礎部分代碼來源于網絡,本文所使用的庫是在原庫的基礎上進行了二次開發和封裝,提高了庫的操作性和可移植性。
二、詳細步驟
? ? ? ? 1.光學指紋模塊
? ? ? ? 光學指紋模塊,使用芯片為AS608。查閱開發手冊,可知通信方式是串口通信,波特率為57600。
? ? ? ? 2.配置STM32CUBEMX
? ? ? ? 首先,配置好基礎的STM32CUBEMX工程,本文使用的是STM32F103C8T6,時鐘頻率72MHz。
? ? ? ? 配置UART3作為通信端口,UART1作為狀態輸出端口,并在代碼中輸出重定向。使能DMA和串口中斷。方法可以看這篇文章:HAL庫UART_IT_DMA
? ? ? ? 3.程序設計
? ? ? ? 3.1 輸出重定向
? ? ? ? 可以選擇在main.c文件中補全這部分代碼。
#include "stdio.h"int fputc(int c, FILE* stream)
{uint8_t ch[]={c};HAL_UART_Transmit(&huart1,ch,1,0xffff);return c;
}
? ? ? ? 3.2 導入AS608庫? ?
? ? ? ? 解壓壓縮包,包含一個頭文件和.c文件,導入到工程中,具體方法可以看這一篇文章里的導入庫部分:OLED-HAL庫開發
????????3.3?更改端口宏定義
? ? ? ? 打開as608.h文件,然后更改其中的AS608_UART宏定義為我們使用的串口。
????????3.4?添加中斷處理部分
這里有個非正規的方法,不需要寫中斷處理函數,打開stm32f1xx_it.c文件,找到對應的IRQHandler,然后將下面這段代碼復制進去(注意需要導入AS608.h)。
if(__HAL_UART_GET_FLAG(&AS608_UART,UART_FLAG_IDLE) != RESET)
{
//認為數據接收完成,進行處理
//1、清除空閑中斷
__HAL_UART_CLEAR_IDLEFLAG(&AS608_UART);//2、獲取接收大小//3、清空接收狀態AS608_UART.RxXferCount = sizeof(AS608_RX_BUF);
AS608_UART.pRxBuffPtr = AS608_RX_BUF;
AS608_RX_STA = 1;//接收數據完成
return ;
}
? ? ? ? 3.5 初始化AS608
? ? ? ? 初始化代碼:
AS608_init();
? ? ? ? 3.6 函數總覽
? ? ? ? 值得注意的是,以上提到的部分基本上是來源于網絡上已有的資料,并非我原創攥寫,我只對其進行了宏定義串口的操作,便于移植。
? ? ? ? 在其原庫的基礎上,我封裝并實現了錄入指紋、刪除指紋、查詢指紋、刪除指紋庫的函數,便于調用,具體如下圖。
? ? ? ? 3.7 錄入指紋
? ? ? ? 根據我封裝的函數,我也在頭文件最后給出了推薦的錄入代碼。其包含四步:獲取第一次指紋、獲取第二次指紋、指紋比對、生成特征碼并保存。
? ? ? ? 第一二步的返回值:成功返回1、未檢測到指紋返回-1、指紋不合格返回0
? ? ? ? 第三四步的返回值:成功返回1、失敗返回-1
? ? ? ? 其中第四步的參數是指紋ID,取值是0+
指紋錄入基本流程
printf("錄入第一次指紋");
while(AS608_Add_FR_Step_one()!=1);
printf("錄入第二次指紋");
while(AS608_Add_FR_Step_two()!=1);
while(AS608_Add_FR_Step_three()!=1);
printf("指紋對比成功");
while(AS608_Add_FR_Step_four(1)!=1);
printf("錄入成功");
? ? ? ? 3.8 驗證指紋
? ? ? ? 驗證指紋的函數為AS608_Check_FR(),其返回值分別代表:-3 代表未檢測到指紋、-2 特征碼生成失敗、-1 代表該指紋未錄入、0及以上返回的是指紋ID(代表存在于指紋庫并返回具體的指紋ID,可以保存刪除時使用)
int i=AS608_Check_FR();
printf("ID=%d",i);
if(i>=0)
{printf("指紋驗證成功");
}
? ? ? ? 3.9 刪除指紋
? ? ? ? 刪除指紋的函數是int AS608_Delete_FR(uint16_t ID),其參數是指紋ID,因此刪除前可以先讀取指紋ID,隨后刪除。?成功返回1、失敗返回0。
int i=AS608_Check_FR();
printf("ID=%d",i);
if(i>=0 && AS608_Delete_FR(i)==1)
{printf("指紋刪除成功");
}
? ? ? ? 3.10 清空指紋庫
? ? ? ? 清空指紋庫將刪除所有指紋。成功返回1、失敗返回0。
AS608_Delete_All_FR();
三、總結及資源
? ? ? ? 本文主要講述了如何使用HAL庫進行AS608模塊的開發,UART通信使其移植變得非常簡單,可以幫助各位快速上手開發。同時后續我也會在本專欄更新更多詳細的開發資料和教學,并將免費開源。
? ? ? ? AS608開發手冊和上位機:開發手冊和上位機軟件
? ? ? ? AS608-HAL庫:AS608-HAL庫
? ? ? ? 本文源工程:AS608工程-STM32CUBEMX