STM32——NFC门禁模块(RC522)

article/2025/8/23 1:22:45

文章目录

  • 1. 前言(包括一些个人理解)
  • 2. RC522门禁工作过程
  • 3. CubeMx配置
    • 3.1 SPI通讯的配置
    • 3.2 SDA和REST引脚的配置
  • 4. 外设代码函数编写
    • 4.1 主函数能调用的接口函数
    • 4.2 二级内部调用函数
    • 4.3 第三级最底层函数
    • 4.4 头文件
  • 5. 使用教程

1. 前言(包括一些个人理解)

(2021/11/1编辑)
在项目需要做一个NFC门禁功能的时候,突然发现有个RC522丢在我的桌面,甚至不知道它上面的引脚什么意思(还不会SPI通讯),搜索关键词“RC522”去看博客搜索资料,发现了很多都在说扇区,块,S50(M1)卡,然后就给代码,一开始我还以为S50是内嵌在这个模块里面的一个存储器,然后越看越怪,后面去淘宝搜索S50,才发现S50其实是我们的门禁卡,RC522是用来感应和判断的。
为了认清楚什么是S50,和RC522的关系
(2021/11/5编辑)

  • PCD是接近式卡。PICC是接近式耦合设备。
  • 在通信过程中实际上是使用PCD命令控制RC522发出PICC命令与卡进行交互。

2. RC522门禁工作过程

RC522工作流程图

  • 过程:寻卡->防冲突->选卡->操作卡
  • PCD命令
/*MFRC522命令集,中文手册P59*/
#define MFRC_IDLE              		0x00	//取消当前命令的执行
#define MFRC_TRANSMIT          		0x04    //发送FIFO缓冲区内容
#define MFRC_RECEIVE           		0x08    //激活接收器接收数据
#define MFRC_TRANSCEIVE        		0x0C    //发送并接收数据
#define MFRC_AUTHENT           		0x0E    //执行Mifare认证(验证密钥)
#define MFRC_RESETPHASE        		0x0F    //复位MFRC522
#define MFRC_CALCCRC           		0x03    //激活CRC计算
#define MFRC_NOCMDCHANGE            0x07	//无命令改变
  • PICC命令
/*Mifare1卡片命令字*/
#define PICC_REQIDL           	0x26        //寻天线区内未进入休眠状态的卡
#define PICC_REQALL           	0x52        //寻天线区内全部卡
#define PICC_ANTICOLL1        	0x93        //防冲撞
#define PICC_ANTICOLL2        	0x95        //防冲撞
#define PICC_AUTHENT1A        	0x60        //验证A密钥
#define PICC_AUTHENT1B        	0x61        //验证B密钥
#define PICC_READ             	0x30        //读块
#define PICC_WRITE            	0xA0        //写块
#define PICC_DECREMENT        	0xC0        //减值(扣除)
#define PICC_INCREMENT        	0xC1        //增值(充值)
#define PICC_TRANSFER         	0xB0        //转存(传送)
#define PICC_RESTORE          	0xC2        //恢复(重储)
#define PICC_HALT             	0x50        //休眠

3. CubeMx配置

3.1 SPI通讯的配置

SPI配置
打开SPI模式设置为:Full-Duplex Master(全双工主机模式)

  • 分频设置为8~256都行,这样随之波特率也会改变,波特率越小通信速度越快
  • Clock Phase (CPHA) 设置为第一个上升沿这里一定要1Edge
  • 不开启CRC检测

3.2 SDA和REST引脚的配置

在这里插入图片描述
随后再定义两个普通的OUTPUT输出的引脚作为复位和使能引脚

4. 外设代码函数编写

4.1 主函数能调用的接口函数

  • 初始化
/***************************************************************************************
* 函数名称:PCD_Init
* 功能描述:读写器初始化
* 入口参数:无
* 出口参数:无
* 返 回 值:无
* 说    明:无
***************************************************************************************/
void PCD_Init(void)
{MFRC_Init();      //MFRC管脚配置PCD_Reset();      //PCD复位  并初始化配置PCD_AntennaOff(); //关闭天线PCD_AntennaOn();   //开启天线PCD_Reset();
}
  • 寻卡
