当前位置:文档之家› 基于STM32单片机开发光学指纹识别模块

基于STM32单片机开发光学指纹识别模块

基于STM32单片机开发光学指纹识别模块(FPM10A)全教程收藏人:共同成长8882014-05-08 | 阅:25 转:0 | 来源| 分享基于STM32单片机开发光学指纹识别模块(FPM10A)全教程• 1.平台首先我使用的是奋斗STM32开发板 MINI板光学指纹识别模块(FPM10A)2.购买指纹模块,可以获得三份资料1.简要使用说明2.使用指纹模块的功能函数3.FPM10A用户手册.3.硬件搭建根据使用说明:FPM 10A使用标准的串口与外界通信,默认的波特率为57600,可以与任何单片机,ARM,DSP等带串口的设备进行连接,请注意电平转换,连接电脑需要进行电平转换,比如MAX232电路。

FPM10A光学指纹模块共有5个管脚1 为VCC 电源的正极接 3.6V – 5.5V的电压均可。

2 为GND 电源的负极接地。

3 为TXD 串口的发送。

4 为RXD 串口的接收。

5 为NC 悬空不需要使用。

奋斗板上已经有5V的管脚,可以直接供给指纹模块,这里需要注意的是,指纹模块主要通过串口进行控制,模块和STM32单片机连接的时候,需要进行电平转换,这样只要把这个转接板插入STM32,接上5V的电,就可以工作了,将模块的发送端接转接板的接收端,接收端接转接板的发送端。

这样,我们的硬件平台就搭建好了!4.模块的测试工作模块成功上电后,指纹采集窗口会闪一下,表示自检正常,如果不闪,请仔细检查电源,是否接反,接错等。

指纹模块使用120MHZ的DSP全速工作,工作时芯片有一些热,经过严格的测试,这是没有问题的可以放心使用,在不使用的时候可以关闭电源,以降低功耗。

5.现在我们要进入编程环节了指纹模块主要是通过串口进行控制,所以这里我们需要用到单片机的串口模块。

