//本头文件是以51为蓝本
#ifndef __rc522_h__
#define __rc522_h__ #include <string.h>
#include <wiringPi.h>
#include <unistd.h>
#include "Library.h"
#include "51initrc522.h" /////////////////////////////////////////////////////////////////////
//MF522命令字
/////////////////////////////////////////////////////////////////////
#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 FIFO长度定义
/////////////////////////////////////////////////////////////////////
#define DEF_FIFO_LENGTH 64 //FIFO size=64byte
#define MAXRLEN 18 /////////////////////////////////////////////////////////////////////
//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 TxAutoReg 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 /////////////////////////////////////////////////////////////////////
//和MF522通讯时返回的错误代码
/////////////////////////////////////////////////////////////////////
#define MI_OK 0
#define MI_NOTAGERR (-1)
#define MI_ERR (-2) #define BOOLEAN unsigned char
#define INT8U unsigned char
#define INT8S signed char
#define INT16U unsigned short int
#define INT16S signed short int
#define INT32U unsigned int
#define INT32S signed int void delay_ns(INT16U ns); //延时ns级别
INT8U SPIReadByte(void); // 读SPI数据
void SPIWriteByte(INT8U SPIData); // 写SPI数据
INT8U ReadRawRC(INT8U Address); //读RC632寄存器
void WriteRawRC(INT8U Address, INT8U value); //写RC632寄存器
void ClearBitMask(INT8U reg,INT8U mask); //清RC522寄存器位
void SetBitMask(INT8U reg,INT8U mask); //置RC522寄存器位
void CalulateCRC(INT8U *pIndata,INT8U len,INT8U *pOutData); //用MF522计算CRC16函数
char PcdComMF522(INT8U Command,
INT8U *pInData,
INT8U InLenByte,
INT8U *pOutData,
INT16U *pOutLenBit); //通过RC522和ISO14443卡通讯 char PcdReset(void); //复位RC522
char PcdRequest(INT8U req_code,INT8U *pTagType); //寻卡
void PcdAntennaOn(void); //开启天线
void PcdAntennaOff(void); //关闭天线
char M500PcdConfigISOType(INT8U type); //设置RC632的工作方式
char PcdAnticoll(INT8U *pSnr); //防冲撞
char PcdSelect(INT8U *pSnr); //选定卡片
char PcdAuthState(INT8U auth_mode,INT8U addr,INT8U *pKey,INT8U *pSnr); //验证卡片密码
char PcdWrite(INT8U addr,INT8U *pData); //写数据到M1卡一块
char PcdRead(INT8U addr,INT8U *pData); //读取M1卡一块数据
char PcdHalt(void); //命令卡片进入休眠状态
void init_rc522(void); //初始化rc522 void delay_ns(INT16U ns) //延时ns级别
{
usleep(ns);
} //------------------------------------------
// 读SPI数据
//------------------------------------------
INT8U SPIReadByte(void)
{
INT8U SPICount; //用于时钟输出数据的计数器
INT8U SPIData;
SPIData = ;
for (SPICount = ; SPICount < ; SPICount++) //准备在要读取的数据时钟
{
SPIData <<=; //旋转数据
CLR_SPI_CK; //nop();//nop(); //提高时钟时钟数据从MAX7456
if(STU_SPI_MISO)
{
SPIData|=0x01;
}
SET_SPI_CK; //nop();//nop(); // 放下时钟准备下一位
} // 和环回
return (SPIData); // 最后返回读取数据
}
//------------------------------------------
// 写SPI数据
//------------------------------------------
void SPIWriteByte(INT8U SPIData)
{
INT8U SPICount; //用于时钟输出数据的计数器
for (SPICount = ; SPICount < ; SPICount++)
{
if (SPIData & 0x80)
{
SET_SPI_MOSI;
}
else
{
CLR_SPI_MOSI;
}
delay_ns();
CLR_SPI_CK;delay_ns();
SET_SPI_CK;delay_ns();
SPIData <<= ;
}
}
/////////////////////////////////////////////////////////////////////
//功 能:读RC632寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
/////////////////////////////////////////////////////////////////////
INT8U ReadRawRC(INT8U Address)
{
INT8U ucAddr;
INT8U ucResult=;
CLR_SPI_CS;
ucAddr = ((Address<<)&0x7E)|0x80;
SPIWriteByte(ucAddr); // 写SPI数据
ucResult=SPIReadByte(); // 读SPI数据
SET_SPI_CS;
return ucResult;
} /////////////////////////////////////////////////////////////////////
//功 能:写RC632寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(INT8U Address, INT8U value)
{
INT8U ucAddr;
CLR_SPI_CS;
ucAddr = ((Address<<)&0x7E);
SPIWriteByte(ucAddr); //选定寄存器
SPIWriteByte(value); //写入数据
SET_SPI_CS;
} /////////////////////////////////////////////////////////////////////
//功 能:清RC522寄存器位
//参数说明:reg[IN]:寄存器地址
// mask[IN]:清位值
/////////////////////////////////////////////////////////////////////
void ClearBitMask(INT8U reg,INT8U mask)
{
char tmp = 0x00;
tmp = ReadRawRC(reg); //读出要清除的清除位掩码数据
WriteRawRC(reg, tmp & ~mask); //要清除的清除位掩码
}
/////////////////////////////////////////////////////////////////////
//功 能:置RC522寄存器位
//参数说明:reg[IN]:寄存器地址
// mask[IN]:置位值
/////////////////////////////////////////////////////////////////////
void SetBitMask(INT8U reg,INT8U mask)
{
char tmp = 0x00;
tmp = ReadRawRC(reg); //读出要清除的清除位掩码数据
WriteRawRC(reg,tmp | mask); //写入的清除位掩码
} /////////////////////////////////////////////////////////////////////
//用MF522计算CRC16函数
/////////////////////////////////////////////////////////////////////
void CalulateCRC(INT8U *pIndata,INT8U len,INT8U *pOutData)
{
INT8U i,n;
ClearBitMask(DivIrqReg,0x04); //清RC522寄存器位
WriteRawRC(CommandReg,PCD_IDLE); //写RC632寄存器
SetBitMask(FIFOLevelReg,0x80);
for (i=; i<len; i++)
{WriteRawRC(FIFODataReg, *(pIndata+i));}
WriteRawRC(CommandReg, PCD_CALCCRC);
i = 0xFF;
do
{
n = ReadRawRC(DivIrqReg);
i--;
}
while ((i!=) && !(n&0x04));
pOutData[] = ReadRawRC(CRCResultRegL);
pOutData[] = ReadRawRC(CRCResultRegM);
} /////////////////////////////////////////////////////////////////////
//功 能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
// pInData[IN]:通过RC522发送到卡片的数据
// InLenByte[IN]:发送数据的字节长度
// pOutData[OUT]:接收到的卡片返回数据
// *pOutLenBit[OUT]:返回数据的位长度
/////////////////////////////////////////////////////////////////////
char PcdComMF522(INT8U Command,
INT8U *pInData,
INT8U InLenByte,
INT8U *pOutData,
INT16U *pOutLenBit)
{
char status = MI_ERR;
INT8U irqEn = 0x00;
INT8U waitFor = 0x00;
INT8U lastBits;
INT8U n;
INT16U 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); for (i=; i<InLenByte; i++)
{
WriteRawRC(FIFODataReg, pInData[i]);
}
WriteRawRC(CommandReg, Command); if (Command == PCD_TRANSCEIVE)
{
SetBitMask(BitFramingReg,0x80);
} //i = 600;//根据时钟频率调整,操作M1卡最大等待时间25ms
i = ;
do
{
n = ReadRawRC(ComIrqReg);
i--;
}
while ((i!=) && !(n&0x01) && !(n&waitFor));
ClearBitMask(BitFramingReg,0x80); if (i!=)
{
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-)* + lastBits;
}
else
{
*pOutLenBit = n*;
}
if (n == )
{
n = ;
}
if (n > MAXRLEN)
{
n = MAXRLEN;
}
for (i=; i<n; i++)
{
pOutData[i] = ReadRawRC(FIFODataReg);
}
}
}
else
{
status = MI_ERR;
} } SetBitMask(ControlReg,0x80); // stop timer now
WriteRawRC(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(INT8U req_code,INT8U *pTagType)
{
char status;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08); //清RC522寄存器位
WriteRawRC(BitFramingReg,0x07); //写RC632寄存器
SetBitMask(TxControlReg,0x03); //置RC522寄存器位 ucComMF522Buf[] = req_code; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[];
*(pTagType+) = ucComMF522Buf[];
}
else
{
status = MI_ERR;
}
return status;
} /////////////////////////////////////////////////////////////////////
//功 能:防冲撞
//参数说明: pSnr[OUT]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdAnticoll(INT8U *pSnr)
{
char status;
INT8U i,snr_check=;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80); ucComMF522Buf[] = PICC_ANTICOLL1;
ucComMF522Buf[] = 0x20; status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,,ucComMF522Buf,&unLen); if (status == MI_OK)
{
for (i=; i<; i++)
{
*(pSnr+i) = ucComMF522Buf[i];
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i])
{
status = MI_ERR;
}
} SetBitMask(CollReg,0x80);
return status;
} /////////////////////////////////////////////////////////////////////
//功 能:选定卡片
//参数说明: pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdSelect(INT8U *pSnr)
{
char status;
INT8U i;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ucComMF522Buf[] = PICC_ANTICOLL1;
ucComMF522Buf[] = 0x70;
ucComMF522Buf[] = ;
for (i=; i<; i++)
{
ucComMF522Buf[i+] = *(pSnr+i);
ucComMF522Buf[] ^= *(pSnr+i);
}
CalulateCRC(ucComMF522Buf,,&ucComMF522Buf[]); ClearBitMask(Status2Reg,0x08); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,,ucComMF522Buf,&unLen); if ((status == MI_OK) && (unLen == 0x18))
{
status = MI_OK;
}
else
{
status = MI_ERR;
} return status;
}
/////////////////////////////////////////////////////////////////////
//功 能:验证卡片密码
//参数说明: auth_mode[IN]: 密码验证模式
// 0x60 = 验证A密钥
// 0x61 = 验证B密钥
// addr[IN]:块地址
// pKey[IN]:密码
// pSnr[IN]:卡片序列号,4字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdAuthState(INT8U auth_mode,INT8U addr,INT8U *pKey,INT8U *pSnr)
{
char status;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ucComMF522Buf[] = auth_mode;
ucComMF522Buf[] = addr;
memcpy(&ucComMF522Buf[], pKey, );
memcpy(&ucComMF522Buf[], pSnr, ); status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{
status = MI_ERR;
} return status;
} /////////////////////////////////////////////////////////////////////
//功 能:读取M1卡一块数据
//参数说明: addr[IN]:块地址
// pData[OUT]:读出的数据,16字节
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdRead(INT8U addr,INT8U *pData)
{
char status;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ucComMF522Buf[] = PICC_READ;
ucComMF522Buf[] = addr;
CalulateCRC(ucComMF522Buf,,&ucComMF522Buf[]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x90))
{
memcpy(pData, ucComMF522Buf, );
}
else
{
status = MI_ERR;
} return status;
} /////////////////////////////////////////////////////////////////////
//功 能:命令卡片进入休眠状态
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdHalt(void)
{
char status;
INT16U unLen;
INT8U ucComMF522Buf[MAXRLEN]; ucComMF522Buf[] = PICC_HALT;
ucComMF522Buf[] = ;
CalulateCRC(ucComMF522Buf,,&ucComMF522Buf[]); status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,,ucComMF522Buf,&unLen); return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//功 能:复位RC522
//返 回: 成功返回MI_OK
/////////////////////////////////////////////////////////////////////
char PcdReset(void)
{
SET_RC522RST; //rst 高电平
delay_ns(); //10ns
CLR_RC522RST; //rst 低电平
delay_ns(); //10ns
SET_RC522RST; //rst 高电平
delay_ns(); //10ns
WriteRawRC(CommandReg,PCD_RESETPHASE); //复位
delay_ns(); //10ns WriteRawRC(ModeReg,0x3D); //和Mifare卡通讯,CRC初始值0x6363,SIGIN为低电平有效,无线模式
WriteRawRC(TReloadRegL,); //高装入定时器
WriteRawRC(TReloadRegH,); //低装入定时器
WriteRawRC(TModeReg,0x8D); //开启522,设置分频
WriteRawRC(TPrescalerReg,0x3E); //定时器当前值 WriteRawRC(TxAutoReg,0x40); //必须要(控制天线设置) return MI_OK;
}
//////////////////////////////////////////////////////////////////////
//设置RC632的工作方式
//////////////////////////////////////////////////////////////////////
char M500PcdConfigISOType(INT8U type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(Status2Reg,0x08); //接收器,发射器和数据模式检测器的状态位
WriteRawRC(ModeReg,0x3D); //定义发送和接受的常用模式
WriteRawRC(RxSelReg,0x86); //非接触方式,引脚保护为6个时钟
WriteRawRC(RFCfgReg,0x7F); //非接触的48dB的增益
WriteRawRC(TReloadRegL,); //tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
WriteRawRC(TReloadRegH,); //定时器重装值
WriteRawRC(TModeReg,0x8D); //16位定时器重装值
WriteRawRC(TPrescalerReg,0x3E); //定义内部定时器重装值
delay_ns();
PcdAntennaOn(); //设置天线开启设置(间隔1ms)
}
else{ return -; } return MI_OK;
}
/////////////////////////////////////////////////////////////////////
//开启天线
//每次启动或关闭天险发射之间应至少有1ms的间隔
/////////////////////////////////////////////////////////////////////
void PcdAntennaOn(void)
{
INT8U i;
i = ReadRawRC(TxControlReg);
if (!(i & 0x03))
{
SetBitMask(TxControlReg, 0x03);
}
}
/////////////////////////////////////////////////////////////////////
//关闭天线
/////////////////////////////////////////////////////////////////////
void PcdAntennaOff(void)
{
ClearBitMask(TxControlReg, 0x03);
} ////////////////////////////////////////////////////////////////////
//初始化gpio
//int spi_cs =0; //片选
//int spi_ck =1; // 时钟信号,由主器件产生
//int spi_mosi =2; //主器件数据输出,从器件数据输入
//int spi_miso =3; //主器件数据输入,从器件数据输出
//int spi_rst =4; //复位低电平有效(1开始)
////////////////////////////////////////////////////////////////////
/**/
void init_gpio_rc522(void)
{
wiringPi(,); //初始化wiringPi库
GPIO_init(spi_cs,,,); //输出,下拉,无调试
GPIO_init(spi_ck,,,); //输出,下拉,无调试
GPIO_init(spi_mosi,,,); //输出,下拉,无调试
GPIO_init(spi_miso,,,); //输入,下拉,无调试
GPIO_init(spi_rst,,,); //输出,下拉,无调试
} void init_rc522(void)
{
init_gpio_rc522(); //树莓派gpio应用初始化
PcdReset(); //复位RC522
PcdAntennaOff(); //关闭天线
PcdAntennaOn(); //开启天线
M500PcdConfigISOType( 'A' ); //设置RC632的工作方式
} #endif