/***************************************************************************************
* 函数名称:PCD_Request
* 功能描述:寻卡
* 入口参数: -RequestMode:寻卡方式
*                 PICC_REQIDL:寻天线区内未进入休眠状态
*                 PICC_REQALL:寻天线区内全部卡
*             -pCardType:用于保存卡片类型
* 出口参数:-pCardType:卡片类型
*                       0x4400:Mifare_UltraLight
*                       0x0400:Mifare_One(S50)
*                       0x0200:Mifare_One(S70)
*                       0x0800:Mifare_Pro(X)
*                       0x4403:Mifare_DESFire
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType)
{int status;uint16_t unLen;uint8_t CmdFrameBuf[MFRC_MAXRLEN];MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);//关内部温度传感器MFRC_WriteReg(MFRC_BitFramingReg, 0x07); //存储模式,发送模式,是否启动发送等MFRC_SetBitMask(MFRC_TxControlReg, 0x03);//配置调制信号13.56MHZCmdFrameBuf[0] = RequestMode;status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 1, CmdFrameBuf, &unLen);if((status == PCD_OK) && (unLen == 0x10)){*pCardType = CmdFrameBuf[0];*(pCardType + 1) = CmdFrameBuf[1];}return status;
}
  • 防冲撞
/***************************************************************************************
* 函数名称:PCD_Anticoll
* 功能描述:防冲突,获取卡号
* 入口参数:-pSnr:用于保存卡片序列号,4字节
* 出口参数:-pSnr:卡片序列号,4字节
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_Anticoll(uint8_t *pSnr)
{char status;uint8_t i, snr_check = 0;uint16_t  unLen;uint8_t CmdFrameBuf[MFRC_MAXRLEN];MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);MFRC_WriteReg(MFRC_BitFramingReg, 0x00);MFRC_ClrBitMask(MFRC_CollReg, 0x80);CmdFrameBuf[0] = PICC_ANTICOLL1;CmdFrameBuf[1] = 0x20;status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 2, CmdFrameBuf, &unLen);if(status == PCD_OK){for(i = 0; i < 4; i++){*(pSnr + i)  = CmdFrameBuf[i];snr_check ^= CmdFrameBuf[i];}if(snr_check != CmdFrameBuf[i]){status = PCD_ERR;}}switch (status){case PCD_OK:					printf("寻卡OK\r\n");break;case PCD_ERR:					printf("寻卡ERROR\r\n");break;case PCD_NOTAGERR:		printf("无卡\r\n");break;}MFRC_SetBitMask(MFRC_CollReg, 0x80);return status;
}

4.2 二级内部调用函数

  • 宏定义
//三目运算符true取前面那个
#define RS522_RST(N) HAL_GPIO_WritePin(RC522_RST_GPIO_Port, RC522_RST_Pin, N==1?GPIO_PIN_SET:GPIO_PIN_RESET)
#define RS522_NSS(N) HAL_GPIO_WritePin(RC522_CS_GPIO_Port, RC522_CS_Pin, N==1?GPIO_PIN_SET:GPIO_PIN_RESET)
#define osDelay HAL_Delay
  • MFRC管脚配置
/**************************************************************************************
* 函数名称:MFRC_Init
* 功能描述:MFRC初始化
* 入口参数:无
* 出口参数:无
* 返 回 值:无
* 说    明:MFRC的SPI接口速率为0~10Mbps
***************************************************************************************/
void MFRC_Init(void)
{RS522_NSS(1);RS522_RST(1);
}
  • PCD复位 并初始化配置
