STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID
1.軟件準備
(1)編程平臺:Keil5
(2)CubeMX
(3)XCOM(串口調試助手)
2.硬件準備
(1)MFRC-522模塊
(2)F1的板子,本例使用經典F103C8T6
(3)ST-link?下載器
(4)USB-TTL模塊
(5)杜邦線若干
?3.模塊資料
(1)模塊簡介:
????????MFRC522-AN模塊采用 Philips MFRC522芯片設計讀卡電路,使用方便,成本低廉,適用于設備開發、讀卡器開發等高級應用的用戶、需要進行射頻卡終端設計/生產的用戶。本模塊可直接裝入各種讀卡器模具。模塊采用電壓為3.3V,通過SPI接口簡單的幾條線就可以直接與用戶任何CPU主板相連接通信,可以保證模塊穩定可靠的工作、讀卡距離遠。
(2)關于RC255芯片:
????????MFRC522是應用于13.56MHz非接觸式通信中高集成度的讀寫卡芯片,“三表”應用推出的一款低電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設備研發的較好選擇。MFRC522利用了先進的調制和解調概念,集成了在13.56MHz下所有類型的被動非接觸式通信方式和協議。支持14443A兼容應答器信號。數字部分處理ISO014443A幀和錯誤檢測。此外,還支持快速 CRYPTO1加密算法,用語驗證MIFARE系列產品。MFRC522支持 MIFARE系列更高速的非接觸式通信,雙向數據傳輸速率高達424 kbit/s 。作為13.56MHz高集成度讀寫卡系列芯片家族的新成員,MRC522與MFRC500和MFRC530有不少相似之處,同時也具備許多特點和差異。它與主機間通信采用SPi模式,有利于減少連線,縮小PCB板體積,降低成本。
(3)模塊參數:
①工作電壓:3.3v
②工作頻率:13.56MHz
③支持卡類型:mifare1 s50、mifare1s70、 mifareUltraLight、mifare Pro, mifare Desfire
④通信方式:SPI協議
⑤環境工作溫度:-20°C——80°C
4.CubeMX配置
(1)芯片選擇
?(2)配置RCC、SYS、時鐘樹
配置RCC
配置SYS
配置時鐘樹
(3)配置GPIO?
?(4)配置串口1
?(5)配置SPI2
?(6)設置路徑、生成代碼工程
5、Keil5代碼
(1)勾選Use?MicroLIB
(2)創建RC522.c和RC522.h文件
(3)添加上述的RC522.c文件進工程
——————上述兩步參考之前系列教學步驟,在此不再贅述(點擊跳轉)
(4)RC522.c和5C522.h代碼
RC522.c
(以下部分僅讀卡功能,更多功能請在文章結尾下載源碼查看)
#include "rc522.h" #include "stdio.h"//SPI2_SCK PB13 //SPI2_MISO PB14 //SPI2_MOSI PB15 //RCC522_RST(CE) PB9 //RCC522_NSS(SDA) PB8 //RCC522_IRQ 懸空uint8_t UID[5],Temp[4]; uint8_t RF_Buffer[18]; uint8_t Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; // Mifare One 缺省密碼void RC522_Init(void) {RC522_SDA_LOW;HAL_SPI_Transmit(&hspi2, (uint8_t *)0xaa, sizeof((uint8_t *)0xaa), 0xFF);//啟動傳輸 RC522_SDA_HIGH;HAL_Delay(50);PcdReset();//復位RC522讀卡器HAL_Delay(10);PcdReset();//復位RC522讀卡器HAL_Delay(10);PcdAntennaOff();//關閉天線發射 HAL_Delay(10); PcdAntennaOn();//開啟天線發射printf("RFID-MFRC522 初始化完成\r\nFindCard Starting ...\r\n"); //測試引腳初始化完成 }void delay_ns(uint32_t ns) {uint32_t i;for(i=0;i<ns;i++){__nop();__nop();__nop();} }//SPIx 讀寫一個字節 //TxData:要寫入的字節 //返回值:讀取到的字節 //***************************************************************************/char RC522_ReadWriteByte(uint8_t TxData) { while (SPI_CHECK_FLAG(SPI2->SR,((uint16_t)0x0002)) == RESET) //檢查指定的SPI標志位設置與否:發送緩存空標志位{;} SPI2->DR=TxData; //通過外設SPIx發送一個數據while (SPI_CHECK_FLAG(SPI2->SR,((uint16_t)0x0001)) == RESET) //檢查指定的SPI標志位設置與否:接受緩存非空標志位{} return SPI2->DR; //返回通過SPIx最近接收的數據 }//******************************************************************/ //功 能:讀RC522寄存器 //參數說明:Address[IN]:寄存器地址 //返 回:讀出的值 //******************************************************************/ unsigned char ReadRawRC(unsigned char Address) {uint8_t ucAddr;uint8_t ucResult=0;RC522_SDA_LOW;HAL_Delay(10);ucAddr = ((Address<<1)&0x7E)|0x80;RC522_ReadWriteByte(ucAddr);HAL_Delay(10);ucResult=RC522_ReadWriteByte(0);HAL_Delay(10);RC522_SDA_HIGH;return ucResult; }//******************************************************************/ //功 能:寫RC522寄存器 //參數說明:Address[IN]:寄存器地址 // value[IN]:寫入的值 //******************************************************************/ void WriteRawRC(unsigned char Address, unsigned char value) {uint8_t ucAddr;RC522_SDA_LOW;HAL_Delay(10);ucAddr = ((Address<<1)&0x7E) ;RC522_ReadWriteByte(ucAddr);HAL_Delay(10);RC522_ReadWriteByte(value);HAL_Delay(10);RC522_SDA_HIGH; }//******************************************************************/ //功 能:置RC522寄存器位 //參數說明:reg[IN]:寄存器地址 // mask[IN]:置位值 //******************************************************************/ void SetBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0 ;tmp = ReadRawRC(reg)| mask;WriteRawRC(reg,tmp | mask); // set bit mask }//******************************************************************/ //功 能:清RC522寄存器位 //參數說明:reg[IN]:寄存器地址 // mask[IN]:清位值 //******************************************************************/ void ClearBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0 ;tmp = ReadRawRC(reg)&(~mask);WriteRawRC(reg, tmp) ; // clear bit mask } //******************************************************************/ //功 能:復位RC522 //返 回: 成功返回MI_OK //******************************************************************/ char PcdReset() {RC522_RST_HIGH; ;delay_ns(10) ;RC522_RST_LOW; ;delay_ns(100) ;RC522_RST_HIGH; ;delay_ns(10) ;WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(100) ;WriteRawRC(ModeReg,0x3D) ;//定義發送和接收常用模式 和Mifare卡通訊,CRC初始值0x6363WriteRawRC(TReloadRegL,30) ;//16位定時器低位 30WriteRawRC(TReloadRegH,0) ;//16位定時器高位WriteRawRC(TModeReg,0x8D) ;//定義內部定時器的設置WriteRawRC(TPrescalerReg,0x3E) ;//設置定時器分頻系數 WriteRawRC(TxASKReg,0x40) ;//調制發送信號為100%ASKreturn MI_OK ; } // //設置RC522的工作方式 // char MF522PcdConfigISOType(unsigned char type) {if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08); //狀態2寄存器 WriteRawRC(ModeReg,0x3D); //3F //和Mifare卡通訊,CRC初始值0x6363 WriteRawRC(RxSelReg,0x86); //84 選擇內部接收器設置,內部模擬部分調制信號,發送數據后,延遲6個位時鐘,接收 WriteRawRC(RFCfgReg,0x7F); //4F 配置接收器 48dB最大增益 WriteRawRC(TReloadRegL,30); //tmoLength);TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0); //實際值是OXD3E 這部分主要是設置定時器寄存器 WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();} else {return 0xFE;} return MI_OK; } //******************************************************************/ //開啟天線發射 //每次啟動或關閉天險發射之間應至少有1ms的間隔 //******************************************************************/ void PcdAntennaOn() {unsigned char i;WriteRawRC(TxASKReg,0x40) ;HAL_Delay(1);i = ReadRawRC(TxControlReg) ;if(!(i&0x03))SetBitMask(TxControlReg, 0x03);i=ReadRawRC(TxASKReg) ; }//******************************************************************/ //關閉天線發射 //******************************************************************/ void PcdAntennaOff() {ClearBitMask(TxControlReg, 0x03); }//******************************************************************/ //功 能:通過RC522和ISO14443卡通訊 //參數說明:Command[IN]:RC522命令字 // pInData[IN]:通過RC522發送到卡片的數據 // InLenByte[IN]:發送數據的字節長度 // pOutData[OUT]:接收到的卡片返回數據 // *pOutLenBit[OUT]:返回數據的位長度 //******************************************************************/ char PcdComMF522(unsigned char Command ,unsigned char *pInData , unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit ) {char status = MI_ERR ;unsigned char irqEn = 0x00 ;unsigned char waitFor = 0x00 ;unsigned char lastBits ;unsigned char n ;unsigned int i ;switch (Command){case PCD_AUTHENT:irqEn = 0x12 ;waitFor = 0x10 ;break ;case PCD_TRANSCEIVE:irqEn = 0x77 ;waitFor = 0x30 ;break ;default:break ;}WriteRawRC(ComIEnReg,irqEn|0x80) ; //ClearBitMask(ComIrqReg,0x80) ;WriteRawRC(CommandReg,PCD_IDLE) ;SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO for(i=0; i<InLenByte; i++)WriteRawRC(FIFODataReg,pInData[i]) ; // 數據寫入FIFO WriteRawRC(CommandReg, Command) ; // 命令寫入命令寄存器if(Command == PCD_TRANSCEIVE)SetBitMask(BitFramingReg,0x80) ; // 開始發送 i = 6000 ; //根據時鐘頻率調整,操作M1卡最大等待時間25msdo {n = ReadRawRC(ComIrqReg) ;i-- ;}while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;ClearBitMask(BitFramingReg,0x80) ;if(i!=0){if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK ;if (n&irqEn&0x01)status = MI_NOTAGERR ;if(Command==PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg) ;lastBits = ReadRawRC(ControlReg)&0x07 ;if(lastBits)*pOutLenBit = (n-1)*8 + lastBits ;else*pOutLenBit = n*8 ;if(n==0)n = 1 ;if(n>MAXRLEN)n = MAXRLEN ;for (i=0; i<n; i++)pOutData[i] = ReadRawRC(FIFODataReg) ; }}elsestatus = MI_ERR ; }SetBitMask(ControlReg,0x80) ;// stop timer nowWriteRawRC(CommandReg,PCD_IDLE) ; return status; }//******************************************************************/ //功 能:尋卡 / //參數說明: req_code[IN]:尋卡方式 / // 0x52 = 尋感應區內所有符合14443A標準的卡 / // 0x26 = 尋未進入休眠狀態的卡 / // pTagType[OUT]:卡片類型代碼 / // 0x4400 = Mifare_UltraLight / // 0x0400 = Mifare_One(S50) / // 0x0200 = Mifare_One(S70) / // 0x0800 = Mifare_Pro(X) / // 0x4403 = Mifare_DESFire / //返 回: 成功返回MI_OK / //******************************************************************/ char PcdRequest(unsigned char req_code,unsigned char *pTagType) {char status ; unsigned int unLen ;unsigned char ucComMF522Buf[MAXRLEN] ; ClearBitMask(Status2Reg,0x08) ;//清除MRCrypto1on,要用軟件清零WriteRawRC(BitFramingReg,0x07) ;//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7SetBitMask(TxControlReg,0x03) ;//TX2rfen=1,TX1RFen=1,傳遞調制的13.56MHZ的載波信號ucComMF522Buf[0] = req_code ;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen );if ((status == MI_OK) && (unLen == 0x10)){ *pTagType = ucComMF522Buf[0] ;*(pTagType+1) = ucComMF522Buf[1] ;}elsestatus = MI_ERR ;return status ; }//******************************************************************/ //功 能:防沖撞 / //參數說明: pSnr[OUT]:卡片序列號,4字節 / //返 回: 成功返回MI_OK / //******************************************************************/ char PcdAnticoll(unsigned char *pSnr) {char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用軟件清零WriteRawRC(BitFramingReg,0x00);//表示最后一個字節所有位都發送ClearBitMask(CollReg,0x80);//CollRegCollReg0沖突結束后沖突位被置零ucComMF522Buf[0] = PICC_ANTICOLL1;ucComMF522Buf[1] = 0x20;status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);if (status == MI_OK){for (i=0; i<4; i++){ *(pSnr+i) = ucComMF522Buf[i];snr_check ^= ucComMF522Buf[i];}if (snr_check != ucComMF522Buf[i]){ status = MI_ERR; }}SetBitMask(CollReg,0x80);//CollRegCollReg 在106kbps良好的防沖突情況下該位置1return status; }//============================================================================== //讀取卡的類型 //讀取卡的ID號 //============================================================================== void ReaderCard(void) {char temp_value;if(PcdRequest(PICC_REQALL,Temp)==MI_OK) //選卡{if(Temp[0]==0x04&&Temp[1]==0x00) printf("\r\nMFOne-S50\r\n");else if(Temp[0]==0x02&&Temp[1]==0x00)printf("MFOne-S70");else if(Temp[0]==0x44&&Temp[1]==0x00)printf("MF-UltraLight");else if(Temp[0]==0x08&&Temp[1]==0x00)printf("MF-Pro");else if(Temp[0]==0x44&&Temp[1]==0x03)printf("MF Desire");elseprintf("Unknown");if(PcdAnticoll(UID)==MI_OK) //防沖撞{ printf("Card Id is:");/* 獲取卡值 */printf("%d%d%d%d\r\n",UID[0],UID[1],UID[2],UID[3]); temp_value = ((UID[0]>>4)*10+(UID[0]&0x0f));switch(temp_value){case 63 : printf("管理員:%d 驗證通過!\r\n",temp_value); break;default : printf("無效卡:%d 驗證失敗!\r\n",temp_value); break;} }} }RC522.h
#ifndef __RC522_H #define __RC522_H #include "spi.h" #include "main.h" #include "usart.h"//------------------------------- RC522引腳定義 ------------------------------//#define RC522_SDA_HIGH HAL_GPIO_WritePin(GPIOB, RC522_SDA_Pin, GPIO_PIN_SET); #define RC522_SDA_LOW HAL_GPIO_WritePin(GPIOB, RC522_SDA_Pin, GPIO_PIN_RESET);#define RC522_RST_HIGH HAL_GPIO_WritePin(GPIOB, RC522_RST_Pin, GPIO_PIN_SET); #define RC522_RST_LOW HAL_GPIO_WritePin(GPIOB, RC522_RST_Pin, GPIO_PIN_RESET);#define MAXRLEN 18 #define MIN_STRENGTH 228 //******************************************************************/ // RC522 FIFO長度定義 / //******************************************************************/ #define DEF_FIFO_LENGTH 64 //FIFO size=64byte//******************************************************************/ // RC522命令字 / //******************************************************************/ #define PCD_IDLE 0x00 //取消當前命令 #define PCD_AUTHENT 0x0E //驗證密鑰 #define PCD_RECEIVE 0x08 //接收數據 #define PCD_TRANSMIT 0x04 //發送數據 #define PCD_TRANSCEIVE 0x0C //發送并接收數據 #define PCD_RESETPHASE 0x0F //復位 #define PCD_CALCCRC 0x03 //CRC計算//******************************************************************/ // Mifare_One卡片命令字 */ //******************************************************************/ #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_RESTORE 0xC2 //調塊數據到緩沖區 #define PICC_TRANSFER 0xB0 //保存緩沖區中數據 #define PICC_HALT 0x50 //休眠//******************************************************************/ // MF522寄存器定義 / //******************************************************************/ // PAGE 0 #define RFU00 0x00 #define CommandReg 0x01 #define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 0x04 #define DivIrqReg 0x05 #define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1 #define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxASKReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F // PAGE 2 #define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F // PAGE 3 #define RFU30 0x30 #define TestSel1Reg 0x31 #define TestSel2Reg 0x32 #define TestPinEnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define VersionReg 0x37 #define AnalogTestReg 0x38 #define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define RFU3C 0x3C #define RFU3D 0x3D #define RFU3E 0x3E #define RFU3F 0x3F//******************************************************************/ // RC522通訊返回錯誤代碼 / //******************************************************************/ #define MI_ERR 0xFE //#define MI_ERR //(-2)// Mifare Error Codes // Each function returns a status value, which corresponds to the // mifare error codes. #define MI_OK 0 #define MI_CHK_OK 0 #define MI_CRC_ZERO 0 #define MI_CRC_NOTZERO 1 #define MI_NOTAGERR 0xFF #define MI_CHK_FAILED 0xFF #define MI_CRCERR 0xFE #define MI_CHK_COMPERR 0xFE #define MI_EMPTY 0xFD #define MI_AUTHERR 0xFC #define MI_PARITYERR 0xFB #define MI_CODEERR 0xFA #define MI_SERNRERR 0xF8 #define MI_KEYERR 0xF7 #define MI_NOTAUTHERR 0xF6 #define MI_BITCOUNTERR 0xF5 #define MI_BYTECOUNTERR 0xF4 #define MI_IDLE 0xF3 #define MI_TRANSERR 0xF2 #define MI_WRITEERR 0xF1 #define MI_INCRERR 0xF0 #define MI_DECRERR 0xEF #define MI_READERR 0xEE #define MI_OVFLERR 0xED #define MI_POLLING 0xEC #define MI_FRAMINGERR 0xEB #define MI_ACCESSERR 0xEA #define MI_UNKNOWN_COMMAND 0xE9 #define MI_COLLERR 0xE8 #define MI_RESETERR 0xE7 #define MI_INITERR 0xE7 #define MI_INTERFACEERR 0xE7 #define MI_ACCESSTIMEOUT 0xE5 #define MI_NOBITWISEANTICOLL 0xE4 #define MI_QUIT 0xE2 #define MI_RECBUF_OVERFLOW 0xCF #define MI_SENDBYTENR 0xCE #define MI_SENDBUF_OVERFLOW 0xCC #define MI_BAUDRATE_NOT_SUPPORTED 0xCB #define MI_SAME_BAUDRATE_REQUIRED 0xCA #define MI_WRONG_PARAMETER_VALUE 0xC5 #define MI_BREAK 0x9E #define MI_NY_IMPLEMENTED 0x9D #define MI_NO_MFRC 0x9C #define MI_MFRC_NOTAUTH 0x9B #define MI_WRONG_DES_MODE 0x9A #define MI_HOST_AUTH_FAILED 0x99 #define MI_WRONG_LOAD_MODE 0x97 #define MI_WRONG_DESKEY 0x96 #define MI_MKLOAD_FAILED 0x95 #define MI_FIFOERR 0x94 #define MI_WRONG_ADDR 0x93 #define MI_DESKEYLOAD_FAILED 0x92 #define MI_WRONG_SEL_CNT 0x8F #define MI_RC531_WRONG_READVALUE 0x8E //LI ADDED 09-4-24 #define MI_WRONG_TEST_MODE 0x8C #define MI_TEST_FAILED 0x8B #define MI_TOC_ERROR 0x8A #define MI_COMM_ABORT 0x89 #define MI_INVALID_BASE 0x88 #define MI_MFRC_RESET 0x87 #define MI_WRONG_VALUE 0x86 #define MI_VALERR 0x85//******************************************************************/ // 函數定義 / //******************************************************************/ void RC522_Init(void); char RC522_ReadWriteByte(uint8_t TxData); void delay_ns(uint32_t ns);char PcdHalt(void) ; char PcdReset(void) ; void PcdAntennaOn(void) ; void PcdAntennaOff(void) ; char PcdRequest(unsigned char req_code,unsigned char *pTagType) ;char PcdAnticoll(unsigned char *pSnr) ; char PcdSelect(unsigned char *pSnr) ; char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) ; char PcdRead(unsigned char addr,unsigned char *pData) ; char PcdWrite(unsigned char addr,unsigned char *pData) ; char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue); char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr) ; char MF522PcdConfigISOType(unsigned char type); char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit ) ; void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData ) ; void WriteRawRC(unsigned char Address,unsigned char value) ; unsigned char ReadRawRC(unsigned char Address) ; void SetBitMask(unsigned char reg,unsigned char mask) ; void ClearBitMask(unsigned char reg,unsigned char mask) ; char Read_Block(unsigned char Block,unsigned char *Buf) ; char Write_Block(unsigned char Block) ; void PcdAntennaTestOn(void) ;extern char KK[8] ; // 數據加密密鑰 extern unsigned char RF_Buffer[18] ; // 射頻卡數據緩沖區 extern unsigned char UID[5] ; extern unsigned char Password_Buffer[6] ; extern void Uart1_SendByte(uint32_t ch); // extern void Des_Encrypt(char* In, char* K,char* Out) ; // extern void Des_Decrypt(char* In, char* K,char* Out) ; extern unsigned char des_on ; // DES加密標志void ReaderCard(void);#endif(5)usrat.c代碼添加
/* USER CODE BEGIN 0 */ #include "stdio.h" /* USER CODE END 0 *//* USER CODE BEGIN 1 */ /********************************************************* * *重定義 fputc 函數 * *********************************************************/ int fputc(int ch,FILE *f) {HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch; } /* USER CODE END 1 */(6)main函數
int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */RC522_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(1000);ReaderCard();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ }6.接線圖及效果
?本例程源碼下載:點擊跳轉?
下一篇:MFRC522模塊使用鏈表結構存儲數據
總結
以上是生活随笔為你收集整理的STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 超级秒表
- 下一篇: 加速处理单元提高数据中心性能