我们需要用到两个关键函数1.使用串口发送一个字节的数据2.使用串口接收一个字节的数据这里我使用的STM32单片,所以这两个程序如下:view sourceprint?01.// 从 USART1 发送一个字节02.void USART1_SendByte(unsigned char temp)03.{04. USART_SendData(USART1, temp);05. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);06.}07.08.// 从 USART1 读取一个字节09.unsigned char USART1_ReceivByte()10.{11. unsigned char recev;12. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);13. recev = USART_ReceiveData(USART1);14. return recev;15.}6.查看FPM10A用户手册我们来实现比对一个指纹(我们这里假设指纹模块中已经存在指纹模板)首先我们需要让指纹模块检测是否有指纹输入(也就是是否有手指放在指纹模块上检测)我们来看手册上给的操作说明:我们需要发送给定的数据包给模块,发送的数据已经给我们了,现在我们参看给我们的C例程view sourceprint?01.//应答包数组02.unsigned char dat[18];03.04.//获得指纹图像05.06.unsigned char FP_Get_Img[6]={0x01,0x00,0x03,0x01,0x0,0x05};07.08.//协议包头09.10.unsigned char FP_Pack_Head[6] ={0xEF,0x01,0xFF,0xFF,0xFF,0xFF};11.12.//FINGERPRINT_获得指纹图像命令13.void FINGERPRINT_Cmd_Get_Img(void)14.{15. unsigned char i;16.17. for(i=0;i<6;i++) //发送包头18. USART1_SendByte(FP_Pack_Head[i]);19.20. for(i=0;i<6;i++) //发送命令 0x1d21. USART1_SendByte(FP_Get_Img[i]);22.23. for(i=0;i<12;i++)//读回应答信息24. dat[i]=USART1_ReceivByte();25.}说明:这个函数就是检测是否有指纹输入的信息,根据用户手册,当确认码返回值为0时,表示成功录入,所以,我们可以有下面的函数:view sourceprint?01.//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败02.unsigned char test_fig()03.{04. unsigned char fig_dat;05. FINGERPRINT_Cmd_Get_Img();06. Delay_ms1(20);07. fig_dat=dat[9];08. return(fig_dat);09.}10.11.因此,我们在主函数中可以这样调用:12.void main13.{14. if(test_fig()==0)15. {16. //do something17. }18.}7.如何录入一个新的指纹信息呢?步骤如下1.获得指纹图像2.检测是否成功的按了指纹3.将图像转换成特征码存放在Buffer1中4.再次获得指纹图像5.将图像转换成特征码存放在Buffer2中6.转换成特征码7.存储到指定地址上同样的,根据用户手册,我们可以得到以下这样的模块:当调用的时候,你只要给这个函数附上两个值就可以了,例如:unsigned char FP_add_new_user(00,01);如果你下次再次写入这个地址,以前存储的指纹模板信息将被覆盖view sourceprint?01.//添加一个新的指纹02.unsigned char FP_add_new_user(unsigned char ucH_user,un signed char ucL_user)03.{04. do05. {06. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像07. } while ( dat[9]!=0x0 ); //检测是否成功的按了指纹08.09. FINGERPRINT_Cmd_Img_To_Buffer1(); //将图像转换成特征码存放在Buffer1中10.11. do12. {13. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像14. } while( dat[9]!=0x0 );15.16. FINGERPRINT_Cmd_Img_To_Buffer2(); //将图像转换成特征码存放在Buffer2中18. FINGERPRINT_Cmd_Reg_Model(); //转换成特征码19.20. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);21.22. return 0;23.}24.25.//存储模版到特定地址26.void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char , unsigned char ucL_Char)27.{28. unsigned long temp = 0;29. unsigned char i;30.31. FP_Save_Finger[5] = ucH_Char;32. FP_Save_Finger[6] = ucL_Char;33.34. for(i=0;i<7;i++) //计算校验和35. temp = temp + FP_Save_Finger[i];36.37. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据38. FP_Save_Finger[8]= temp & 0x0000FF;39.40.41. for(i=0;i<6;i++)42. USART1_SendByte(FP_Pack_Head[i]); //发送包头43.44. for(i=0;i<9;i++)45. USART1_SendByte(FP_Save_Finger[i]) ;//发送命令将图像转换成特征码存放CHAR_buffer146.47. for(i=0;i<12;i++)48. dat[i]=USART1_ReceivByte();49.}8.如何删除一个模板?view sourceprint?01.//删除所有指纹模版02.void FINGERPRINT_Cmd_Delete_All_Model(void)03.{04. unsigned char i;06. for(i=0;i<6;i++) //发送包头07. USART1_SendByte(FP_Pack_Head[i]);08.09. for(i=0;i<6;i++) //发送命令 0x1d10. USART1_SendByte(FP_Delet_All_Model[i]);11.12. for(i=0;i<12;i++)//读回应答信息13. dat[i]=USART1_ReceivByte();14.}9.如何获取已经存取的指纹模板信息?这个模块一共可以存储0~999枚指纹信息view sourceprint?01.//搜索全部用户999枚02.void FINGERPRINT_Cmd_Search_Finger(void)03.{04. unsigned char i;05. //发送命令搜索指纹库06. for(i=0;i<6;i++)07. {08. USART1_SendByte(FP_Pack_Head[i]);09. }10.11. for(i=0;i<11;i++)12. {13. USART1_SendByte(FP_Search[i]);14. }15.16. for(i=0;i<16;i++)17. {18. dat[i]=USART1_ReceivByte();19. }20.}根据用户手册,我们可以从应答包中得出模块中已经存在指纹数量的大小这样,我们就轻松把指纹模块搞定!下面我附上基于STM32单片机光学指纹识别模块(FPM10A)打包好的函数库第一个是FPM10A.cview sourceprint?001.#include "stm32f10x.h"002.#include "stm32f10x_usart.h"003.#include "misc.h"004.unsigned char dat[18];005.006.//FINGERPRINT通信协议定义007.unsigned char FP_Pack_Head[6] ={0xEF,0x01,0xFF,0xFF,0xFF,0xFF}; //协议包头008.unsigned char FP_Get_Img[6] ={0x01,0x00,0x03,0x01,0x0,0x05}; //获得指纹图像009.unsigned char FP_Templete_Num[6]={0x01,0x00,0x03,0x1D,0x00,0x21 }; //获得模版总数010.unsigned char FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0 ,0x0,0x03,0xA1,0x0,0xB2}; //搜索指纹搜索范围0 - 929011.unsigned char FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01 ,0x0,0x0,0x0,0x13,0x0,0x21};//搜索0-9号指纹012.unsigned char FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0 x01,0x0,0x08}; //将图像放入到BUFFER1013.unsigned char FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0 x02,0x0,0x09}; //将图像放入到BUFFER2014.unsigned char FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x 09}; //将BUFFER1跟BUFFER2合成特征模版015.unsigned char FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d, 0x00,0x11}; //删除指纹模块里所有的模版016.unsigned char FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x0 1,0x00,0x0B,0x00,0x19};//将BUFFER1中的特征码存放到指定的位置017.unsigned char FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0 x0,0x0,0x0,0x1,0x0,0x0}; //删除指定的模版018.019.020.//从 USART1 发送一个字节021.void USART1_SendByte(unsigned char temp)022.{023. USART_SendData(USART1, temp);024. while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);025.}026.027.//从 USART1 读取一个字节028.unsigned char USART1_ReceivByte()029.{030. unsigned char recev;031. while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);032. recev = USART_ReceiveData(USART1);033. return recev;034.}035.//FINGERPRINT命令字036.//FINGERPRINT_获得指纹图像命令037.void FINGERPRINT_Cmd_Get_Img(void)038.{039. unsigned char i;040.041. for(i=0;i<6;i++) //发送包头042. USART1_SendByte(FP_Pack_Head[i]);043.044. for(i=0;i<6;i++) //发送命令 0x1d045. USART1_SendByte(FP_Get_Img[i]);046.047. for(i=0;i<12;i++)//读回应答信息048. dat[i]=USART1_ReceivByte();049.}050.051.//删除所有指纹模版052.void FINGERPRINT_Cmd_Delete_All_Model(void)053.{054. unsigned char i;055.056. for(i=0;i<6;i++) //发送包头057. USART1_SendByte(FP_Pack_Head[i]);058.059. for(i=0;i<6;i++) //发送命令 0x1d060. USART1_SendByte(FP_Delet_All_Model[i]);061.062. for(i=0;i<12;i++)//读回应答信息063. dat[i]=USART1_ReceivByte();064.}065.066.//讲图像转换成特征码存放在Buffer1中067.void FINGERPRINT_Cmd_Img_To_Buffer1(void)068.{069. unsigned char i;070. for(i=0;i<6;i++) //发送包头071. {072. USART1_SendByte(FP_Pack_Head[i]);073. }074. for(i=0;i<7;i++) //发送命令将图像转换成特征码存放在CHAR_buffer1075. {076. USART1_SendByte(FP_Img_To_Buffer1[i]);077. }078. for(i=0;i<12;i++)//读应答信息079. {080. dat[i]=USART1_ReceivByte();//把应答数据存放到缓冲区081. }082.}083.084.//将图像转换成特征码存放在Buffer2中085.void FINGERPRINT_Cmd_Img_To_Buffer2(void)086.{087. unsigned char i;088. for(i=0;i<6;i++) //发送包头089. {090. USART1_SendByte(FP_Pack_Head[i]);091. }092.093. for(i=0;i<7;i++) //发送命令将图像转换成特征码存放在CHAR_buffer1094. {095. USART1_SendByte(FP_Img_To_Buffer2[i]);096. }097. for(i=0;i<12;i++)098. {099. dat[i]=USART1_ReceivByte();//读回应答信息100. }101.}102.103.//将BUFFER1 跟 BUFFER2 中的特征码合并成指纹模版104.void FINGERPRINT_Cmd_Reg_Model(void)105.{106. unsigned char i;107.108. for(i=0;i<6;i++) //包头109. {110. USART1_SendByte(FP_Pack_Head[i]);111. }112.113. for(i=0;i<6;i++) //命令合并指纹模版114. {115. USART1_SendByte(FP_Reg_Model[i]);116. }117.118. for(i=0;i<12;i++)119. {120. dat[i]=USART1_ReceivByte();121. }122.}123.124.//存储模版到特定地址125.void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Cha r, unsigned charucL_Char)126.{127. unsigned long temp = 0;128. unsigned char i;129.130. FP_Save_Finger[5] = ucH_Char;131. FP_Save_Finger[6] = ucL_Char;132.133.134. for(i=0;i<7;i++) //计算校验和135. temp = temp + FP_Save_Finger[i];136.137. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8; //存放校验数据138. FP_Save_Finger[8]= temp & 0x0000FF;139.140.141. for(i=0;i<6;i++)142. USART1_SendByte(FP_Pack_Head[i]); //发送包头143.144. for(i=0;i<9;i++)145. USART1_SendByte(FP_Save_Finger[i]); //发送命令将图像转换成特征码存放在 CHAR_buffer1146.147. for(i=0;i<12;i++)148. dat[i]=USART1_ReceivByte();149.}150.151.//获得指纹模板数量152.void FINGERPRINT_Cmd_Get_Templete_Num(void)153.{154. unsigned int i;155.156. for(i=0;i<6;i++) //包头157. USART1_SendByte(FP_Pack_Head[i]);158.159. //发送命令 0x1d160. for(i=0;i<6;i++)161. USART1_SendByte(FP_Templete_Num[i]);162.163. for(i=0;i<12;i++)164. dat[i]=USART1_ReceivByte();165.}166.167.//搜索全部用户999枚168.void FINGERPRINT_Cmd_Search_Finger(void)169.{170. unsigned char i;171. //发送命令搜索指纹库172. for(i=0;i<6;i++)173. {174. USART1_SendByte(FP_Pack_Head[i]);175. }176.177. for(i=0;i<11;i++)178. {179. USART1_SendByte(FP_Search[i]);180. }181.182. for(i=0;i<16;i++)183. {184. dat[i]=USART1_ReceivByte();185. }186.}187.188.//搜索用户0~9枚189.void FINGERPRINT_Cmd_Search_Finger_Admin(void) 190.{191. unsigned char i;192. for(i=0;i<6;i++) //发送命令搜索指纹库193. {194. USART1_SendByte(FP_Pack_Head[i]);195. }196.197. for(i=0;i<11;i++)198. {199. USART1_SendByte(FP_Search_0_9[i]);200. }201.202. for(i=0;i<12;i++)203. dat[i]=USART1_ReceivByte();204.}205.206.//添加一个新的指纹207.unsigned char FP_add_new_user(unsigned char ucH_user,u nsigned char ucL_user)208.{209. do210. {211. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像212. } while ( dat[9]!=0x0 ); //检测是否成功的按了指纹213.214. FINGERPRINT_Cmd_Img_To_Buffer1(); //将图像转换成特征码存放在Buffer1中215.216. do217. {218. FINGERPRINT_Cmd_Get_Img(); //获得指纹图像219. } while( dat[9]!=0x0 );220.221. FINGERPRINT_Cmd_Img_To_Buffer2(); //将图像转换成特征码存放在Buffer2中222.223. FINGERPRINT_Cmd_Reg_Model(); //转换成特征码224.225. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);226.227. return 0;228.}第2个 FPM10A.hview sourceprint?01.#ifndef _FPM10A_H02.#define _FPM10A_H03.#include <stdint.h>04.05.extern unsigned char dat[18];06.07.extern void FINGERPRINT_Cmd_Get_Img();08.extern void FINGERPRINT_Cmd_Img_To_Buffer1();09.extern void FINGERPRINT_Cmd_Img_To_Buffer2();10.extern void FINGERPRINT_Cmd_Reg_Model();11.extern void FINGERPRINT_Cmd_Delete_All_Model(void);12.extern void FINGERPRINT_Cmd_Search_Finger(void);13.extern void FINGERPRINT_Cmd_Get_Templete_Num(void);14.extern void FINGERPRINT_Cmd_Search_Finger_Admin(void);15.extern void FINGERPRINT_Cmd_Save_Finger( unsigned char ucH_Char, unsigned charucL_Char);16.extern unsigned char FP_add_new_user(unsigned char ucH _user,unsigned charucL_user);17.18.19.extern void USART1_SendByte(unsigned char temp);20.extern unsigned char USART1_ReceivByte();21.22.extern void Delay_ms1(uint32_t nCount);23.24.void Delay_nus1(uint32_t nCount)25.{26. uint32_t j;27. while(nCount--)28. {29. j=8;30. while(j--);31. }32.}33.34.void Delay_ms1(uint32_t nCount)35.{36. while(nCount--)37. Delay_nus1(1100);38.}39.40.unsigned char test_fig()//检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败41.{42. unsigned char fig_dat;43. FINGERPRINT_Cmd_Get_Img();44. Delay_ms1(20);45. fig_dat=dat[9];46. return(fig_dat);47.}48.49.#endif有了这两个东西,加入到你的工程中,就可以直接调用啦!。

相关主题