[应用相关] STM32单片机开发光学指纹识别模块(FPM10A)

[复制链接]
1663|41
 楼主| gaonaiweng 发表于 2022-4-30 12:37 | 显示全部楼层

下面我附上基于STM32单片机光学指纹识别模块(FPM10A)打包好的函数库

第一个是 FPM10A.c
  1. view source
  2. print?
  3. 001.
  4. #include "stm32f10x.h"
  5. 002.
  6. #include "stm32f10x_usart.h"
  7. 003.
  8. #include "misc.h"
  9. 004.
  10. unsigned
  11. char
  12. dat[18];
  13. 005.
  14. 006.
  15. //FINGERPRINT通信协议定义
  16. 007.
  17. unsigned
  18. char
  19. FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};
  20. //协议包头
  21. 008.
  22. unsigned
  23. char
  24. FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};
  25. //获得指纹图像
  26. 009.
  27. unsigned
  28. char
  29. FP_Templete_Num[6] ={0x01,0x00,0x03,0x1D,0x00,0x21 };
  30. //获得模版总数
  31. 010.
  32. unsigned
  33. char
  34. FP_Search[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x03,0xA1,0x0,0xB2};
  35. //搜索指纹搜索范围0 - 929
  36. 011.
  37. unsigned
  38. char
  39. FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21};
  40. //搜索0-9号指纹
  41. 012.
  42. unsigned
  43. char
  44. FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08};
  45. //将图像放入到BUFFER1
  46. 013.
  47. unsigned
  48. char
  49. FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09};
  50. //将图像放入到BUFFER2
  51. 014.
  52. unsigned
  53. char
  54. FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09};
  55. //将BUFFER1跟BUFFER2合成特征模版
  56. 015.
  57. unsigned
  58. char
  59. FP_Delet_All_Model[6]={0x01,0x0,0x03,0x0d,0x00,0x11};
  60. //删除指纹模块里所有的模版
  61. 016.
  62. unsigned
  63. char
  64. FP_Save_Finger[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};
  65. //将BUFFER1中的特征码存放到指定的位置
  66. 017.
  67. unsigned
  68. char
  69. FP_Delete_Model[10]={0x01,0x00,0x07,0x0C,0x0,0x0,0x0,0x1,0x0,0x0};
  70. //删除指定的模版
  71. 018.
  72. 019.
  73. 020.
  74. //从 USART1 发送一个字节
  75. 021.
  76. void
  77. USART1_SendByte(unsigned
  78. char
  79. temp)
  80. 022.
  81. {
  82. 023.
  83. USART_SendData(USART1, temp);
  84. 024.
  85. while
  86. (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
  87. 025.
  88. }
  89. 026.
  90. 027.
  91. //从 USART1 读取一个字节
  92. 028.
  93. unsigned
  94. char
  95. USART1_ReceivByte()
  96. 029.
  97. {
  98. 030.
  99. unsigned
  100. char
  101. recev;
  102. 031.
  103. while
  104. (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
  105. 032.
  106. recev = USART_ReceiveData(USART1);
  107. 033.
  108. return
  109. recev;
  110. 034.
  111. }
  112. 035.
  113. //FINGERPRINT命令字
  114. 036.
  115. //FINGERPRINT_获得指纹图像命令
  116. 037.
  117. void
  118. FINGERPRINT_Cmd_Get_Img(
  119. void
  120. )
  121. 038.
  122. {
  123. 039.
  124. unsigned
  125. char
  126. i;
  127. 040.
  128. 041.
  129. for
  130. (i=0;i<6;i++)
  131. //发送包头
  132. 042.
  133. USART1_SendByte(FP_Pack_Head[i]);
  134. 043.
  135. 044.
  136. for
  137. (i=0;i<6;i++)
  138. //发送命令 0x1d
  139. 045.
  140. USART1_SendByte(FP_Get_Img[i]);
  141. 046.
  142. 047.
  143. for
  144. (i=0;i<12;i++)
  145. //读回应答信息
  146. 048.
  147. dat[i]=USART1_ReceivByte();
  148. 049.
  149. }
  150. 050.
  151. 051.
  152. //删除所有指纹模版
  153. 052.
  154. void
  155. FINGERPRINT_Cmd_Delete_All_Model(
  156. void
  157. )
  158. 053.
  159. {
  160. 054.
  161. unsigned
  162. char
  163. i;
  164. 055.
  165. 056.
  166. for
  167. (i=0;i<6;i++)
  168. //发送包头
  169. 057.
  170. USART1_SendByte(FP_Pack_Head[i]);
  171. 058.
  172. 059.
  173. for
  174. (i=0;i<6;i++)
  175. //发送命令 0x1d
  176. 060.
  177. USART1_SendByte(FP_Delet_All_Model[i]);
  178. 061.
  179. 062.
  180. for
  181. (i=0;i<12;i++)
  182. //读回应答信息
  183. 063.
  184. dat[i]=USART1_ReceivByte();
  185. 064.
  186. }
  187. 065.
  188. 066.
  189. //讲图像转换成特征码存放在Buffer1中
  190. 067.
  191. void
  192. FINGERPRINT_Cmd_Img_To_Buffer1(
  193. void
  194. )
  195. 068.
  196. {
  197. 069.
  198. unsigned
  199. char
  200. i;
  201. 070.
  202. for
  203. (i=0;i<6;i++)
  204. //发送包头
  205. 071.
  206. {
  207. 072.
  208. USART1_SendByte(FP_Pack_Head[i]);
  209. 073.
  210. }
  211. 074.
  212. for
  213. (i=0;i<7;i++)
  214. //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  215. 075.
  216. {
  217. 076.
  218. USART1_SendByte(FP_Img_To_Buffer1[i]);
  219. 077.
  220. }
  221. 078.
  222. for
  223. (i=0;i<12;i++)
  224. //读应答信息
  225. 079.
  226. {
  227. 080.
  228. dat[i]=USART1_ReceivByte();
  229. //把应答数据存放到缓冲区
  230. 081.
  231. }
  232. 082.
  233. }
  234. 083.
  235. 084.
  236. //将图像转换成特征码存放在Buffer2中
  237. 085.
  238. void
  239. FINGERPRINT_Cmd_Img_To_Buffer2(
  240. void
  241. )
  242. 086.
  243. {
  244. 087.
  245. unsigned
  246. char
  247. i;
  248. 088.
  249. for
  250. (i=0;i<6;i++)
  251. //发送包头
  252. 089.
  253. {
  254. 090.
  255. USART1_SendByte(FP_Pack_Head[i]);
  256. 091.
  257. }
  258. 092.
  259. 093.
  260. for
  261. (i=0;i<7;i++)
  262. //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  263. 094.
  264. {
  265. 095.
  266. USART1_SendByte(FP_Img_To_Buffer2[i]);
  267. 096.
  268. }
  269. 097.
  270. for
  271. (i=0;i<12;i++)
  272. 098.
  273. {
  274. 099.
  275. dat[i]=USART1_ReceivByte();
  276. //读回应答信息
  277. 100.
  278. }
  279. 101.
  280. }
  281. 102.
  282. 103.
  283. //将BUFFER1 跟 BUFFER2 中的特征码合并成指纹模版
  284. 104.
  285. void
  286. FINGERPRINT_Cmd_Reg_Model(
  287. void
  288. )
  289. 105.
  290. {
  291. 106.
  292. unsigned
  293. char
  294. i;
  295. 107.
  296. 108.
  297. for
  298. (i=0;i<6;i++)
  299. //包头
  300. 109.
  301. {
  302. 110.
  303. USART1_SendByte(FP_Pack_Head[i]);
  304. 111.
  305. }
  306. 112.
  307. 113.
  308. for
  309. (i=0;i<6;i++)
  310. //命令合并指纹模版
  311. 114.
  312. {
  313. 115.
  314. USART1_SendByte(FP_Reg_Model[i]);
  315. 116.
  316. }
  317. 117.
  318. 118.
  319. for
  320. (i=0;i<12;i++)
  321. 119.
  322. {
  323. 120.
  324. dat[i]=USART1_ReceivByte();
  325. 121.
  326. }
  327. 122.
  328. }
  329. 123.
  330. 124.
  331. //存储模版到特定地址
  332. 125.
  333. void
  334. FINGERPRINT_Cmd_Save_Finger( unsigned
  335. char
  336. ucH_Char, unsigned
  337. char
  338. ucL_Char)
  339. 126.
  340. {
  341. 127.
  342. unsigned
  343. long
  344. temp = 0;
  345. 128.
  346. unsigned
  347. char
  348. i;
  349. 129.
  350. 130.
  351. FP_Save_Finger[5] = ucH_Char;
  352. 131.
  353. FP_Save_Finger[6] = ucL_Char;
  354. 132.
  355. 133.
  356. 134.
  357. for
  358. (i=0;i<7;i++)
  359. //计算校验和
  360. 135.
  361. temp = temp + FP_Save_Finger[i];
  362. 136.
  363. 137.
  364. FP_Save_Finger[7]=(temp & 0x00FF00) >> 8;
  365. //存放校验数据
  366. 138.
  367. FP_Save_Finger[8]= temp & 0x0000FF;
  368. 139.
  369. 140.
  370. 141.
  371. for
  372. (i=0;i<6;i++)
  373. 142.
  374. USART1_SendByte(FP_Pack_Head[i]);
  375. //发送包头
  376. 143.
  377. 144.
  378. for
  379. (i=0;i<9;i++)
  380. 145.
  381. USART1_SendByte(FP_Save_Finger[i]);
  382. //发送命令 将图像转换成 特征码 存放在 CHAR_buffer1
  383. 146.
  384. 147.
  385. for
  386. (i=0;i<12;i++)
  387. 148.
  388. dat[i]=USART1_ReceivByte();
  389. 149.
  390. }
  391. 150.
  392. 151.
  393. //获得指纹模板数量
  394. 152.
  395. void
  396. FINGERPRINT_Cmd_Get_Templete_Num(
  397. void
  398. )
  399. 153.
  400. {
  401. 154.
  402. unsigned
  403. int
  404. i;
  405. 155.
  406. 156.
  407. for
  408. (i=0;i<6;i++)
  409. //包头
  410. 157.
  411. USART1_SendByte(FP_Pack_Head[i]);
  412. 158.
  413. 159.
  414. //发送命令 0x1d
  415. 160.
  416. for
  417. (i=0;i<6;i++)
  418. 161.
  419. USART1_SendByte(FP_Templete_Num[i]);
  420. 162.
  421. 163.
  422. for
  423. (i=0;i<12;i++)
  424. 164.
  425. dat[i]=USART1_ReceivByte();
  426. 165.
  427. }
  428. 166.
  429. 167.
  430. //搜索全部用户999枚
  431. 168.
  432. void
  433. FINGERPRINT_Cmd_Search_Finger(
  434. void
  435. )
  436. 169.
  437. {
  438. 170.
  439. unsigned
  440. char
  441. i;
  442. 171.
  443. //发送命令搜索指纹库
  444. 172.
  445. for
  446. (i=0;i<6;i++)
  447. 173.
  448. {
  449. 174.
  450. USART1_SendByte(FP_Pack_Head[i]);
  451. 175.
  452. }
  453. 176.
  454. 177.
  455. for
  456. (i=0;i<11;i++)
  457. 178.
  458. {
  459. 179.
  460. USART1_SendByte(FP_Search[i]);
  461. 180.
  462. }
  463. 181.
  464. 182.
  465. for
  466. (i=0;i<16;i++)
  467. 183.
  468. {
  469. 184.
  470. dat[i]=USART1_ReceivByte();
  471. 185.
  472. }
  473. 186.
  474. }
  475. 187.
  476. 188.
  477. //搜索用户0~9枚
  478. 189.
  479. void
  480. FINGERPRINT_Cmd_Search_Finger_Admin(
  481. void
  482. )
  483. 190.
  484. {
  485. 191.
  486. unsigned
  487. char
  488. i;
  489. 192.
  490. for
  491. (i=0;i<6;i++)
  492. //发送命令搜索指纹库
  493. 193.
  494. {
  495. 194.
  496. USART1_SendByte(FP_Pack_Head[i]);
  497. 195.
  498. }
  499. 196.
  500. 197.
  501. for
  502. (i=0;i<11;i++)
  503. 198.
  504. {
  505. 199.
  506. USART1_SendByte(FP_Search_0_9[i]);
  507. 200.
  508. }
  509. 201.
  510. 202.
  511. for
  512. (i=0;i<12;i++)
  513. 203.
  514. dat[i]=USART1_ReceivByte();
  515. 204.
  516. }
  517. 205.
  518. 206.
  519. //添加一个新的指纹
  520. 207.
  521. unsigned
  522. char
  523. FP_add_new_user(unsigned
  524. char
  525. ucH_user,unsigned
  526. char
  527. ucL_user)
  528. 208.
  529. {
  530. 209.
  531. do
  532. 210.
  533. {
  534. 211.
  535. FINGERPRINT_Cmd_Get_Img();
  536. //获得指纹图像
  537. 212.
  538. }
  539. while
  540. ( dat[9]!=0x0 );
  541. //检测是否成功的按了指纹
  542. 213.
  543. 214.
  544. FINGERPRINT_Cmd_Img_To_Buffer1();
  545. //将图像转换成特征码存放在Buffer1中
  546. 215.
  547. 216.
  548. do
  549. 217.
  550. {
  551. 218.
  552. FINGERPRINT_Cmd_Get_Img();
  553. //获得指纹图像
  554. 219.
  555. }
  556. while
  557. ( dat[9]!=0x0 );
  558. 220.
  559. 221.
  560. FINGERPRINT_Cmd_Img_To_Buffer2();
  561. //将图像转换成特征码存放在Buffer2中
  562. 222.
  563. 223.
  564. FINGERPRINT_Cmd_Reg_Model();
  565. //转换成特征码
  566. 224.
  567. 225.
  568. FINGERPRINT_Cmd_Save_Finger(ucH_user,ucL_user);
  569. 226.
  570. 227.
  571. return
  572. 0;
  573. 228.
  574. }
 楼主| gaonaiweng 发表于 2022-4-30 12:37 | 显示全部楼层
第2个 FPM10A.h


view source
print?
  1. 01.
  2. #ifndef _FPM10A_H
  3. 02.
  4. #define _FPM10A_H
  5. 03.
  6. #include <stdint.h>
  7. 04.
  8. 05.
  9. extern
  10. unsigned
  11. char
  12. dat[18];
  13. 06.
  14. 07.
  15. extern
  16. void
  17. FINGERPRINT_Cmd_Get_Img();
  18. 08.
  19. extern
  20. void
  21. FINGERPRINT_Cmd_Img_To_Buffer1();
  22. 09.
  23. extern
  24. void
  25. FINGERPRINT_Cmd_Img_To_Buffer2();
  26. 10.
  27. extern
  28. void
  29. FINGERPRINT_Cmd_Reg_Model();
  30. 11.
  31. extern
  32. void
  33. FINGERPRINT_Cmd_Delete_All_Model(
  34. void
  35. );
  36. 12.
  37. extern
  38. void
  39. FINGERPRINT_Cmd_Search_Finger(
  40. void
  41. );
  42. 13.
  43. extern
  44. void
  45. FINGERPRINT_Cmd_Get_Templete_Num(
  46. void
  47. );
  48. 14.
  49. extern
  50. void
  51. FINGERPRINT_Cmd_Search_Finger_Admin(
  52. void
  53. );
  54. 15.
  55. extern
  56. void
  57. FINGERPRINT_Cmd_Save_Finger( unsigned
  58. char
  59. ucH_Char, unsigned
  60. char
  61. ucL_Char);
  62. 16.
  63. extern
  64. unsigned
  65. char
  66. FP_add_new_user(unsigned
  67. char
  68. ucH_user,unsigned
  69. char
  70. ucL_user);
  71. 17.
  72. 18.
  73. 19.
  74. extern
  75. void
  76. USART1_SendByte(unsigned
  77. char
  78. temp);
  79. 20.
  80. extern
  81. unsigned
  82. char
  83. USART1_ReceivByte();
  84. 21.
  85. 22.
  86. extern
  87. void
  88. Delay_ms1(uint32_t nCount);
  89. 23.
  90. 24.
  91. void
  92. Delay_nus1(uint32_t nCount)
  93. 25.
  94. {
  95. 26.
  96. uint32_t j;
  97. 27.
  98. while
  99. (nCount--)
  100. 28.
  101. {
  102. 29.
  103. j=8;
  104. 30.
  105. while
  106. (j--);
  107. 31.
  108. }
  109. 32.
  110. }
  111. 33.
  112. 34.
  113. void
  114. Delay_ms1(uint32_t nCount)
  115. 35.
  116. {
  117. 36.
  118. while
  119. (nCount--)
  120. 37.
  121. Delay_nus1(1100);
  122. 38.
  123. }
  124. 39.
  125. 40.
  126. unsigned
  127. char
  128. test_fig()
  129. //检测指纹模块录入指纹情况,返回00表示录入成功;02无手指;03录入失败
  130. 41.
  131. {
  132. 42.
  133. unsigned
  134. char
  135. fig_dat;
  136. 43.
  137. FINGERPRINT_Cmd_Get_Img();
  138. 44.
  139. Delay_ms1(20);
  140. 45.
  141. fig_dat=dat[9];
  142. 46.
  143. return
  144. (fig_dat);
  145. 47.
  146. }
  147. 48.
  148. 49.
  149. #endif

有了这两个东西,加入到你的工程中,就可以直接调用啦!

Uriah 发表于 2022-10-6 10:30 | 显示全部楼层

一般要进行内存优化,尽量提高内存的使用效率
Bblythe 发表于 2022-10-6 13:29 | 显示全部楼层

对于没有else的场景,使用ifPresent即可
Pulitzer 发表于 2022-10-6 16:28 | 显示全部楼层

需要在做项目的过程中经历磨难
Clyde011 发表于 2023-5-1 07:31 | 显示全部楼层

这是个再正常不过的coding习惯
万图 发表于 2023-5-1 09:27 | 显示全部楼层

你懂其原理才能让你在行业中走的更远
Uriah 发表于 2023-5-1 10:30 | 显示全部楼层

事实上很多做项目的工程师本身自己也会在用
帛灿灿 发表于 2023-5-1 12:26 | 显示全部楼层

脚本猛于老虎
Bblythe 发表于 2023-5-1 13:29 | 显示全部楼层

I2C1的时钟可以自行选择HSI或者SYSCLK
周半梅 发表于 2023-5-1 15:25 | 显示全部楼层

Git 是程序员学习和工作都离不开发工具
Pulitzer 发表于 2023-5-1 16:28 | 显示全部楼层

PCB的制造过程由玻璃环氧树脂(Glass Epoxy)或类似材质制成的PCB“基板”开始
周半梅 发表于 2023-5-1 17:31 | 显示全部楼层

超过变量128后必须使用compact模式编译
童雨竹 发表于 2023-5-1 18:24 | 显示全部楼层

If-Else 通常是一个糟糕的选择
Wordsworth 发表于 2023-5-1 19:27 | 显示全部楼层

通过OV7670摄像头进行图像采集
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部