你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32指纹识别

[复制链接]
STMCU小助手 发布时间:2022-11-29 15:00
一、 简介

AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司(Synochip)的 AS608 指纹识别芯片 而做成的指纹模块,模块厂商只是基于该芯片设计外围电路,集成一个可供2次开发的指纹模块;所以,只要是基于AS608芯片的指纹模块,其控制电路及控制协议几乎是一样的,只是厂家和性能不同而已。


三、 AS608模块引脚描述

Vi 模块电源正输入端。
Tx 串行数据输出。TTL 逻辑电平
Rx 串行数据输入。TTL 逻辑电平
GND 信号地。内部与电源地连接
WAK 感应信号输出,默认高电平有效
(用户可读取状态引脚(WAK)判断有无手指按下)
Vt 触摸感应电源输入端,.3v 供电
U+ USB D+
U- USB D-


四、开发流程

640 (1).png



640.png


程序
AS608.H
  1. #ifndef __AS608_H
  2.   #define __AS608_H
  3.   #include <stdio.h>
  4.   #include "stm32f10x.h"
  5.   #define AS608_USER     1
  6.   #define PS_Sta   PAin(6)//读指纹模块状态引脚
  7.   #define CharBuffer1 0x01
  8.   #define CharBuffer2 0x02
  9.   
  10.   extern u32 AS608Addr;//模块地址

  11.   typedef struct  
  12.   {
  13.     u16 pageID;//指纹ID
  14.     u16 mathscore;//匹配得分
  15. }SearchResult;
  16.   typedef struct
  17.   {
  18.     u16 PS_max;//指纹最大容量
  19.     u8  PS_level;//安全等级
  20.   u32 PS_addr;
  21.     u8  PS_size;//通讯数据包大小
  22.     u8  PS_N;//波特率基数N
  23. }SysPara;
  24.   void PS_StaGPIO_Init(void);//初始化PA6读状态引脚
  25.   u8 PS_GetImage(void); //录入图像
  26.   u8 PS_GenChar(u8 BufferID);//生成特征
  27.   u8 PS_Match(void);//精确比对两枚指纹特征
  28.   u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//搜索指纹
  29.   u8 PS_RegModel(void);//合并特征(生成模板)
  30.    
  31.   u8 PS_StoreChar(u8 BufferID,u16 PageID);//储存模板
  32.   u8 PS_DeletChar(u16 PageID,u16 N);//删除模板
  33. u8 PS_Empty(void);//清空指纹库

  34.   u8 PS_WriteReg(u8 RegNum,u8 DATA);//写系统寄存器

  35.   u8 PS_ReadSysPara(SysPara *p); //读系统基本参数

  36.   u8 PS_SetAddr(u32 addr);  //设置模块地址
  37.   
  38.   u8 PS_WriteNotepad(u8 NotePageNum,u8 *content);//写记事本

  39. u8 PS_ReadNotepad(u8 NotePageNum,u8 *note);//读记事
  40.   
  41.   u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p);//高速搜索
  42.    
  43.   u8 PS_ValidTempleteNum(u16 *ValidN);//读有效模板个数
  44.   
  45.   u8 PS_HandShake(u32 *PS_Addr); //与AS608模块握手
  46.   
  47.   const char *EnsureMessage(u8 ensure);//确认码错误信息解析
  48.   
  49.   #endif
复制代码