/**************************************************************************************
* 函数名称:PCD_Reset
* 功能描述:PCD复位
* 入口参数:无
* 出口参数:无
* 返 回 值:无
* 说    明:无
***************************************************************************************/
void PCD_Reset(void)
{/*硬复位*/RS522_RST(1);//用到我们的复位引脚osDelay(2);RS522_RST(0);osDelay(2);RS522_RST(1);osDelay(2);/*软复位*/MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);osDelay(2);/*复位后的初始化配置*/MFRC_WriteReg(MFRC_ModeReg, 0x3D);              //CRC初始值0x6363MFRC_WriteReg(MFRC_TReloadRegL, 30);            //定时器重装值MFRC_WriteReg(MFRC_TReloadRegH, 0);MFRC_WriteReg(MFRC_TModeReg, 0x8D);             //定时器设置MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E);        //定时器预分频值MFRC_WriteReg(MFRC_TxAutoReg, 0x40);            //100%ASKPCD_AntennaOff();                               //关天线osDelay(2);PCD_AntennaOn();                                //开天线
}
  • 关闭天线
/**************************************************************************************
* 函数名称:PCD_AntennaOn
* 功能描述:开启天线,使能PCD发送能量载波信号
* 入口参数:无
* 出口参数:无
* 返 回 值:无
* 说    明:每次开启或关闭天线之间应至少有1ms的间隔
***************************************************************************************/
void PCD_AntennaOn(void)
{uint8_t temp;temp = MFRC_ReadReg(MFRC_TxControlReg);if (!(temp & 0x03)){MFRC_SetBitMask(MFRC_TxControlReg, 0x03);}
}
  • 开启天线
/**************************************************************************************
* 函数名称:PCD_AntennaOff
* 功能描述:关闭天线,失能PCD发送能量载波信号
* 入口参数:无
* 出口参数:无
* 返 回 值:无
* 说    明:每次开启或关闭天线之间应至少有1ms的间隔
***************************************************************************************/
void PCD_AntennaOff(void)
{MFRC_ClrBitMask(MFRC_TxControlReg, 0x03);
}
  • RC与M1卡通讯帧函数