rc522头文件的更多相关文章

  1. 【C】.h头文件的重复包含问题

    .h头文件存在的意义就是封装,可以方便多个.c源文件使用,但要防止.h头文件被同一个.c源文件多次包含. 例如, io.h文件 #ifndef _IO_H_ #define _IO_H_ #defin ...

  2. C/C++头文件区别

    在从C迁移到C++时,引用的头文件经常忘记是C的还是C++特有的 1. *.h   limits.h ctype.h 2. c* climits cctype [结尾不含.h] 3. 其余的都属于C+ ...

  3. iOS开发中遇到的错误整理 - 集成第三方框架时,编译后XXX头文件找不到

    iOS编译报错-XXX头文件找不到 错误出现的情况: 自己在继承第三方的SDK的时候,明明导入了头文件,但是系统报错,提示头文件找不到 解决方法 既然系统找不到,给他个具体路径,继续找去! 路径就填写 ...

  4. 使用powershell批量添加Keil和IAR的头文件路径

    在Keil和IAR的工程中,为了使文件结构清晰,通常会设置很多的子文件夹,然后将头文件和源文件放在不同的子文件夹中,这样就需要手动添加这些头文件夹的路径.当工程结构非常复杂时,文件夹的数量就非常多,特 ...

  5. C/C++头文件使用 #ifndef #define #endif 的原因

    背景 在编译的时候,出现"redefine"的错误,最后检查才发现对应的头文件没有写正确的预编译信息: #ifndef _HeadFileName_H #define _HeadF ...

  6. Qt - 错误总结 - 在自定义类头文件中添加Q_OBJECT 编译时报错(undefined reference to ‘vtable for xxThread)

    错误提示:在添加的QThread子类头文件添加Q_OBJECT时,编译程序,出现"undefined reference to 'vtable for xxThread'"错误提示 ...

  7. C语言中,头文件和源文件的关系(转)

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...

  8. 配置apue的头文件apue.h和unp的头文件anp.h

    配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...

  9. c/c++头文件_string

    string, cstring, string.h 一.string头文件 主要包含一些字符串转换的函数 // sto* NARROW CONVERSIONS// sto* WIDE CONVERSI ...