AS608.C

  1. #include <string.h>
  2. #include "delay.h"   
  3. #include "usart2.h"
  4. #include "as608.h"

  5. u32 AS608Addr = 0XFFFFFFFF; //默认

  6. //初始化PA6为下拉输入        
  7. //读摸出感应状态(触摸感应时输出高电平信号)
  8. void PS_StaGPIO_Init(void)
  9. {   
  10.   RCC->APB1ENR |= 1<<2;//使能PORTA时钟
  11.   GPIOA->CRL &=0XF0FFFFFF;//复位PA6
  12.   GPIOA->CRL |=0X08000000;//输入模式,默认下拉
  13.   GPIOA->ODR &=~(1<<6);//下拉
  14. }
  15. //串口发送一个字节
  16. static void MYUSART_SendData(u8 data)
  17. {
  18.   while((USART2->SR&0X40)==0);
  19.   USART2->DR = data;
  20. }
  21. //发送包头
  22. static void SendHead(void)
  23. {
  24.   MYUSART_SendData(0xEF);
  25.   MYUSART_SendData(0x01);
  26. }
  27. //发送地址
  28. static void SendAddr(void)
  29. {
  30.   MYUSART_SendData(AS608Addr>>24);
  31.   MYUSART_SendData(AS608Addr>>16);
  32.   MYUSART_SendData(AS608Addr>>8);
  33.   MYUSART_SendData(AS608Addr);
  34. }
  35. //发送包标识,
  36. static void SendFlag(u8 flag)
  37. {
  38.   MYUSART_SendData(flag);
  39. }
  40. //发送包长度
  41. static void SendLength(int length)
  42. {
  43.   MYUSART_SendData(length>>8);
  44.   MYUSART_SendData(length);
  45. }
  46. //发送指令码
  47. static void Sendcmd(u8 cmd)
  48. {
  49.   MYUSART_SendData(cmd);
  50. }
  51. //发送校验和
  52. static void SendCheck(u16 check)
  53. {
  54.   MYUSART_SendData(check>>8);
  55.   MYUSART_SendData(check);
  56. }
  57. //判断中断接收的数组有没有应答包
  58. //waittime为等待中断接收数据的时间(单位1ms)
  59. //返回值:数据包首地址
  60. static u8 *JudgeStr(u16 waittime)
  61. {
  62.   char *data;
  63.   u8 str[8];
  64.   str[0]=0xef;str[1]=0x01;str[2]=AS608Addr>>24;
  65.   str[3]=AS608Addr>>16;str[4]=AS608Addr>>8;
  66.   str[5]=AS608Addr;str[6]=0x07;str[7]='\0';
  67.   USART2_RX_STA=0;
  68.   while(--waittime)
  69.   {
  70.     delay_ms(1);
  71.     if(USART2_RX_STA&0X8000)//接收到一次数据
  72.     {
  73.       USART2_RX_STA=0;
  74.       data=strstr((const char*)USART2_RX_BUF,(const char*)str);
  75.       if(data)
  76.         return (u8*)data;  
  77.     }
  78.   }
  79.   return 0;
  80. }
  81. //录入图像 PS_GetImage
  82. //功能:探测手指,探测到后录入指纹图像存于ImageBuffer。
  83. //模块返回确认字
  84. u8 PS_GetImage(void)
  85. {
  86.   u16 temp;
  87.   u8  ensure;
  88.   u8  *data;
  89.   SendHead();
  90.   SendAddr();
  91.   SendFlag(0x01);//命令包标识
  92.   SendLength(0x03);
  93.   Sendcmd(0x01);
  94.   temp =  0x01+0x03+0x01;
  95.   SendCheck(temp);
  96.   data=JudgeStr(2000);
  97.   if(data)
  98.     ensure=data[9];
  99.   else
  100.     ensure=0xff;
  101.   return ensure;
  102. }
  103. //生成特征 PS_GenChar
  104. //功能:将ImageBuffer中的原始图像生成指纹特征文件存于CharBuffer1或CharBuffer2      
  105. //参数:BufferID --> charBuffer1:0x01  charBuffer1:0x02                        
  106. //模块返回确认字
  107. u8 PS_GenChar(u8 BufferID)
  108. {
  109.   u16 temp;
  110.   u8  ensure;
  111.   u8  *data;
  112.   SendHead();
  113.   SendAddr();
  114.   SendFlag(0x01);//命令包标识
  115.   SendLength(0x04);
  116.   Sendcmd(0x02);
  117.   MYUSART_SendData(BufferID);
  118.   temp = 0x01+0x04+0x02+BufferID;
  119.   SendCheck(temp);
  120.   data=JudgeStr(2000);
  121.   if(data)
  122.     ensure=data[9];
  123.   else
  124.     ensure=0xff;
  125.   return ensure;
  126. }
  127. //精确比对两枚指纹特征 PS_Match
  128. //功能:精确比对CharBuffer1 与CharBuffer2 中的特征文件
  129. //模块返回确认字
  130. u8 PS_Match(void)
  131. {
  132.   u16 temp;
  133.   u8  ensure;
  134.   u8  *data;
  135.   SendHead();
  136.   SendAddr();
  137.   SendFlag(0x01);//命令包标识
  138.   SendLength(0x03);
  139.   Sendcmd(0x03);
  140.   temp = 0x01+0x03+0x03;
  141.   SendCheck(temp);
  142.   data=JudgeStr(2000);
  143.   if(data)
  144.     ensure=data[9];
  145.   else
  146.     ensure=0xff;
  147.   return ensure;
  148. }
  149. //搜索指纹 PS_Search
  150. //功能:以CharBuffer1或CharBuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。
  151. //参数:  BufferID @ref CharBuffer1  CharBuffer2
  152. //说明:  模块返回确认字,页码(相配指纹模板)
  153. u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
  154. {
  155.   u16 temp;
  156.   u8  ensure;
  157.   u8  *data;
  158.   SendHead();
  159.   SendAddr();
  160.   SendFlag(0x01);//命令包标识
  161.   SendLength(0x08);
  162.   Sendcmd(0x04);
  163.   MYUSART_SendData(BufferID);
  164.   MYUSART_SendData(StartPage>>8);
  165.   MYUSART_SendData(StartPage);
  166.   MYUSART_SendData(PageNum>>8);
  167.   MYUSART_SendData(PageNum);
  168.   temp = 0x01+0x08+0x04+BufferID
  169.   +(StartPage>>8)+(u8)StartPage
  170.   +(PageNum>>8)+(u8)PageNum;
  171.   SendCheck(temp);
  172.   data=JudgeStr(2000);
  173.   if(data)
  174.   {
  175.     ensure = data[9];
  176.     p->pageID   =(data[10]<<8)+data[11];
  177.     p->mathscore=(data[12]<<8)+data[13];  
  178.   }
  179.   else
  180.     ensure = 0xff;
  181.   return ensure;  
  182. }
  183. //合并特征(生成模板)PS_RegModel
  184. //功能:将CharBuffer1与CharBuffer2中的特征文件合并生成 模板,结果存于CharBuffer1与CharBuffer2  
  185. //说明:  模块返回确认字
  186. u8 PS_RegModel(void)
  187. {
  188.   u16 temp;
  189.   u8  ensure;
  190.   u8  *data;
  191.   SendHead();
  192.   SendAddr();
  193.   SendFlag(0x01);//命令包标识
  194.   SendLength(0x03);
  195.   Sendcmd(0x05);
  196.   temp = 0x01+0x03+0x05;
  197.   SendCheck(temp);
  198.   data=JudgeStr(2000);
  199.   if(data)
  200.     ensure=data[9];
  201.   else
  202.     ensure=0xff;
  203.   return ensure;   
  204. }
  205. //储存模板 PS_StoreChar
  206. //功能:将 CharBuffer1 或 CharBuffer2 中的模板文件存到 PageID 号flash数据库位置。
  207. //参数:  BufferID @ref charBuffer1:0x01  charBuffer1:0x02
  208. //       PageID(指纹库位置号)
  209. //说明:  模块返回确认字
  210. u8 PS_StoreChar(u8 BufferID,u16 PageID)
  211. {
  212.   u16 temp;
  213.   u8  ensure;
  214.   u8  *data;
  215.   SendHead();
  216.   SendAddr();
  217.   SendFlag(0x01);//命令包标识
  218.   SendLength(0x06);
  219.   Sendcmd(0x06);
  220.   MYUSART_SendData(BufferID);
  221.   MYUSART_SendData(PageID>>8);
  222.   MYUSART_SendData(PageID);
  223.   temp = 0x01+0x06+0x06+BufferID
  224.   +(PageID>>8)+(u8)PageID;
  225.   SendCheck(temp);
  226.   data=JudgeStr(2000);
  227.   if(data)
  228.     ensure=data[9];
  229.   else
  230.     ensure=0xff;
  231.   return ensure;  
  232. }
  233. //删除模板 PS_DeletChar
  234. //功能:  删除flash数据库中指定ID号开始的N个指纹模板
  235. //参数:  PageID(指纹库模板号),N删除的模板个数。
  236. //说明:  模块返回确认字
  237. u8 PS_DeletChar(u16 PageID,u16 N)
  238. {
  239.   u16 temp;
  240.   u8  ensure;
  241.   u8  *data;
  242.   SendHead();
  243.   SendAddr();
  244.   SendFlag(0x01);//命令包标识
  245.   SendLength(0x07);
  246.   Sendcmd(0x0C);
  247.   MYUSART_SendData(PageID>>8);
  248.   MYUSART_SendData(PageID);
  249.   MYUSART_SendData(N>>8);
  250.   MYUSART_SendData(N);
  251.   temp = 0x01+0x07+0x0C
  252.   +(PageID>>8)+(u8)PageID
  253.   +(N>>8)+(u8)N;
  254.   SendCheck(temp);
  255.   data=JudgeStr(2000);
  256.   if(data)
  257.     ensure=data[9];
  258.   else
  259.     ensure=0xff;
  260.   return ensure;
  261. }
  262. //清空指纹库 PS_Empty
  263. //功能:  删除flash数据库中所有指纹模板
  264. //参数:  无
  265. //说明:  模块返回确认字
  266. u8 PS_Empty(void)
  267. {
  268.   u16 temp;
  269.   u8  ensure;
  270.   u8  *data;
  271.   SendHead();
  272.   SendAddr();
  273.   SendFlag(0x01);//命令包标识
  274.   SendLength(0x03);
  275.   Sendcmd(0x0D);
  276.   temp = 0x01+0x03+0x0D;
  277.   SendCheck(temp);
  278.   data=JudgeStr(2000);
  279.   if(data)
  280.     ensure=data[9];
  281.   else
  282.     ensure=0xff;
  283.   return ensure;
  284. }
  285. //写系统寄存器 PS_WriteReg
  286. //功能:  写模块寄存器
  287. //参数:  寄存器序号RegNum:4\5\6
  288. //说明:  模块返回确认字
  289. u8 PS_WriteReg(u8 RegNum,u8 DATA)
  290. {
  291.   u16 temp;
  292.   u8  ensure;
  293.   u8  *data;
  294.   SendHead();
  295.   SendAddr();
  296.   SendFlag(0x01);//命令包标识
  297.   SendLength(0x05);
  298.   Sendcmd(0x0E);
  299.   MYUSART_SendData(RegNum);
  300.   MYUSART_SendData(DATA);
  301.   temp = RegNum+DATA+0x01+0x05+0x0E;
  302.   SendCheck(temp);
  303.   data=JudgeStr(2000);
  304.   if(data)
  305.     ensure=data[9];
  306.   else
  307.     ensure=0xff;
  308.   if(ensure==0)
  309.     printf("\r\n设置参数成功!");
  310.   else
  311.     printf("\r\n%s",EnsureMessage(ensure));
  312.   return ensure;
  313. }
  314. //读系统基本参数 PS_ReadSysPara
  315. //功能:  读取模块的基本参数(波特率,包大小等)
  316. //参数:  无
  317. //说明:  模块返回确认字 + 基本参数(16bytes)
  318. u8 PS_ReadSysPara(SysPara *p)
  319. {
  320.   u16 temp;
  321.   u8  ensure;
  322.   u8  *data;
  323.   SendHead();
  324.   SendAddr();
  325.   SendFlag(0x01);//命令包标识
  326.   SendLength(0x03);
  327.   Sendcmd(0x0F);
  328.   temp = 0x01+0x03+0x0F;
  329.   SendCheck(temp);
  330.   data=JudgeStr(1000);
  331.   if(data)
  332.   {
  333.     ensure = data[9];
  334.     p->PS_max = (data[14]<<8)+data[15];
  335.     p->PS_level = data[17];
  336.     p->PS_addr=(data[18]<<24)+(data[19]<<16)+(data[20]<<8)+data[21];
  337.     p->PS_size = data[23];
  338.     p->PS_N = data[25];
  339.   }   
  340.   else
  341.     ensure=0xff;
  342.   if(ensure==0x00)
  343.   {
  344.     printf("\r\n模块最大指纹容量=%d",p->PS_max);
  345.     printf("\r\n对比等级=%d",p->PS_level);
  346.     printf("\r\n地址=%x",p->PS_addr);
  347.     printf("\r\n波特率=%d",p->PS_N*9600);
  348.   }
  349.   else
  350.       printf("\r\n%s",EnsureMessage(ensure));
  351.   return ensure;
  352. }
  353. //设置模块地址 PS_SetAddr
  354. //功能:  设置模块地址
  355. //参数:  PS_addr
  356. //说明:  模块返回确认字
  357. u8 PS_SetAddr(u32 PS_addr)
  358. {
  359.   u16 temp;
  360.   u8  ensure;
  361.   u8  *data;
  362.   SendHead();
  363.   SendAddr();
  364.   SendFlag(0x01);//命令包标识
  365.   SendLength(0x07);
  366.   Sendcmd(0x15);
  367.   MYUSART_SendData(PS_addr>>24);
  368.   MYUSART_SendData(PS_addr>>16);
  369.   MYUSART_SendData(PS_addr>>8);
  370.   MYUSART_SendData(PS_addr);
  371.   temp = 0x01+0x07+0x15
  372.   +(u8)(PS_addr>>24)+(u8)(PS_addr>>16)
  373.   +(u8)(PS_addr>>8) +(u8)PS_addr;        
  374.   SendCheck(temp);
  375.   AS608Addr=PS_addr;//发送完指令,更换地址
  376.   data=JudgeStr(2000);
  377.   if(data)
  378.     ensure=data[9];
  379.   else
  380.     ensure=0xff;  
  381.     AS608Addr = PS_addr;
  382.   if(ensure==0x00)
  383.     printf("\r\n设置地址成功!");
  384.   else
  385.     printf("\r\n%s",EnsureMessage(ensure));
  386.   return ensure;
  387. }
  388. //功能:模块内部为用户开辟了256bytes的FLASH空间用于存用户记事本,
  389. //  该记事本逻辑上被分成 16 个页。
  390. //参数:  NotePageNum(0~15),Byte32(要写入内容,32个字节)
  391. //说明:  模块返回确认字
  392. u8 PS_WriteNotepad(u8 NotePageNum,u8 *Byte32)
  393. {
  394.   u16 temp;
  395.   u8  ensure,i;
  396.   u8  *data;
  397.   SendHead();
  398.   SendAddr();
  399.   SendFlag(0x01);//命令包标识
  400.   SendLength(36);
  401.   Sendcmd(0x18);
  402.   MYUSART_SendData(NotePageNum);
  403.   for(i=0;i<32;i++)
  404.    {
  405.      MYUSART_SendData(Byte32[i]);
  406.      temp += Byte32[i];
  407.    }
  408.   temp =0x01+36+0x18+NotePageNum+temp;
  409.   SendCheck(temp);
  410.   data=JudgeStr(2000);
  411.   if(data)
  412.     ensure=data[9];
  413.   else
  414.     ensure=0xff;
  415.   return ensure;
  416. }
  417. //读记事PS_ReadNotepad
  418. //功能:读取FLASH用户区的128bytes数据
  419. //参数:  NotePageNum(0~15)
  420. //说明:  模块返回确认字+用户信息
  421. u8 PS_ReadNotepad(u8 NotePageNum,u8 *Byte32)
  422. {
  423.   u16 temp;
  424.   u8  ensure,i;
  425.   u8  *data;
  426.   SendHead();
  427.   SendAddr();
  428.   SendFlag(0x01);//命令包标识
  429.   SendLength(0x04);
  430.   Sendcmd(0x19);
  431.   MYUSART_SendData(NotePageNum);
  432.   temp = 0x01+0x04+0x19+NotePageNum;
  433.   SendCheck(temp);
  434.   data=JudgeStr(2000);
  435.   if(data)
  436.   {
  437.     ensure=data[9];
  438.     for(i=0;i<32;i++)
  439.     {
  440.       Byte32[i]=data[10+i];
  441.     }
  442.   }
  443.   else
  444.     ensure=0xff;
  445.   return ensure;
  446. }
  447. //高速搜索PS_HighSpeedSearch
  448. //功能:以 CharBuffer1或CharBuffer2中的特征文件高速搜索整个或部分指纹库。
  449. //      若搜索到,则返回页码,该指令对于的确存在于指纹库中 ,且登录时质量
  450. //      很好的指纹,会很快给出搜索结果。
  451. //参数:  BufferID, StartPage(起始页),PageNum(页数)
  452. //说明:  模块返回确认字+页码(相配指纹模板)
  453. u8 PS_HighSpeedSearch(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p)
  454. {
  455.   u16 temp;
  456.   u8  ensure;
  457.   u8  *data;
  458.   SendHead();
  459.   SendAddr();
  460.   SendFlag(0x01);//命令包标识
  461.   SendLength(0x08);
  462.   Sendcmd(0x1b);
  463.   MYUSART_SendData(BufferID);
  464.   MYUSART_SendData(StartPage>>8);
  465.   MYUSART_SendData(StartPage);
  466.   MYUSART_SendData(PageNum>>8);
  467.   MYUSART_SendData(PageNum);
  468.   temp = 0x01+0x08+0x1b+BufferID
  469.   +(StartPage>>8)+(u8)StartPage
  470.   +(PageNum>>8)+(u8)PageNum;
  471.   SendCheck(temp);
  472.   data=JudgeStr(2000);
  473.    if(data)
  474.   {
  475.     ensure=data[9];
  476.     p->pageID   =(data[10]<<8) +data[11];
  477.     p->mathscore=(data[12]<<8) +data[13];
  478.   }
  479.   else
  480.     ensure=0xff;
  481.   return ensure;
  482. }
  483. //读有效模板个数 PS_ValidTempleteNum
  484. //功能:读有效模板个数
  485. //参数: 无
  486. //说明: 模块返回确认字+有效模板个数ValidN
  487. u8 PS_ValidTempleteNum(u16 *ValidN)
  488. {
  489.   u16 temp;
  490.   u8  ensure;
  491.   u8  *data;
  492.   SendHead();
  493.   SendAddr();
  494.   SendFlag(0x01);//命令包标识
  495.   SendLength(0x03);
  496.   Sendcmd(0x1d);
  497.   temp = 0x01+0x03+0x1d;
  498.   SendCheck(temp);
  499.   data=JudgeStr(2000);
  500.   if(data)
  501.   {
  502.     ensure=data[9];
  503.     *ValidN = (data[10]<<8) +data[11];
  504.   }   
  505.   else
  506.     ensure=0xff;
  507.   
  508.   if(ensure==0x00)
  509.   {
  510.     printf("\r\n有效指纹个数=%d",(data[10]<<8)+data[11]);
  511.   }
  512.   else
  513.     printf("\r\n%s",EnsureMessage(ensure));
  514.   return ensure;
  515. }
  516. //与AS608握手 PS_HandShake
  517. //参数: PS_Addr地址指针
  518. //说明: 模块返新地址(正确地址)  
  519. u8 PS_HandShake(u32 *PS_Addr)
  520. {  
  521.   SendHead();
  522.   SendAddr();
  523.   MYUSART_SendData(0X01);
  524.   MYUSART_SendData(0X00);
  525.   MYUSART_SendData(0X00);
  526.   delay_ms(200);
  527.   if(USART2_RX_STA&0X8000)//接收到数据
  528.   {   
  529.     if(//判断是不是模块返回的应答包        
  530.           USART2_RX_BUF[0]==0XEF
  531.         &&USART2_RX_BUF[1]==0X01
  532.         &&USART2_RX_BUF[6]==0X07
  533.       )
  534.       {
  535.         *PS_Addr=(USART2_RX_BUF[2]<<24) + (USART2_RX_BUF[3]<<16)
  536.                 +(USART2_RX_BUF[4]<<8) + (USART2_RX_BUF[5]);
  537.         USART2_RX_STA=0;
  538.         return 0;
  539.       }
  540.     USART2_RX_STA=0;         
  541.   }
  542.   return 1;   
  543. }
  544. //模块应答包确认码信息解析
  545. //功能:解析确认码错误信息返回信息
  546. //参数: ensure
  547. const char *EnsureMessage(u8 ensure)
  548. {
  549.   const char *p;
  550.   switch(ensure)
  551.   {
  552.     case  0x00:
  553.       p="OK";break;   
  554.     case  0x01:
  555.       p="数据包接收错误";break;
  556.     case  0x02:
  557.       p="传感器上没有手指";break;
  558.     case  0x03:
  559.       p="录入指纹图像失败";break;
  560.     case  0x04:
  561.       p="指纹图像太干、太淡而生不成特征";break;
  562.     case  0x05:
  563.       p="指纹图像太湿、太糊而生不成特征";break;
  564.     case  0x06:
  565.       p="指纹图像太乱而生不成特征";break;
  566.     case  0x07:
  567.       p="指纹图像正常,但特征点太少(或面积太小)而生不成特征";break;
  568.     case  0x08:
  569.       p="指纹不匹配";break;
  570.     case  0x09:
  571.       p="没搜索到指纹";break;
  572.     case  0x0a:
  573.       p="特征合并失败";break;
  574.     case  0x0b:
  575.       p="访问指纹库时地址序号超出指纹库范围";
  576.     case  0x10:
  577.       p="删除模板失败";break;
  578.     case  0x11:
  579.       p="清空指纹库失败";break;  
  580.     case  0x15:
  581.       p="缓冲区内没有有效原始图而生不成图像";break;
  582.     case  0x18:
  583.       p="读写 FLASH 出错";break;
  584.     case  0x19:
  585.       p="未定义错误";break;
  586.     case  0x1a:
  587.       p="无效寄存器号";break;
  588.     case  0x1b:
  589.       p="寄存器设定内容错误";break;
  590.     case  0x1c:
  591.       p="记事本页码指定错误";break;
  592.     case  0x1f:
  593.       p="指纹库满";break;
  594.     case  0x20:
  595.       p="地址错误";break;
  596.     default :
  597.       p="模块返回确认码有误";break;
  598.   }
  599. return p;  
  600. }