/**************************************************************************************
* 函数名称:MFRC_CmdFrame
* 功能描述:MFRC522和ISO14443A卡通讯的命令帧函数
* 入口参数:-cmd:MFRC522命令字
*           -pIndata:MFRC522发送给MF1卡的数据的缓冲区首地址
*           -InLenByte:发送数据的字节长度
*           -pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
*           -pOutLenBit:MF1卡返回数据的位长度
* 出口参数:-pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
*           -pOutLenBit:用于MF1卡返回数据位长度的首地址
* 返 回 值:-status:错误代码(MFRC_OK、MFRC_NOTAGERR、MFRC_ERR)
* 说    明:无
***************************************************************************************/
char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit)
{uint8_t lastBits;uint8_t n;uint32_t i;char status = MFRC_ERR;uint8_t irqEn   = 0x00;uint8_t waitFor = 0x00;/*根据命令设置标志位*/switch(cmd){case MFRC_AUTHENT:                  //Mifare认证irqEn = 0x12;waitFor = 0x10;                 //idleIRq中断标志break;case MFRC_TRANSCEIVE:               //发送并接收数据irqEn = 0x77;waitFor = 0x30;                 //RxIRq和idleIRq中断标志break;}/*发送命令帧前准备*/MFRC_WriteReg(MFRC_ComIEnReg, irqEn | 0x80);    //开中断MFRC_ClrBitMask(MFRC_ComIrqReg, 0x80);          //清除中断标志位SET1MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE);      //取消当前命令的执行MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80);       //清除FIFO缓冲区及其标志位/*发送命令帧*/for(i = 0; i < InLenByte; i++)                  //写入命令参数{MFRC_WriteReg(MFRC_FIFODataReg, pInData[i]);}MFRC_WriteReg(MFRC_CommandReg, cmd);            //执行命令if(cmd == MFRC_TRANSCEIVE){MFRC_SetBitMask(MFRC_BitFramingReg, 0x80);  //启动发送}i = 300000;                                     //根据时钟频率调整,操作M1卡最大等待时间25msdo{n = MFRC_ReadReg(MFRC_ComIrqReg);i--;}while((i != 0) && !(n & 0x01) && !(n & waitFor));     //等待命令完成MFRC_ClrBitMask(MFRC_BitFramingReg, 0x80);          //停止发送/*处理接收的数据*/if(i != 0){if(!(MFRC_ReadReg(MFRC_ErrorReg) & 0x1B)){status = MFRC_OK;if(n & irqEn & 0x01){status = MFRC_NOTAGERR;}if(cmd == MFRC_TRANSCEIVE){n = MFRC_ReadReg(MFRC_FIFOLevelReg);lastBits = MFRC_ReadReg(MFRC_ControlReg) & 0x07;if (lastBits){*pOutLenBit = (n - 1) * 8 + lastBits;}else{*pOutLenBit = n * 8;}if(n == 0){n = 1;}if(n > MFRC_MAXRLEN){n = MFRC_MAXRLEN;}for(i = 0; i < n; i++){pOutData[i] = MFRC_ReadReg(MFRC_FIFODataReg);}}}else{status = MFRC_ERR;}}MFRC_SetBitMask(MFRC_ControlReg, 0x80);               //停止定时器运行MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE);            //取消当前命令的执行return status;
}

4.3 第三级最底层函数

  • 读一个寄存器
/**************************************************************************************
* 函数名称:MFRC_ReadReg
* 功能描述:读一个寄存器
* 入口参数:-addr:待读的寄存器地址
* 出口参数:无
* 返 回 值:-data:读到寄存器的数据
* 说    明:无
***************************************************************************************/
uint8_t MFRC_ReadReg(uint8_t addr)
{uint8_t AddrByte, data;AddrByte = ((addr << 1 ) & 0x7E ) | 0x80;   //求出地址字节RS522_NSS(0);                               //NSS拉低SPI2_RW_Byte(AddrByte);                     //写地址字节data = SPI2_RW_Byte(0x00);                  //读数据RS522_NSS(1);                               //NSS拉高return data;
}
  • 设置寄存器的位
/**************************************************************************************
* 函数名称:MFRC_SetBitMask
* 功能描述:设置寄存器的位
* 入口参数:-addr:待设置的寄存器地址
*           -mask:待设置寄存器的位(可同时设置多个bit)
* 出口参数:无
* 返 回 值:无
* 说    明:无
***************************************************************************************/
void MFRC_SetBitMask(uint8_t addr, uint8_t mask)
{uint8_t temp;temp = MFRC_ReadReg(addr);                  //先读回寄存器的值MFRC_WriteReg(addr, temp | mask);           //处理过的数据再写入寄存器
}
  • 清除寄存器的位
/**************************************************************************************
* 函数名称:MFRC_ClrBitMask
* 功能描述:清除寄存器的位
* 入口参数:-addr:待清除的寄存器地址
*           -mask:待清除寄存器的位(可同时清除多个bit)
* 出口参数:无
* 返 回 值:无
* 说    明:无
***************************************************************************************/
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask)
{uint8_t temp;temp = MFRC_ReadReg(addr);                  //先读回寄存器的值MFRC_WriteReg(addr, temp & ~mask);          //处理过的数据再写入寄存器
}

4.4 头文件

