实验平台:智能场景应用实训箱‑STM32L4
开发环境:Keil5,LiteOS操作系统,串口调试工具,TFT液晶屏
核心技术:LiteOS多任务、UART串口通信、指纹模块驱动、生物特征录入与比对

前言

本次开展生物识别指纹实验,和之前RFID射频卡实验不一样,RFID依靠卡片硬件存储信息,而指纹识别属于生物特征识别,采集人的指纹特征点完成录入、比对、搜索。实验基于华为LiteOS操作系统开发,使用多任务架构,完成指纹录入、指纹比对、指纹库查询删除等功能,运行结果既可以在TFT液晶屏本地显示,也能够通过串口打印操作日志。从理论到动手调试,踩了不少实操方面的坑,在这里记录知识点、代码逻辑和个人实验心得。

📚核心知识点梳理

  1. LiteOS操作系统多任务机制
    本实验采用鸿蒙LiteOS RTOS实时操作系统,不再是传统裸机while大循环。将不同业务拆分为独立任务,各个任务并行调度,互不阻塞。分别包含控制任务、显示任务、指纹处理任务,实现业务解耦。

  2. 指纹识别模块工作原理
    指纹模块采集指纹图像,提取指纹特征点信息,把特征数据保存到模块内部指纹库。

  • 指纹录入:需要两次按压指纹,对比两次指纹特征,确认是同一枚指纹后,分配ID存入指纹库;
  • 指纹比对:采集当前指纹特征,和库内已存储特征做比对,匹配成功输出正确标识;匹配失败返回错误;
  • 支持查询剩余指纹库容量、删除指定指纹等管理操作。
  1. UART串口通信
    主控STM32和指纹模块依靠串口交互指令,下发录入、比对、删除指令;同时串口把运行日志输出到PC调试工具,方便我们观察执行状态,TFT屏幕实现本地可视化提示。

💻关键程序逻辑讲解

程序入口位于main.c,系统上电之后,先完成硬件底层初始化,再进行LiteOS操作系统初始化,接着创建三个业务任务,最后启动操作系统。

int main(void)
{
    UINT32 uwRet = LOS_OK;
    HAL_Init();         //硬件初始化
    sysclkinit();       //系统时钟初始化
    task_view_init();   //显示任务初始化
    task_control_init();//控制任务初始化
    task_finger_init(); //指纹任务初始化
    
    uwRet = LOS_KernelInit(); //操作系统初始化
    if (uwRet != LOS_OK)
    {
        return LOS_NOK;
    }
    //创建控制任务
    uwRet = creat_control_task();
    //创建显示任务
    uwRet = creat_view_task();
    //创建指纹处理任务
    uwRet = creat_finger_task();
    
    LOS_Start(); //启动LiteOS操作系统
    while (1);
}
  1. 任务分工
  • control_task控制任务:负责按键扫描、系统状态管理,检测按键,切换指纹录入、比对、删除等工作模式;
  • finger_task指纹任务:周期性和指纹模块串口交互,下发指令,处理指纹采集、特征比对、库管理,接收模块返回结果;
  • view_task显示任务:将操作状态、提示信息输出到TFT液晶屏。
  1. 指纹录入逻辑
    切换到录入模式,程序通过串口向指纹模块发送录入指令,提示用户第一次按下手指;采集完成后提示抬起手指,再次按压采集第二组指纹。模块对比两次指纹特征,如果两份指纹特征一致,则完成录入,分配指纹ID存入指纹库;两次指纹不一致,则录入失败,需要重新操作。串口打印Two fingerprint are same即代表两次采集指纹匹配成功。

  2. 指纹比对识别逻辑
    进入识别模式,用户放置手指,模块采集指纹特征,将当前特征和内部指纹库逐一比对。匹配成功串口输出Fingerprint correct,屏幕显示识别成功以及对应的指纹ID;匹配失败返回识别错误提示。

  3. 指纹库管理
    程序支持读取指纹库剩余存储数量,也可以根据指纹ID删除已经录入的指纹;删除完成之后串口打印执行结果,更新指纹库容量信息。

整体流程:硬件与OS初始化 → 多任务创建启动 → 按键切换工作模式 → 下发串口指令给指纹模块 → 采集指纹/比对指纹 → 将结果同时输出串口、TFT屏幕。

🔧实验踩坑与问题排查

实验调试过程并不是一帆风顺,遇到两个典型问题,耗费不少时间调试。

问题1:指纹模块无响应,串口没有任何返回信息

现象:程序正常运行,LED、屏幕都可以正常工作,但是按压指纹,串口没有任何指纹模块反馈日志。
排查:一开始怀疑任务调度逻辑出错,反复查看creat_finger_task()任务创建代码。后面排查硬件,发现指纹模块插座虚接,串口引脚接触不良,主控无法和指纹模块通信。

解决:重新把指纹模块接口按压牢固,保证引脚接触,模块可以正常接收指令,串口可以输出打印日志。

心得:RTOS实验,屏幕、LED正常工作,只能说明主控运行正常,不能代表外设模块通信正常,外设接口松动是嵌入式高频故障。

问题2:指纹录入反复失败,提示两次指纹不一致

现象:录入指纹的时候,连续多次按压手指,一直提示两次指纹不相同,无法完成录入。
排查:操作的时候,两次放手指的角度、位置偏移过大,指纹采集区域按压不全,导致两次采集得到的指纹特征差异大。

解决:录入指纹时手指尽量放平,两次按压尽量保持手指位置、角度一致,保证采集完整指纹图像,即可录入成功。

✨实验现象

  1. 系统上电,LiteOS操作系统启动,屏幕点亮,各个任务正常运行,等待按键操作;
  2. 切换指纹录入模式,屏幕、串口提示放置手指;第一次按压,抬起后再次按压,当串口打印Two fingerprint are same,代表两次指纹匹配,录入成功,分配指纹ID;
  3. 识别模式下,放置已经录入的指纹,串口打印Fingerprint correct,屏幕显示识别成功;放置未录入指纹,识别失败;
  4. 可以读取指纹库剩余数量,执行删除指纹操作,指纹库数量同步更新;
  5. 硬件接触不良、按压指纹位置偏移时,会出现采集失败、识别失败,程序不会卡死,继续等待用户操作。

📝实验个人心得

本次生物识别实验,让我体会到RTOS实时操作系统在嵌入式项目中的优势。使用LiteOS拆分多任务,显示、控制、指纹处理分开运行,相比裸机大循环,程序结构更加清晰,方便后期维护扩展。

之前做RFID实验依靠卡片硬件存储标识,而指纹属于生物特征,信息来源于人体本身。指纹录入需要多次采集比对特征,对操作姿势有要求,这也是生物识别和射频识别很大的区别。调试时串口日志起到非常关键的作用,通过串口打印返回信息,能够快速区分是硬件通信故障,还是指纹采集本身的问题。

同时我也意识到生物识别的短板:手指有污渍、破皮、按压位置偏移,都会直接造成识别失败。硬件接口松动、串口参数不匹配,同样会让整个功能失效。嵌入式开发,软件算法、操作系统固然重要,但是外设硬件、实际使用场景的限制也必须考虑。

小结:不管是RTOS多任务开发,还是生物识别外设驱动,调试要分层定位,先确认硬件通信正常,再去分析业务逻辑,减少无效调试时间。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