[STM32-HAL库]AS608-指纹识别模块-STM32CUBEMX开发-HAL库开发系列-主控STM32F103C8T6

目录

一、前言

二、详细步骤

        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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/13529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[力扣题解] 797. 所有可能的路径

题目&#xff1a;797. 所有可能的路径 思路 深度搜索 代码 // 图论哦!class Solution { private:vector<vector<int>> result;vector<int> path;// x : 当前节点void function(vector<vector<int>>& graph, int x){int i;// cout <&l…

解决鼠标滚动时element-ui日期选择器错位的问题

解决方案&#xff1a;监听鼠标滚动事件&#xff0c;在鼠标滚动时隐藏element-ui日期选择器下拉框 1、先在util文件夹下创建个hidePicker.js文件&#xff0c;代码如下&#xff1a; let el nullconst fakeClickOutSide () > {const SELECTWRAP_BODY document.body // bod…

Day37 贪心算法part04

LC860柠檬水找零(未掌握) 未掌握分析&#xff1a;20的时候找零卡住&#xff0c;同时贪心思路就想了很久 当bill[i]20的时候&#xff0c;我们有两种找零范式&#xff0c;找零10、5和找零三个5&#xff0c;优先找零10、5&#xff0c;因为三个5是可以替代10、5的情况的&#xff0…

Nebula街机模拟器 Mac移植版(400+游戏roms)汉化版

nebula星云模拟器是电脑上最热门的街机游戏模拟器之一&#xff0c;玩家可以通过这个小巧的模拟器软件进行多款经典街机游戏启动和畅玩&#xff0c;本次移植的包含400多款游戏roms&#xff0c;经典的三国志、三国战纪、拳皇、街霸、合金弹头、1941都包含在内。 下载地址&#xf…

CompletableFuture的主要用途是什么?

CompletableFuture 的主要用途是为复杂的异步编程模型提供一种更简单&#xff0c;更具可读性的方式。它主要用于以下几个方面&#xff1a; 非阻塞计算&#xff1a;CompletableFuture 为处理高延迟的计算任务提供了非阻塞的解决方案。你可以启动一个计算任务&#xff0c;而不需要…

前端 CSS 经典:好看的标题动画

前言&#xff1a;好看的标题动画实现。 效果&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><…

YOLOv5 AssertionError: “XXX” acceptable suffix is [‘.pt‘]

使用终端训练YOLOv5模型报错&#xff0c;原命令为&#xff1a; “python train.py --img 640 --batch 1 --epochs 25 --data "C:\Users\GRT\PycharmProjects\yolov5-7.0\animal_training\dataset.yaml " --weights “C:\Users\GRT\PycharmProjects\yolov5-7.0\MyFunc…

组播协议简介

一、组播协议介绍 组播协议是一种网络通信协议&#xff0c;它允许一个发送者同时向多个接收者发送数据。以下是组播协议的一些特点&#xff1a; 高效性&#xff1a;组播协议可以有效地利用网络带宽&#xff0c;因为它只需要发送一份数据副本&#xff0c;就可以被多个接收者同…

蓝桥楼赛第30期-Python-第三天赛题 从参数中提取信息题解

楼赛 第30期 Python 模块大比拼 提取用户输入信息 介绍 正则表达式&#xff08;英文为 Regular Expression&#xff0c;常简写为regex、regexp 或 RE&#xff09;&#xff0c;也叫规则表达式、正规表达式&#xff0c;是计算机科学的一个概念。 所谓“正则”&#xff0c;可以…

docker swarm多主机之间的端口无法访问,但能ping通 问题排查及解决

已排查&#xff1a;1.ufw status 防火墙已关闭 2.selinux已关闭 3.netstat -ntpl :::8088 未限制ip 问题&#xff1a;docker swarm多主机之间的端口无法访问&#xff0c;但能ping通&#xff0c;同一主机下的端口也可以访问。 原因&#xff1a;docker overlay网络内部使用…

【Linux取经路】初识线程——线程控制

文章目录 一、什么是线程&#xff1f;1.1 Linux 中线程该如何理解&#xff1f;1.2 如何理解把资源分配给线程&#xff1f;1.2.1 虚拟地址到物理地址的转换 1.3 线程 VS 进程1.3.1 线程为什么比进程更轻量化&#xff1f;1.3.2 线程的优点1.3.3 线程缺点1.3.4 线程异常1.3.5 线程…

关于基础的流量分析(1)

1.对于流量分析基本认识 1&#xff09;简介&#xff1a;网络流量分析是指捕捉网络中流动的数据包&#xff0c;并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 2&#xff09;在我们平时的考核和CTF比赛中&#xff0c;基本每次都有…

MySQL用户管理操作

用户权限管理操作 DCL语句 一.用户管理操作 MySQL软件内部完整的用户格式&#xff1a; 用户名客户端地址 admin1.1.1.1这个用户只能从1.1.1.1的客服端来连接服务器 admin1.1.1.2这个用户只能从1.1.1.2的客服端来连接服务器 rootlocal host这个用户只能从服务器本地进行连…

Prompt - 流行的10个框架

转载自&#xff1a;https://juejin.cn/post/7287412759050289212 文章目录 1、ICIO框架2、CRISPE框架3、BROKE框架4、CREATE框架5、TAG框架6、RTF框架7、ROSES框架8、APE框架9、RACE框架10、TRACE框架 测试用例 为了看到不同的Prompt框架效果&#xff0c;本文定义一个统一的测…

ACM实训

【碎碎念】继续搞习题学习&#xff0c;今天完成第四套的ABCD&#xff0c;为下一周挤出时间复习&#xff0c;加油 Digit Counting 问题 法希姆喜欢解决数学问题。但有时解决所有的数学问题对他来说是一个挑战。所以有时候他会为了解决数学难题而生气。他拿起一支粉笔&#xff…

Java面试八股之进程和线程的区别

Java进程和线程的区别 定义与作用&#xff1a; 进程&#xff1a;在操作系统中&#xff0c;进程是程序执行的一个实例&#xff0c;是资源分配的最小单位。每个进程都拥有独立的内存空间&#xff0c;包括代码段、数据段、堆空间和栈空间&#xff0c;以及操作系统分配的其他资源…

工厂模式(简单工厂模式+工厂模式)

工厂模式的目的就是将对象的创建过程隐藏起来&#xff0c;从而达到很高的灵活性&#xff0c;工厂模式分为三类&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 在没有工厂模式的时候就是&#xff0c;客户需要一辆马车&#xff0c;需要客户亲自去创建一辆马车&#xff0c;…

PDF之Blend Mode(混合模式)BM(对应OFD的BlendMode)

Blend Mode&#xff08;混合模式&#xff09;用于定义对象与背景或其他对象之间的颜色混合方式。PDF支持多种混合模式&#xff0c;常见的混合模式包括&#xff1a; Normal&#xff1a;正常混合模式&#xff0c;将对象颜色直接叠加在背景上。 Multiply&#xff1a;乘法混合模式…

经验分享:C++ error:‘syscall’ was not declared in this scope

明明已经加了头文件 #include <sys/syscall.h>#define gettid() syscall(__NR_gettid)但是依旧不能使用 syscall() 函数&#xff0c; 检查源码后&#xff1a; sys/syscall.h 内部表示&#xff0c;他封装了 打开对应的 syscall.h 文件内部依旧没有 syscall()函数的声明…

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…