#ifndef _RC522_H
#define _RC522_H//头文件
//************************************************
#include "gpio.h"//要一些引脚上的宏定义
#include "spi.h"//硬件SPI的定义
#include "printf.h"
#include "main.h"//Laber User上的宏定义
//************************************************//MFRC522驱动程序
//************************************************/*MFRC522寄存器定义*/
//PAGE0
#define MFRC_RFU00              	0x00    
#define MFRC_CommandReg         	0x01    
#define MFRC_ComIEnReg             	0x02    
#define MFRC_DivlEnReg             	0x03    
#define MFRC_ComIrqReg             	0x04    
#define MFRC_DivIrqReg             	0x05
#define MFRC_ErrorReg              	0x06    
#define MFRC_Status1Reg            	0x07    
#define MFRC_Status2Reg            	0x08    
#define MFRC_FIFODataReg           	0x09
#define MFRC_FIFOLevelReg          	0x0A
#define MFRC_WaterLevelReg         	0x0B
#define MFRC_ControlReg            	0x0C
#define MFRC_BitFramingReg         	0x0D
#define MFRC_CollReg               	0x0E
#define MFRC_RFU0F                 	0x0F
//PAGE1     
#define MFRC_RFU10                 	0x10
#define MFRC_ModeReg               	0x11
#define MFRC_TxModeReg             	0x12
#define MFRC_RxModeReg             	0x13
#define MFRC_TxControlReg          	0x14
#define MFRC_TxAutoReg             	0x15 //中文手册有误
#define MFRC_TxSelReg              	0x16
#define MFRC_RxSelReg              	0x17
#define MFRC_RxThresholdReg        	0x18
#define MFRC_DemodReg              	0x19
#define MFRC_RFU1A                 	0x1A
#define MFRC_RFU1B                 	0x1B
#define MFRC_MifareReg             	0x1C
#define MFRC_RFU1D                 	0x1D
#define MFRC_RFU1E                 	0x1E
#define MFRC_SerialSpeedReg        	0x1F
//PAGE2    
#define MFRC_RFU20                 	0x20  
#define MFRC_CRCResultRegM         	0x21
#define MFRC_CRCResultRegL         	0x22
#define MFRC_RFU23                 	0x23
#define MFRC_ModWidthReg           	0x24
#define MFRC_RFU25                 	0x25
#define MFRC_RFCfgReg              	0x26
#define MFRC_GsNReg                	0x27
#define MFRC_CWGsCfgReg            	0x28
#define MFRC_ModGsCfgReg           	0x29
#define MFRC_TModeReg              	0x2A
#define MFRC_TPrescalerReg         	0x2B
#define MFRC_TReloadRegH           	0x2C
#define MFRC_TReloadRegL           	0x2D
#define MFRC_TCounterValueRegH     	0x2E
#define MFRC_TCounterValueRegL     	0x2F
//PAGE3      
#define MFRC_RFU30                 	0x30
#define MFRC_TestSel1Reg           	0x31
#define MFRC_TestSel2Reg           	0x32
#define MFRC_TestPinEnReg          	0x33
#define MFRC_TestPinValueReg       	0x34
#define MFRC_TestBusReg            	0x35
#define MFRC_AutoTestReg           	0x36
#define MFRC_VersionReg            	0x37
#define MFRC_AnalogTestReg         	0x38
#define MFRC_TestDAC1Reg           	0x39  
#define MFRC_TestDAC2Reg           	0x3A   
#define MFRC_TestADCReg            	0x3B   
#define MFRC_RFU3C                 	0x3C   
#define MFRC_RFU3D                 	0x3D   
#define MFRC_RFU3E                 	0x3E   
#define MFRC_RFU3F                 	0x3F/*MFRC522的FIFO长度定义*/
#define MFRC_FIFO_LENGTH       		64 /*MFRC522传输的帧长定义*/
#define MFRC_MAXRLEN                18                /*MFRC522命令集,中文手册P59*/
#define MFRC_IDLE              		0x00	//取消当前命令的执行
#define MFRC_CALCCRC           		0x03    //激活CRC计算
#define MFRC_TRANSMIT          		0x04    //发送FIFO缓冲区内容
#define MFRC_NOCMDCHANGE            0x07	//无命令改变
#define MFRC_RECEIVE           		0x08    //激活接收器接收数据
#define MFRC_TRANSCEIVE        		0x0C    //发送并接收数据
#define MFRC_AUTHENT           		0x0E    //执行Mifare认证(验证密钥)
#define MFRC_RESETPHASE        		0x0F    //复位MFRC522/*MFRC522通讯时返回的错误代码*/
#define MFRC_OK                 	(char)(0)
#define MFRC_NOTAGERR            	(char)(-1)
#define MFRC_ERR                	(char)(-2)/*MFRC522函数声明*/
void MFRC_Init(void);
void MFRC_WriteReg(uint8_t addr, uint8_t data);
uint8_t MFRC_ReadReg(uint8_t addr);
void MFRC_SetBitMask(uint8_t addr, uint8_t mask);
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask);
void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData);
char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit);
//********************************************************************//MFRC552与MF1卡通讯接口程序
//*********************************************************************
/*Mifare1卡片命令字*/
#define PICC_REQIDL           	0x26               	//寻天线区内未进入休眠状态的卡
#define PICC_REQALL           	0x52               	//寻天线区内全部卡
#define PICC_ANTICOLL1        	0x93               	//防冲撞
#define PICC_ANTICOLL2        	0x95               	//防冲撞
#define PICC_AUTHENT1A        	0x60               	//验证A密钥
#define PICC_AUTHENT1B        	0x61               	//验证B密钥
#define PICC_READ             	0x30               	//读块
#define PICC_WRITE            	0xA0               	//写块
#define PICC_DECREMENT        	0xC0               	//减值(扣除)
#define PICC_INCREMENT        	0xC1               	//增值(充值)
#define PICC_TRANSFER         	0xB0               	//转存(传送)
#define PICC_RESTORE          	0xC2               	//恢复(重储)
#define PICC_HALT             	0x50               	//休眠/*PCD通讯时返回的错误代码*/
#define PCD_OK                 	(char)0				//成功
#define PCD_NOTAGERR            (char)(-1)			//无卡
#define PCD_ERR                	(char)(-2)			//出错/*PCD函数声明*/
void PCD_Init(void);//读写器初始化
void PCD_Reset(void);
void PCD_AntennaOn(void);
void PCD_AntennaOff(void);
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType);  //寻卡,并返回卡的类型
char PCD_Anticoll(uint8_t *pSnr);                           //防冲突,返回卡号
char PCD_Select(uint8_t *pSnr);                             //选卡
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr); //验证密码(密码A和密码B)   
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData);   //写数据
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData);    //读数据
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue);   
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr);                                 
char PCD_Halt(void);
//******************************************************************************************#endif