随机推荐

  1. CNN-卷积层和池化层学习

    卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC (1)卷积层:用它来进行特征提取,如下: 输入图像是32*32*3,3是它的深 ...

  2. Linux下逻辑地址-线性地址-物理地址图解(转)

    一.逻辑地址转线性地址 机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到. 我们写个最简单的hello world程序 ...

  3. linux kernel系列四:嵌入式系统中的文件系统以及MTD

    本节介绍File System和MTD技术 一 FS 熟知的FS有ext2,3,4.但是这些都是针对磁盘设备的.而ES中一般的存储设备为Flash,由于Flash的特殊性: Flash存储按照Bloc ...

  4. OpenGL ES3 非常好的系列文章

    OpenGL ES3 非常好的系列文章: OpenGL-ES 3.0学习指南(五)--EGL基础 NDK开发OpenGL ES 3.0(二)--初见GLES,第一个三角形 NDK开发OpenGL ES ...

  5. ASP入门(十六)-ASP开发的规范

    毋容置疑,在开发中遵守一套规范,将会有利于提高代码的可读性,较低后期维护成本. 文件存放目录规范 js 目录下存放着页面所使用的 JavaScript 脚本文件,因为我们可能用到第三方提供的免费的 J ...

  6. 【python】安装bencode

    C:\Users\horn1\Desktop\python\35-pytorrent>pip install bencodeCollecting bencode Downloading http ...

  7. Android 八款开源 Android 游戏引擎

    原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...

  8. mysql function 中使用游标

    create function p_t1(tid varchar(20))returns varchar(200)begin declare tmpName varchar(50) default ' ...

  9. Log4j中conversionPattern的含义

    %a -- 表示礼拜几,英文缩写形式,比如“Fri”%A -- 表示礼拜几,比如“Friday”%b -- 表示几月份,英文缩写形式,比如“Oct”%B -- 表示几月份,“October”%c -- ...

  10. WIN10 64位系统 如何安装.NET Framwork3.5

    把SXS文件夹复制到C盘根目录,然后以管理员身份运行CMD,大概2分钟能完成,然后这个SXS文件夹就可以删了