STM32F103学习笔记

您所在的位置:网站首页 ipad无法识别指纹模块 STM32F103学习笔记

STM32F103学习笔记

2024-06-06 10:25| 来源: 网络整理| 查看: 265

/** ****************************************************************************** * @file as608.c * @author Soso * @date 2019-12-17 * @brief AS608 fingerprint recognition module driver code. ****************************************************************************** */#include "as608.h"

u32 AS608Addr = 0XFFFFFFFF; //默认

//初始化PA8为下拉输入 //读摸出感应状态(触摸感应时输出高电平信号)void PS_StaGPIO_Init(void){ GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(AS608_GPIO_CLK, ENABLE);//使能GPIOA时钟 //初始化读状态引脚GPIOA GPIO_InitStructure.GPIO_Pin = AS608_TOUCH_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//输入下拉模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz GPIO_Init(AS608_GPIO_PORT, &GPIO_InitStructure);//初始化GPIO }

//发送包头static void SendHead(void){ Usart_SendByte(AS608_USART,0xEF); Usart_SendByte(AS608_USART,0x01);}//发送地址static void SendAddr(void){ Usart_SendByte(AS608_USART,AS608Addr>>24); Usart_SendByte(AS608_USART,AS608Addr>>16); Usart_SendByte(AS608_USART,AS608Addr>>8); Usart_SendByte(AS608_USART,AS608Addr);}//发送包标识,static void SendFlag(u8 flag){ Usart_SendByte(AS608_USART,flag);}//发送包长度static void SendLength(int length){ Usart_SendByte(AS608_USART,length>>8); Usart_SendByte(AS608_USART,length);}//发送指令码static void Sendcmd(u8 cmd){ Usart_SendByte(AS608_USART,cmd);}//发送校验和static void SendCheck(u16 check){ Usart_SendByte(AS608_USART,check>>8); Usart_SendByte(AS608_USART,check);}//判断中断接收的数组有没有应答包//waittime为等待中断接收数据的时间(单位1ms)//返回值:数据包首地址static u8 *JudgeStr(u16 waittime){ char *data; u8 str[8]; str[0]=0xef; str[1]=0x01; str[2]=AS608Addr>>24; str[3]=AS608Addr>>16; str[4]=AS608Addr>>8; str[5]=AS608Addr; str[6]=0x07; str[7]='\0'; AS608_RX_STA=0; while(--waittime) { delay_ms(1); if(AS608_RX_STA&0X8000)//接收到一次数据 { AS608_RX_STA=0; data=strstr((const char*)AS608_RX_BUF,(const char*)str); if(data) return (u8*)data; } } return 0;}

//录入图像 PS_GetImage//功能:探测手指,探测到后录入指纹图像存于ImageBuffer。 //模块返回确认字u8 PS_GetImage(void){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x03); Sendcmd(0x01); temp = 0x01+0x03+0x01; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure;}

//生成特征 PS_GenChar//功能:将ImageBuffer中的原始图像生成指纹特征文件存于CharBuffer1或CharBuffer2 //参数:BufferID --> charBuffer1:0x01 charBuffer1:0x02 //模块返回确认字u8 PS_GenChar(u8 BufferID){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x04); Sendcmd(0x02); Usart_SendByte(AS608_USART,BufferID); temp = 0x01+0x04+0x02+BufferID; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure;}

//精确比对两枚指纹特征 PS_Match//功能:精确比对CharBuffer1 与CharBuffer2 中的特征文件 //模块返回确认字u8 PS_Match(void){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x03); Sendcmd(0x03); temp = 0x01+0x03+0x03; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure;}

//搜索指纹 PS_Search//功能:以CharBuffer1或CharBuffer2中的特征文件搜索整个或部分指纹库.若搜索到,则返回页码。 //参数: BufferID @ref CharBuffer1 CharBuffer2//说明: 模块返回确认字,页码(相配指纹模板)u8 PS_Search(u8 BufferID,u16 StartPage,u16 PageNum,SearchResult *p){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x08); Sendcmd(0x04); Usart_SendByte(AS608_USART,BufferID); Usart_SendByte(AS608_USART,StartPage>>8); Usart_SendByte(AS608_USART,StartPage); Usart_SendByte(AS608_USART,PageNum>>8); Usart_SendByte(AS608_USART,PageNum); temp = 0x01+0x08+0x04+BufferID+(StartPage>>8)+(u8)StartPage+(PageNum>>8)+(u8)PageNum; SendCheck(temp); data = JudgeStr(2000); if(data) { ensure = data[9]; p->pageID = (data[10]>8)+(u8)PageID; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure; }