5. 使用教程

//先用CubeMx初始化
PCD_Init();//RC522初始化
/*
* 函数功能:验证刷卡人,以及发送上位机刷卡人身份
* 参    数:无
* 返 回 值:无
* 注    意:无
* 作    者:苏释州
*/
void NFC(void)
{//寻卡if (PCD_Request(PICC_REQALL, RxBuffer)!=0)//返回值为0,代表寻卡成功;并把卡类型存入RxBuffer中){/*果然这里要清空一下不然就会乱,会有一些RxBuffer没用的在那里占位*/memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串return;//如果不加这个判断的话,则会无论寻卡是否成功都会有值000}//防冲撞if (PCD_Anticoll(RxBuffer)!=0)//防冲撞,完成这部就可以简单地 读取卡号{memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串return;//如果不加这个判断的话,则会无论寻卡是否成功都会扰乱卡号}//处理卡号数据sprintf(Card_ID,"%x%x%x%x",RxBuffer[0],RxBuffer[1],RxBuffer[2],RxBuffer[3]);//对卡号进行权限的判断if(strcmp(Card_ID,"b59dfcaa")==0)//卖家配的卡{DoorControl(1);//开门HAL_TIM_Base_Start_IT(&htim5);//开门的时候开启定时器5的中断,进入关门计时memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串,这里要清除RxBuffer才行,否则Card_ID又会被组起来}else if(strcmp(Card_ID,"e1eff3cc")==0)//刘骏帆手机本科生证{DoorControl(1);//开门HAL_TIM_Base_Start_IT(&htim5);//开启定时器5的中断memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串,这里要清除RxBuffer才行,否则Card_ID又会被组起来}else{DoorControl(1);//开门HAL_TIM_Base_Start_IT(&htim5);//开启定时器5的中断memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串}HAL_Delay(100);return;
}