复制代码

刷指纹

  1. void press_FR(void)
  2. {
  3.   SearchResult seach;
  4.   u8 ensure;
  5.   ensure=PS_GetImage();
  6.   if(ensure==0x00)//获取图像成功
  7.   {  
  8.     ensure=PS_GenChar(CharBuffer1);
  9.     if(ensure==0x00) //生成特征成功
  10.     {   
  11.       ensure=PS_HighSpeedSearch(CharBuffer1,0,300,&seach);
  12.       if(ensure==0x00)//搜索成功
  13.       {        
  14.         printf("search the fingerprint successfully\n");//搜索指纹成功        
  15.       
  16.         printf("Match ID:%d  Match score:%d\n",seach.pageID,seach.mathscore);//显示匹配指纹的ID和分数
  17.         
  18.         
  19.         if(seach.pageID==0)
  20.           LED=0;
  21.       }
  22.       else
  23.       {
  24.         printf("%c",ensure);   
  25.           LED=1;
  26.       }        
  27.     }
  28.     else
  29.       printf("%c",ensure);
  30.    delay_ms(1000);//延时后清除显示
  31.    printf("\n");
  32.   }
  33.    
  34. }
复制代码

录入指纹
  1. void Add_FR(void)
  2. {
  3.   u8 i=0,ensure ,processnum=0;
  4.   u16 ID;
  5.   while(1)
  6.   {
  7.     switch (processnum)
  8.     {
  9.       case 0:
  10.         i++;
  11.         printf("please finger\n");   //请按手指
  12.         ensure=PS_GetImage();//录入图像返回字
  13.         if(ensure==0x00)
  14.         {
  15.           ensure=PS_GenChar(CharBuffer1);//生成特征
  16.           if(ensure==0x00)
  17.           {
  18.             printf("zhengque\n");//指纹正确
  19.             i=0;
  20.             processnum=1;//跳到第二步            
  21.           }
  22.           else printf("%c\n",ensure);         
  23.         }
  24.         else  printf("%c\n",ensure);            
  25.         break;
  26.       
  27.       case 1:
  28.         i++;
  29.          printf("please click on the finger\n");//再按一次手指
  30.         ensure=PS_GetImage();
  31.         if(ensure==0x00)
  32.         {
  33.           ensure=PS_GenChar(CharBuffer2);//生成特征      
  34.           if(ensure==0x00)
  35.           {
  36.             printf("Fingerprint right\n");//指纹正确
  37.             i=0;
  38.             processnum=2;//跳到第三步
  39.           }else
  40.           printf("%c",ensure);  
  41.         }else
  42.         printf("%c",ensure);   
  43.         break;
  44.       case 2:
  45.         printf("comparing two fingerprints\n");   //对比两次指纹
  46.         ensure=PS_Match();//精确比对两枚指纹特征返回字
  47.         if(ensure==0x00)
  48.         {
  49.           printf("Two fingerprints is the same\n");//两次指纹是一样的
  50.           processnum=3;//跳到第四步
  51.         }
  52.         else
  53.         {
  54.           printf("Comeparative failure,please press fingers again\n");//对比失败,请重新按手指
  55.           printf("%c",ensure);
  56.           i=0;
  57.           processnum=0;//跳回第一步   
  58.         }
  59.         delay_ms(1000);
  60.         break;
  61.       case 3:
  62.         printf("generate a fingerprint template\n");//产生一个指纹模板
  63.         ensure=PS_RegModel();
  64.         if(ensure==0x00)
  65.         {
  66.           printf("generate a fingerprint template is successful\n");//生成指纹模板成功
  67.           processnum=4;//跳到第五步
  68.         }else {processnum=0;printf("%c",ensure);}
  69.         delay_ms(1000);
  70.         break;
  71.         
  72.       case 4:  
  73.         printf("input the ID and press Enter to save\n");//输入ID并按“Enter”保存
  74.         printf("0=< ID <=299\n");  
  75.         do
  76.          
  77.         {
  78.           ID++;
  79.         }
  80.         while(!(ID<300));//输入DI必须小于300
  81.         ensure=PS_StoreChar(CharBuffer2,ID);//储存模板
  82.         if(ensure==0x00)
  83.         {      
  84.           printf("Add the fingerprint successfully\n");//添加指纹成功
  85.           PS_ValidTempleteNum(&ValidN);//读库指纹个数
  86.         
  87.           printf("%d\n",AS608Para.PS_max-ValidN);//显示剩余指纹个数
  88.           delay_ms(1500);//延时后清除显示  
  89.           printf ("\n");
  90.           return ;
  91.         }else {processnum=0; printf("%c\n",ensure);}         
  92.         break;        
  93.     }
  94.     delay_ms(800);
  95.     if(i==5)//超过5次没有按手指则退出
  96.     {
  97.       printf("\n");
  98.       break;  
  99.     }        
  100.   }
  101. }
复制代码

转载自: 跋扈洋

收藏 评论0 发布时间:2022-11-29 15:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版