//删除模板 PS_DeletChar//功能: 删除flash数据库中指定ID号开始的N个指纹模板//参数: PageID(指纹库模板号),N删除的模板个数。//说明: 模块返回确认字u8 PS_DeletChar(u16 PageID,u16 N){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x07); Sendcmd(0x0C); Usart_SendByte(AS608_USART,PageID>>8); Usart_SendByte(AS608_USART,PageID); Usart_SendByte(AS608_USART,N>>8); Usart_SendByte(AS608_USART,N); temp = 0x01+0x07+0x0C+(PageID>>8)+(u8)PageID+(N>>8)+(u8)N; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure;}

//清空指纹库 PS_Empty//功能: 删除flash数据库中所有指纹模板//参数: 无//说明: 模块返回确认字u8 PS_Empty(void){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x03); Sendcmd(0x0D); temp = 0x01+0x03+0x0D; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; return ensure;}//写系统寄存器 PS_WriteReg//功能: 写模块寄存器//参数: 寄存器序号RegNum:4\5\6//说明: 模块返回确认字u8 PS_WriteReg(u8 RegNum,u8 DATA){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x05); Sendcmd(0x0E); Usart_SendByte(AS608_USART,RegNum); Usart_SendByte(AS608_USART,DATA); temp = RegNum+DATA+0x01+0x05+0x0E; SendCheck(temp); data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff;// if(ensure==0)// printf("\r\n设置参数成功!");// else// printf("\r\n%s",EnsureMessage(ensure)); return ensure;}

//读系统基本参数 PS_ReadSysPara//功能: 读取模块的基本参数(波特率,包大小等)//参数: 无//说明: 模块返回确认字 + 基本参数(16bytes)u8 PS_ReadSysPara(SysPara *p){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x03); Sendcmd(0x0F); temp = 0x01+0x03+0x0F; SendCheck(temp); data = JudgeStr(1000); if(data) { ensure = data[9]; p->PS_max = (data[14]PS_addr = (data[18]PS_N*9600);// }// else // printf("\r\n%s",EnsureMessage(ensure)); return ensure;}

//设置模块地址 PS_SetAddr//功能: 设置模块地址//参数: PS_addr//说明: 模块返回确认字u8 PS_SetAddr(u32 PS_addr){ u16 temp; u8 ensure; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(0x07); Sendcmd(0x15); Usart_SendByte(AS608_USART,PS_addr>>24); Usart_SendByte(AS608_USART,PS_addr>>16); Usart_SendByte(AS608_USART,PS_addr>>8); Usart_SendByte(AS608_USART,PS_addr); temp = 0x01+0x07+0x15+(u8)(PS_addr>>24)+(u8)(PS_addr>>16)+(u8)(PS_addr>>8) +(u8)PS_addr; SendCheck(temp); AS608Addr = PS_addr;//发送完指令,更换地址 data = JudgeStr(2000); if(data) ensure = data[9]; else ensure = 0xff; // if(ensure==0x00)// printf("\r\n设置地址成功!");// else// printf("\r\n%s",EnsureMessage(ensure)); return ensure;}

//功能: 模块内部为用户开辟了256bytes的FLASH空间用于存用户记事本,// 该记事本逻辑上被分成 16 个页。//参数: NotePageNum(0~15),Byte32(要写入内容,32个字节)//说明: 模块返回确认字u8 PS_WriteNotepad(u8 NotePageNum,u8 *Byte32){ u16 temp; u8 ensure,i; u8 *data; SendHead(); SendAddr(); SendFlag(0x01);//命令包标识 SendLength(36); Sendcmd(0x18); Usart_SendByte(AS608_USART,NotePageNum); for(i=0;i8); Usart_SendByte(AS608_USART,StartPage); Usart_SendByte(AS608_USART,PageNum>>8); Usart_SendByte(AS608_USART,PageNum); temp = 0x01+0x08+0x1b+BufferID+(StartPage>>8)+(u8)StartPage+(PageNum>>8)+(u8)PageNum; SendCheck(temp); data = JudgeStr(2000); if(data) { ensure = data[9]; p->pageID = (data[10]



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3