http://chatgpt.dhexx.cn/article/4H1YlnvP.shtml

相关文章

RC522(RFID)读写驱动

文章目录 1、RC522驱动原理2、手机APP查看卡信息3、驱动移植4、读写卡5、源码 1、RC522驱动原理 我们常见的RC522大概如下所示&#xff0c;PCB部分是主机&#xff0c;然后白色的和绿色的都是IC卡&#xff0c;IC卡可以存储信息&#xff0c;通过靠近PCB主机部分就可以被感应到从…

RC522模块学习

目录 1.原理简介 2.SPI通信 3.获取卡号实验 3.驱动函数 参考&#xff1a; https://www.cnblogs.com/ivantang/p/3904025.html https://xiaolong.blog.csdn.net/article/details/117075834?spm1001.2014.3001.5506 https://blog.csdn.net/weixin_47316662/article/detai…

Jmeter下载安装配置---测试小白

一&#xff0c;进入官网&#xff1a;http://jmeter.apache.org/ 1.第一步进入官网如下图 2.选择进行下载&#xff0c;下载下来为一个压缩包&#xff0c;解压即可。 3.我下载的是jmeter4.0版本&#xff0c;对应jdk1.8。然后就进行解压。个人认为要注意3点&#xff1a;1.解压之后…

Windows版JMeter下载安装

进入apache官网https://www.apache.org/dist/jmeter/binaries下载Windows版本JMeter&#xff1b;配置环境变量&#xff08;JMETER_HOMED:\JMeter\apache-jmeter-5.1.1&#xff09;配置环境变量&#xff08;classpath%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%…

JMeter下载安装

一、环境准备 1.Jmeter是纯Java开发的&#xff0c; 能够运行Java程序的系统一般都可以运行Jmeter&#xff0c; 如&#xff1a;Windows、 Linux、 mac等。由于是由Java开发&#xff0c;所以自然需要jdk环境。 2.去官方下载JMeter安装包&#xff1a;Apache JMeter - Download Apa…

Mac版本Jmeter下载安装教程

Mac版本Jmeter下载安装教程 1. 下载&安装&启动Jmeter1.1 下载安装包&#xff1a;1.2 解压安装包1.3 启动Jmeter1.4 Jmeter页面 2. Jmeter进一步优化配置2.1 打开&编辑&保存配置文件~/.bash_profile步骤一&#xff1a;打开配置文件~/.bash_profile步骤二&#x…

JMeter-文件下载教程

一、单个下载配置方法 1、先添加线程组 选中测试计划右键添加线程组&#xff1a;测试计划->添加->线程(用户)->线程组 2、添加HTTP请求 ①. 选中线程组右键添加HTTP请求&#xff1a;线程组->添加->取样器->HTTP请求 ②.配置HPPT请求 3、添加BeanShell 取…

jmeter下载与安装教程

jmeter下载与安装教程 下载步骤&#xff1a; 自行百度jmeter下载&#xff0c;找到apache官网&#xff1b;进入网站后&#xff0c;选择左侧Download下的Download Releases&#xff1b;如图所示 2.页面进入新的页面后&#xff0c;点击此页面Binaries标签下的“apache-jmeter-5…

Jmeter下载及安装教程

下载及环境配置 下载 前置条件&#xff0c;电脑得配置Java环境&#xff0c;也就是安装jdk&#xff0c;可百度jdk安装教程。 1、下载地址&#xff1a;Apache JMeter - Download Apache JMeter&#xff0c;&#xff08;Windows版本下载.zip&#xff0c;Linux版本下载.tgz&…

Jmeter下载安装详细步骤(2021)

Jmeter下载安装详细步骤&#xff08;2021&#xff09; 由于项目方有压测需求&#xff0c;因此需要学习Jmeter压测工具的使用&#xff0c;避免遗忘&#xff0c;记录一下Jmeter下载安装的步骤 这里面有个坑就是Jmeter需要依赖JAVA环境&#xff0c;在安装Jmeter之前需要配置好JA…

