本文轉(zhuǎn)載,其來源在參考中:1,稍加修改,因為近期使用到這個模塊,故而加以整理!
1.平臺
首先我使用的是 奮斗 STM32 開發(fā)板 MINI板
基于STM32單片機光學(xué)指紋識別模塊(FPM10A)全教程
2.購買指紋模塊,可以獲得三份資料
1.簡要使用說明
2.使用指紋模塊的功能函數(shù)
3.FPM10A用戶手冊.
3.硬件搭建
根據(jù)使用說明:FPM 10A使用標(biāo)準(zhǔn)的串口與外界通信,默認(rèn)的波特率為57600,可以與任何單片機,ARM,DSP等帶串口的設(shè)備進(jìn)行連接,請注意電平轉(zhuǎn)換,連接電腦需要進(jìn)行電平轉(zhuǎn)換,比如MAX232電路。
FPM10A光學(xué)指紋模塊共有5個管腳
1 為 VCC 電源的正極接 3.6V – 5.5V的電壓均可。
2 為 GND 電源的負(fù)極 接地。
3 為 TXD 串口的發(fā)送。
4 為 RXD 串口的接收。
5 為 NC 懸空不需要使用。
奮斗板上已經(jīng)有5V的管腳,可以直接供給指紋模塊,
這里需要注意的是,指紋模塊主要通過串口進(jìn)行控制,模塊和STM32單片機連接的時候,需要進(jìn)行電平轉(zhuǎn)換,
基于STM32單片機光學(xué)指紋識別模塊(FPM10A)全教程
這樣只要把這個轉(zhuǎn)接板插入STM32,接上5V的電,就可以工作了,將模塊的發(fā)送端接轉(zhuǎn)接板的接收端,接收端接轉(zhuǎn)接板的發(fā)送端。
這樣,我們的硬件平臺就搭建好了!
4.模塊的測試工作
>模塊成功上電后,指紋采集窗口會閃一下,表示自檢正常,如果不閃,請仔細(xì)檢查電源,是否接反,接錯等。指紋模塊使用120MHZ的DSP全速工作,工作時芯片有一些熱,經(jīng)過嚴(yán)格的測試,這是沒有問題的可以放心使用,在不使用的時候可以關(guān)閉電源,以降低功耗。
5.現(xiàn)在我們要進(jìn)入編程環(huán)節(jié)了
>指紋模塊主要是通過串口進(jìn)行控制,所以這里我們需要用到單片機的串口模塊。
我們需要用到兩個關(guān)鍵函數(shù)
1.使用串口發(fā)送一個字節(jié)的數(shù)據(jù)
2.使用串口接收一個字節(jié)的數(shù)據(jù)
這里我使用的STM32單片,所以這兩個程序如下:
void USART1_SendByte(
unsigned char temp)
{USART_SendData(USART1, temp);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
unsigned char USART1_ReceivByte()
{
unsigned char recev;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);recev = USART_ReceiveData(USART1);
return recev;
}
6.查看FPM10A用戶手冊 我們來實現(xiàn)比對一個指紋(我們這里假設(shè)指紋模塊中已經(jīng)存在指紋模板)
首先我們需要讓指紋模塊檢測是否有指紋輸入(也就是是否有手指放在指紋模塊上檢測)
我們來看手冊上給的操作說明:
基于STM32單片機光學(xué)指紋識別模塊(FPM10A)全教程
我們需要發(fā)送給定的數(shù)據(jù)包給模塊,發(fā)送的數(shù)據(jù)已經(jīng)給我們了,現(xiàn)在我們參看給我們的C例程
unsigned char dat[
18];
unsigned char FP_Get_Img[
6] ={
0x01,
0x00,
0x03,
0x01,
0x0,
0x05};
unsigned char FP_Pack_Head[
6] = {
0xEF,
0x01,
0xFF,
0xFF,
0xFF,
0xFF};
void FINGERPRINT_Cmd_Get_Img(
void){
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Get_Img[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();}
unsigned char test_fig()
{
unsigned char fig_dat;FINGERPRINT_Cmd_Get_Img();Delay_ms1(
20);fig_dat=dat[
9];
return(fig_dat);
}
因此,我們在主函數(shù)中可以這樣調(diào)用:
void main
{
if(test_fig()==
0){}
}
7.如何錄入一個新的指紋信息呢?
步驟如下
1.獲得指紋圖像
2.檢測是否成功的按了指紋
3.將圖像轉(zhuǎn)換成特征碼存放在Buffer1中
4.再次獲得指紋圖像
5.將圖像轉(zhuǎn)換成特征碼存放在Buffer2中
6.轉(zhuǎn)換成特征碼
7.存儲到指定地址上
同樣的,根據(jù)用戶手冊,我們可以得到以下這樣的模塊:
當(dāng)調(diào)用的時候,你只要給這個函數(shù)附上兩個值就可以了,例如:
unsigned char FP_add_new_user(00,01);
如果你下次再次寫入這個地址,以前存儲的指紋模板信息將被覆蓋
unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user)
{
do{ FINGERPRINT_Cmd_Get_Img(); }
while ( dat[
9]!=
0x0 ); FINGERPRINT_Cmd_Img_To_Buffer1();
do{FINGERPRINT_Cmd_Get_Img(); }
while( dat[
9]!=
0x0 );FINGERPRINT_Cmd_Img_To_Buffer2(); FINGERPRINT_Cmd_Reg_Model(); FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
return 0;
}
void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char)
{
unsigned long temp =
0;
unsigned char i;FP_Save_Finger[
5] = ucH_Char;FP_Save_Finger[
6] = ucL_Char;
for(i=
0;i<
7;i++) temp = temp + FP_Save_Finger[i];FP_Save_Finger[
7]=(temp &
0x00FF00) >>
8; FP_Save_Finger[
8]= temp &
0x0000FF;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
9;i++) USART1_SendByte(FP_Save_Finger[i]) ;
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
8.如何刪除一個模板?
void FINGERPRINT_Cmd_Delete_All_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Delet_All_Model[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
9.如何獲取已經(jīng)存取的指紋模板信息?
這個模塊一共可以存儲0~999枚指紋信息
void FINGERPRINT_Cmd_Search_Finger(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search[i]); }
for(i=
0;i<
16;i++){dat[i]=USART1_ReceivByte();}
}
根據(jù)用戶手冊,我們可以從應(yīng)答包中得出模塊中已經(jīng)存在指紋數(shù)量的大小
這樣,我們就輕松把指紋模塊搞定!
下面我附上基于STM32單片機光學(xué)指紋識別模塊(FPM10A)打包好的函數(shù)庫
第一個是 FPM10A.c
\
#include "stm32f10x.h"
\
#include "stm32f10x_usart.h"
\
#include "misc.h"
unsigned char dat[
18];
unsigned char FP_Pack_Head[
6] = {
0xEF,
0x01,
0xFF,
0xFF,
0xFF,
0xFF};
unsigned char FP_Get_Img[
6] = {
0x01,
0x00,
0x03,
0x01,
0x0,
0x05};
unsigned char FP_Templete_Num[
6] ={
0x01,
0x00,
0x03,
0x1D,
0x00,
0x21 };
unsigned char FP_Search[
11]={
0x01,
0x0,
0x08,
0x04,
0x01,
0x0,
0x0,
0x03,
0xA1,
0x0,
0xB2};
unsigned char FP_Search_0_9[
11]={
0x01,
0x0,
0x08,
0x04,
0x01,
0x0,
0x0,
0x0,
0x13,
0x0,
0x21};
unsigned char FP_Img_To_Buffer1[
7]={
0x01,
0x0,
0x04,
0x02,
0x01,
0x0,
0x08};
unsigned char FP_Img_To_Buffer2[
7]={
0x01,
0x0,
0x04,
0x02,
0x02,
0x0,
0x09};
unsigned char FP_Reg_Model[
6]={
0x01,
0x0,
0x03,
0x05,
0x0,
0x09};
unsigned char FP_Delet_All_Model[
6]={
0x01,
0x0,
0x03,
0x0d,
0x00,
0x11};
unsigned char FP_Save_Finger[
9]={
0x01,
0x00,
0x06,
0x06,
0x01,
0x00,
0x0B,
0x00,
0x19};
unsigned char FP_Delete_Model[
10]={
0x01,
0x00,
0x07,
0x0C,
0x0,
0x0,
0x0,
0x1,
0x0,
0x0};
void USART1_SendByte(
unsigned char temp)
{USART_SendData(USART1, temp);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
unsigned char USART1_ReceivByte()
{
unsigned char recev;
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);recev = USART_ReceiveData(USART1);
return recev;
}
void FINGERPRINT_Cmd_Get_Img(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Get_Img[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Delete_All_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++) USART1_SendByte(FP_Delet_All_Model[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Img_To_Buffer1(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
7;i++) {USART1_SendByte(FP_Img_To_Buffer1[i]);}
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Img_To_Buffer2(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
7;i++) {USART1_SendByte(FP_Img_To_Buffer2[i]);}
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Reg_Model(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Reg_Model[i]); }
for(i=
0;i<
12;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char)
{
unsigned long temp =
0;
unsigned char i;FP_Save_Finger[
5] = ucH_Char;FP_Save_Finger[
6] = ucL_Char;
for(i=
0;i<
7;i++) temp = temp + FP_Save_Finger[i];FP_Save_Finger[
7]=(temp &
0x00FF00) >>
8; FP_Save_Finger[
8]= temp &
0x0000FF;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
9;i++) USART1_SendByte(FP_Save_Finger[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Get_Templete_Num(
void)
{
unsigned int i;
for(i=
0;i<
6;i++) USART1_SendByte(FP_Pack_Head[i]);
for(i=
0;i<
6;i++)USART1_SendByte(FP_Templete_Num[i]);
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
void FINGERPRINT_Cmd_Search_Finger(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search[i]); }
for(i=
0;i<
16;i++){dat[i]=USART1_ReceivByte();}
}
void FINGERPRINT_Cmd_Search_Finger_Admin(
void)
{
unsigned char i;
for(i=
0;i<
6;i++) {USART1_SendByte(FP_Pack_Head[i]); }
for(i=
0;i<
11;i++){USART1_SendByte(FP_Search_0_9[i]); }
for(i=
0;i<
12;i++)dat[i]=USART1_ReceivByte();
}
unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user)
{
do{ FINGERPRINT_Cmd_Get_Img(); }
while ( dat[
9]!=
0x0 ); FINGERPRINT_Cmd_Img_To_Buffer1();
do{FINGERPRINT_Cmd_Get_Img(); }
while( dat[
9]!=
0x0 );FINGERPRINT_Cmd_Img_To_Buffer2(); FINGERPRINT_Cmd_Reg_Model(); FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
return 0;
}
第2個 FPM10A.h
\
#ifndef _FPM10A_H
\
#define _FPM10A_H
\
#include <stdint.h>
extern unsigned char dat[
18];
extern void FINGERPRINT_Cmd_Get_Img();
extern void FINGERPRINT_Cmd_Img_To_Buffer1();
extern void FINGERPRINT_Cmd_Img_To_Buffer2();
extern void FINGERPRINT_Cmd_Reg_Model();
extern void FINGERPRINT_Cmd_Delete_All_Model(
void);
extern void FINGERPRINT_Cmd_Search_Finger(
void);
extern void FINGERPRINT_Cmd_Get_Templete_Num(
void);
extern void FINGERPRINT_Cmd_Search_Finger_Admin(
void);
extern void FINGERPRINT_Cmd_Save_Finger(
unsigned char ucH_Char,
unsigned char ucL_Char);
extern unsigned char FP_add_new_user(
unsigned char ucH_user,
unsigned char ucL_user);
extern void USART1_SendByte(
unsigned char temp);
extern unsigned char USART1_ReceivByte();
extern void Delay_ms1(uint32_t nCount);
void Delay_nus1(uint32_t nCount)
{uint32_t j;
while(nCount--){j=
8;
while(j--);}
}
void Delay_ms1(uint32_t nCount)
{
while(nCount--)Delay_nus1(
1100);
}
unsigned char test_fig()
{
unsigned char fig_dat;FINGERPRINT_Cmd_Get_Img();Delay_ms1(
20);fig_dat=dat[
9];
return(fig_dat);
}
\
#endif 有了這兩個東西,加入到你的工程中,就可以直接調(diào)用啦!
http://blog.sina.com.cn/s/blog_804665db01015nnd.html ?
轉(zhuǎn)載于:https://www.cnblogs.com/ysmintor/p/5180653.html
總結(jié)
以上是生活随笔為你收集整理的基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。