测试工具:jmeter的下载以及使用

测试不仅要了解项目整体流程&#xff0c;还需要会使用各种测试工具&#xff0c;比如&#xff1a;jmeter压力测试工具。 1.下载地址 https://jmeter.apache.org/download_jmeter.cgi2.下载完直接解压&#xff0c;配置环境 &#xff08;1&#xff09;此电脑-右键属性-高级系统设…

Jmeter安装配置详细教程

目录 1、Jmeter下载1.1、下载地址1.2、选择对应版本 2、JDK安装2.1、java环境检查2.2、JDK安装2.2.1、JDK下载2.2.2、JDK安装2.2.3、JDK环境变量配置2.2.4、验证java环境 3、Jmeter环境部署3.1、环境配置 4、验证jmeter5、修改语言5.1、临时性设置5.2、永久性生效 1、Jmeter下载…

Jmeter常用插件下载

一、jmeter Manager jmeter插件下载地址&#xff1a;https://jmeter-plugins.org/wiki/Start/ 二、PerfMon Metrics Collector&#xff1a;服务器性能监控数据采集器 在性能测试过程中&#xff0c;除了监控TPS和TRT&#xff0c;还需要监控服务器的资源使用情况&#xff0c;比…

【Jmeter】Win10 下载安装Jmeter 5.5

1、Jmeter下载 地址&#xff1a; https://jmeter.apache.org/前提&#xff1a;使用jmeter工具之前需要安装java.并配置好java的环境变量。 注意&#xff1a;jdk版本和jmeter版本匹配问题 2、JAVA8 下载 进入官网&#xff0c;https://www.oracle.com/&#xff0c;点击Resour…

jmeter常用插件下载及安装

jmeter常用插件 一、下载及安装 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/ 下载后文件为一个jar包&#xff0c;将其放入jmeter安装目录下的lib/ext目录&#xff0c;然后重启jmeter&#xff0c;即可。 启动jemter&#xff0c;点击选项&#xff0c;最下面…

jmeter的配置与下载详细教程

目录 1、Jmeter下载 1.1、下载地址 1.2、选择对应版本 2、JDK安装 2.1、java环境检查 2.2、JDK安装 2.2.1、JDK下载 2.2.2、JDK安装 2.2.3、JDK环境变量配置 2.2.4、验证java环境 3、Jmeter环境部署 …

Jmeter的下载与安装

Jmeter的下载与安装 Jmeter工具可以用来做接口和性能测试&#xff0c;在使用之前让我们先来学习一下Jmeter是怎样下载和安装的吧&#xff01; 安装Jmter之前的准备工作&#xff1a; 1:下载jdk&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/index.h…

Jmeter下载安装及基本使用

本文将讲述Jmeter的下载安装&#xff0c;并以一个实例来讲解如何使用Jmeter。 一、Jmeter下载及安装部署 下载解压JMeter压缩包下载地址&#xff1a; http://jmeter.apache.org/download_jmeter.cgi JMeter解压之后&#xff0c;…\apache-jmeter-4.0\bin\jmeter.bat&#xff…

JMeter - 下载安装教程(Windows/macOS/Linux)

目录 1. JMeter介绍2. JMeter下载3. JMeter目录解析4. Windows和macOS下安装启动5. JMeter切换语言为中文6. Linux下安装启动 1. JMeter介绍 JMeter是目前行业内用的比较多的一个开源性能测试工具&#xff0c;由Java语言编写&#xff0c;要依赖Java环境来运行&#xff08;需要…

【jmeter安装】jmeter下载安装超详细简单步骤

本文介绍jmeter下载安装的详细步骤 1.下载jmeter安装包&#xff0c;我下的就是最新的版本&#xff08;在此之前需要安装Java环境jdk&#xff0c;已有环境可忽略&#xff09; 2.下载后解压 3.右键单击桌面的“此电脑”图标&#xff0c;再单击弹框中的“属性”按钮 4.在页面左侧…