RFID节点的编写

新项目开始咯,其实就是华清项目的换皮,增强了对传感器的控制加了大量的32采集与控制节点,由于时间紧迫先按照节点发布文章。以后有时间会发一些框架和整体数据流向分析的文章。

一、RFID节点框架

我的想法是使用超高频RFID技术,在门口布置一个大型的RFID读写器,采集出入货物电子标签的信息,这个电子标签也可以只有ID,但这样就要在这个节点加一个数据库,32这么小的内存就不太够了,需要换成A9.因为我只会这两个型号的单片机所以哈哈。

在ZET6上使用串口连接一个cc2530.使用SPI来和RC522通信.超高频的RFID读写器太贵了好几千真的没钱了。所以使用RC522代替一下。主要这个范围太小只能拿ID卡来模拟咯。

蜂鸣器是为了整个系统报警用的。可以换成继电器控制那种特别响的大功率报警器。OLED用来显示信息。但是它太小了也就能显示个ID。所以我换了我以前买的一块触摸屏。100块(太痛了)。

二、具体的程序

首先需要使用来把字库传到我们的串行Flash

使用的是UNIGBK.bin字库烧入到SD卡然后写个SD卡驱动,当然不是我写的。直接就是调用哈哈。

/**
  ******************************************************************************
  * 文件名程: main.c 
  * 作    者: 硬石嵌入式开发团队
  * 版    本: V1.0
  * 编写日期: 2015-10-04
  * 功    能: 中文字库烧写
  ******************************************************************************
  * 说明:
  * 本例程配套硬石stm32开发板YS-F1Pro使用。
  * 
  * 淘宝:
  * 论坛:http://www.ing10bbs.com
  * 版权归硬石嵌入式开发团队所有,请勿商用。
  ******************************************************************************
  */  

//使用之前:
//1.保证已经把字库文件拷贝到SD卡内并插入到开发板上,
//五个文件:stxinhei16.xbf,kaiti24.xbf,UNIGBK.BIN,GBK_HZ1616.FON和GBK_HZ2424.FON
//2.使用该工程写字库文件需要一定时间请耐心等候保存字库写入成功
//3.使用该工程建议使用串口调试助手工具查看字库写入进度。

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "bsp/led/bsp_led.h"
#include "bsp/key/bsp_key.h"
#include "bsp/beep/bsp_beep.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/spi_flash/bsp_spi_flash.h"
#include "ff.h"

/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
#define GBK_HZ1616                  (1)   //1:使能烧写GBK_HZ1616.FON字库文件(裸机中文显示专用);0:不烧写
#define GBK_HZ2424                  (1)   //1:使能烧写GBK_HZ2424.FON字库文件(裸机中文显示专用);0:不烧写
#define FATFS_UNIGBK                (1)   //1:使能烧写UNIGBK.BIN字库文件(FatFS文件系统专用);0:不烧写
#define XBF_STXIHEI16               (1)   //1:使能烧写stxihei16.xbf字库文件(STemWin专用);0:不烧写
#define XBF_KAITI24                 (1)   //1:使能烧写kaiti24.xbf字库文件(STemWin专用);0:不烧写

#define GBK_HZ1616_ADDR       (10*4096)   // GBK_HZ1616.FON字库文件存放在串行Flash的地址
#define GBK_HZ2424_ADDR       (75*4096)   // GBK_HZ2424.FON字库文件存放在串行Flash的地址
#define FATFS_UNIGBK_ADDR    (332*4096)   // UNIGBK.BIN字库文件存放在串行Flash的地址
#define XBF_STXIHEI16_ADDR   (380*4096)   // stxihei16.xbf字库文件存放在串行Flash的地址
#define XBF_KAITI24_ADDR     (750*4096)   // kaiti24.xbf字库文件存放在串行Flash的地址

#define GBK_HZ1616_SIZE            (64)   // GBK_HZ1616.FON字库文件占用扇区数(每个扇区为4096个字节)
#define GBK_HZ2424_SIZE           (144)   // GBK_HZ2424.FON字库文件占用扇区数(每个扇区为4096个字节)
#define FATFS_UNIGBK_SIZE          (43)   // UNIGBK.BIN字库文件存放占用扇区数(每个扇区为4096个字节)
#define XBF_STXIHEI16_SIZE        (348)   // stxihei16.xbf字库文件存占用扇区数(每个扇区为4096个字节)
#define XBF_KAITI24_SIZE          (628)   // kaiti24.xbf字库文件存占用扇区数(每个扇区为4096个字节)


/* 获取缓冲区的长度 */
/* 私有变量 ------------------------------------------------------------------*/
FATFS fs;													/* FatFs文件系统对象 */
FIL file;													/* 文件对象 */
FRESULT f_res;                    /* 文件操作结果 */
UINT fnum;            					  /* 文件成功读写数量 */

/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
static void printf_fatfs_error(FRESULT fresult);
/* 函数体 --------------------------------------------------------------------*/

/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{   
  uint32_t write_addr=0,j=0;
	uint8_t tempbuf[256]={0};
  
  /* 初始化LED灯 */
  LED_GPIO_Init();
  /* 初始化独立按键 */ 
  KEY_GPIO_Init();
  /* 初始化蜂鸣器 */
  BEEP_GPIO_Init();
  
  /* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */
  DEBUG_USART_Init();    
  printf("****** 这是一个烧写中文字库到串行Flash空间内实验 ******\n");
  printf("》》按下开发板KEY1按键开始烧写\n");
  
  while(KEY1_StateRead()==KEY_UP);//等待按键被按下
  
  /* 初始化串行Flash */
	SPI_FLASH_Init();
  
	//挂载文件系统
  f_res = f_mount(&fs,"0:",1);  

	printf_fatfs_error(f_res);
  
  //如果文件系统挂载失败就停机
	if(f_res != FR_OK)
	{
		while(1);
	}
  
/**************************  GBK_HZ1616.FON字库文件  *****************************************/		
#if GBK_HZ1616
  f_res = f_open(&file,"0:GBK_HZ1616.FON",FA_OPEN_EXISTING | FA_READ);
	printf("f_open GBK_HZ1616.FON res=%d\n",f_res);
  
	if(f_res==FR_OK)
  {
    // 擦除空间
	  write_addr=GBK_HZ1616_ADDR;
	  for(j=0;j<GBK_HZ1616_SIZE;j++)//擦除扇区
	  {
	   	SPI_FLASH_SectorErase(write_addr+j*4096);
	  }
    
    // 烧写字库文件
	  j=0;
	  write_addr=GBK_HZ1616_ADDR;
	  while(f_res == FR_OK) 
	  {
		  f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 
		  if(f_res!=FR_OK)break;			 //执行错误  
		  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    
		  write_addr+=256;				
		  j++;
		  if(fnum !=256)break;
	  } 
  }
	f_close(&file);
	
  BEEP_ON;
	SPI_FLASH_BufferRead(tempbuf,GBK_HZ1616_ADDR,256);			//读取数据,打印验证
	printf("readbuf GBK_HZ1616.FON:\n");
	for(j=0;j<256;j++)
		printf("%02X ",tempbuf[j]);
	printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");
	if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_ON;
  BEEP_OFF;
#endif  //#if GBK_HZ1616
/**************************  END GBK_HZ1616.FON字库文件  *****************************************/  

  
/**************************  GBK_HZ2424.FON字库文件  *****************************************/		
#if GBK_HZ2424
  f_res = f_open(&file,"0:GBK_HZ2424.FON",FA_OPEN_EXISTING | FA_READ);
	printf("f_open GBK_HZ2424.FON res=%d\n",f_res);
  
	if(f_res==FR_OK)
  {
    // 擦除空间
	  write_addr=GBK_HZ2424_ADDR;
	  for(j=0;j<GBK_HZ2424_SIZE;j++)//擦除扇区
	  {
	   	SPI_FLASH_SectorErase(write_addr+j*4096);
	  }
    
    // 烧写字库文件
	  j=0;
	  write_addr=GBK_HZ2424_ADDR;
	  while(f_res == FR_OK) 
	  {
		  f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 
		  if(f_res!=FR_OK)break;			 //执行错误  
		  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    
		  write_addr+=256;				
		  j++;
		  if(fnum !=256)break;
	  } 
  }
	f_close(&file);
	
  BEEP_ON;
	SPI_FLASH_BufferRead(tempbuf,GBK_HZ2424_ADDR,256);			//读取数据,打印验证
	printf("readbuf GBK_HZ2424.FON:\n");
	for(j=0;j<256;j++)
		printf("%02X ",tempbuf[j]);
	printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");
	if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED2_ON;
  BEEP_OFF;
#endif  //#if GBK_HZ2424
/**************************  END GBK_HZ2424.FON字库文件  *****************************************/  

  
/**************************  UNIGBK.BIN字库文件  *****************************************/		
#if FATFS_UNIGBK
  f_res = f_open(&file,"0:UNIGBK.BIN",FA_OPEN_EXISTING | FA_READ);
	printf("f_open UNIGBK.BIN res=%d\n",f_res);
  
	if(f_res==FR_OK)
  {
    // 擦除空间
	  write_addr=FATFS_UNIGBK_ADDR;
	  for(j=0;j<FATFS_UNIGBK_SIZE;j++)//擦除扇区
	  {
	   	SPI_FLASH_SectorErase(write_addr+j*4096);
	  }
    
    // 烧写字库文件
	  j=0;
	  write_addr=FATFS_UNIGBK_ADDR;
	  while(f_res == FR_OK) 
	  {
		  f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 
		  if(f_res!=FR_OK)break;			 //执行错误  
		  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    
		  write_addr+=256;				
		  j++;
		  if(fnum !=256)break;
	  } 
  }
	f_close(&file);
	
  BEEP_ON;
	SPI_FLASH_BufferRead(tempbuf,FATFS_UNIGBK_ADDR,256);			//读取数据,打印验证
	printf("readbuf UNIGBK.BIN:\n");
	for(j=0;j<256;j++)
		printf("%02X ",tempbuf[j]);
	printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");
	if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_ON;
  BEEP_OFF;
#endif  //#if FATFS_UNIGBK
/**************************  END UNIGBK.BIN字库文件  *****************************************/  

  
/**************************  stxihei16.xbf字库文件  *****************************************/		
#if XBF_STXIHEI16
  f_res = f_open(&file,"0:stxihei16.xbf",FA_OPEN_EXISTING | FA_READ);
	printf("f_open stxinhei16.xbf res=%d\n",f_res);
  
	if(f_res==FR_OK)
  {
    // 擦除空间
	  write_addr=XBF_STXIHEI16_ADDR;
	  for(j=0;j<XBF_STXIHEI16_SIZE;j++)//擦除扇区
	  {
	   	SPI_FLASH_SectorErase(write_addr+j*4096);
	  }
    
    // 烧写字库文件
	  j=0;
	  write_addr=XBF_STXIHEI16_ADDR;
	  while(f_res == FR_OK) 
	  {
		  f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 
		  if(f_res!=FR_OK)break;			 //执行错误  
		  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    
		  write_addr+=256;				
		  j++;
		  if(fnum !=256)break;
	  } 
  }
	f_close(&file);
	
  BEEP_ON;
	SPI_FLASH_BufferRead(tempbuf,XBF_STXIHEI16_ADDR,256);			//读取数据,打印验证
	printf("readbuf stxihei16.xbf:\n");
	for(j=0;j<256;j++)
		printf("%02X ",tempbuf[j]);
	printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");
	if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED1_OFF;
  BEEP_OFF;
#endif  //#if XBF_STXIHEI16
/**************************  END stxihei16.xbf字库文件  *****************************************/  

  
/**************************  kaiti24.xbf字库文件  *****************************************/		
#if XBF_KAITI24
  f_res = f_open(&file,"0:kaiti24.xbf",FA_OPEN_EXISTING | FA_READ);
	printf("f_open kaiti24.xbf res=%d\n",f_res);
  
	if(f_res==FR_OK)
  {
    // 擦除空间
	  write_addr=XBF_KAITI24_ADDR;
	  for(j=0;j<XBF_KAITI24_SIZE;j++)//擦除扇区
	  {
	   	SPI_FLASH_SectorErase(write_addr+j*4096);
	  }
    
    // 烧写字库文件
	  j=0;
	  write_addr=XBF_KAITI24_ADDR;
	  while(f_res == FR_OK) 
	  {
		  f_res = f_read( &file, tempbuf, 256, &fnum);//读取数据	 
		  if(f_res!=FR_OK)break;			 //执行错误  
		  SPI_FLASH_PageWrite(tempbuf,write_addr,256);  //拷贝数据到串行flash上    
		  write_addr+=256;				
		  j++;
		  if(fnum !=256)break;
	  } 
  }
	f_close(&file);
	
  BEEP_ON;
	SPI_FLASH_BufferRead(tempbuf,XBF_KAITI24_ADDR,256);			//读取数据,打印验证
	printf("readbuf kaiti24.xbf:\n");
	for(j=0;j<256;j++)
		printf("%02X ",tempbuf[j]);
	printf("\n如果tempbuf不全为 FF ,那么说明字库拷贝成功!!!\n");
	if((tempbuf[0]!=0xff)&&(tempbuf[1]!=0xff))LED3_OFF;
  BEEP_OFF;
#endif  //#if XBF_KAITI24
/**************************  END kaiti24.xbf字库文件  *****************************************/  

//不再使用文件系统,取消挂载文件系统
  f_res = f_mount(NULL,"0:",1);
  
  /* 无限循环 */
  while (1)
  {    
  }
}

/**
  * 函数功能: FatFS文件系统操作结果信息处理.
  * 输入参数: FatFS文件系统操作结果:FRESULT
  * 返 回 值: 无
  * 说    明: 无
  */
static void printf_fatfs_error(FRESULT fresult)
{
  switch(fresult)
  {
    case FR_OK:                   //(0)
      printf("》操作成功。\n");
    break;
    case FR_DISK_ERR:             //(1)
      printf("!!硬件输入输出驱动出错。\n");
    break;
    case FR_INT_ERR:              //(2)
      printf("!!断言错误。\n");
    break;
    case FR_NOT_READY:            //(3)
      printf("!!物理设备无法工作。\n");
    break;
    case FR_NO_FILE:              //(4)
      printf("!!无法找到文件。\n");
    break;
    case FR_NO_PATH:              //(5)
      printf("!!无法找到路径。\n");
    break;
    case FR_INVALID_NAME:         //(6)
      printf("!!无效的路径名。\n");
    break;
    case FR_DENIED:               //(7)
    case FR_EXIST:                //(8)
      printf("!!拒绝访问。\n");
    break;
    case FR_INVALID_OBJECT:       //(9)
      printf("!!无效的文件或路径。\n");
    break;
    case FR_WRITE_PROTECTED:      //(10)
      printf("!!逻辑设备写保护。\n");
    break;
    case FR_INVALID_DRIVE:        //(11)
      printf("!!无效的逻辑设备。\n");
    break;
    case FR_NOT_ENABLED:          //(12)
      printf("!!无效的工作区。\n");
    break;
    case FR_NO_FILESYSTEM:        //(13)
      printf("!!无效的文件系统。\n");
    break;
    case FR_MKFS_ABORTED:         //(14)
      printf("!!因函数参数问题导致f_mkfs函数操作失败。\n");
    break;
    case FR_TIMEOUT:              //(15)
      printf("!!操作超时。\n");
    break;
    case FR_LOCKED:               //(16)
      printf("!!文件被保护。\n");
    break;
    case FR_NOT_ENOUGH_CORE:      //(17)
      printf("!!长文件名支持获取堆空间失败。\n");
    break;
    case FR_TOO_MANY_OPEN_FILES:  //(18)
      printf("!!打开太多文件。\n");
    break;
    case FR_INVALID_PARAMETER:    // (19)
      printf("!!参数无效。\n");
    break;
  }
}
/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

这是硬石给的官方模板。写的真的太好了,我就直接拿来用了。烧入完编写我们的RFID程序。因为文件很多下面我只分享主文件。等项目完工我会整个上传到git仓库到时候评论区放链接。

 /* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stdlib.h"
#include "bsp/usart/bsp_debug_usart.h"
#include "bsp/lcd/bsp_lcd.h"
#include "bsp/RC522/rc522_function.h"
#include "bsp/RC522/rc522_config.h"
#include "bsp/systick/bsp_SysTick.h"
#include "bsp/beep/bsp_beep.h"
//#include "bsp/usart/bsp_usart2.h"


/* 私有类型定义 --------------------------------------------------------------*/
/* 私有宏定义 ----------------------------------------------------------------*/
/* 私有变量 ------------------------------------------------------------------*/
unsigned char RFID[16];	
unsigned char card_1[4]={176,42,57,82};
uint8_t KEY[6]={0xff,0xff,0xff,0xff,0xff,0xff};
uint8_t Rxflag=0;
uint8_t ucTemp;
uint8_t ucaRxBuf[256];
uint16_t usRxCount;


/* 扩展变量 ------------------------------------------------------------------*/
/* 私有函数原形 --------------------------------------------------------------*/
void IC_test ( void );
int test(void);
  
/* 函数体 --------------------------------------------------------------------*/
/*****************************   重要说明     *******************************
 *
 *  使用本例程之前,需要运行“YSF1-051. 烧写中文字库到串行Flash”例程
 *
 *****************************************************************************/


/**
  * 函数功能: 主函数.
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
int main(void)
{   

	
	uint32_t lcdid;
	/* 初始化3.5寸TFT液晶模组,一般优先于调试串口初始化 */
	lcdid=BSP_LCD_Init();   
	/* 调试串口初始化配置,115200-N-8-1.使能串口发送和接受 */
	DEBUG_USART_Init();
	BEEP_GPIO_Init();
	SysTick_Init();  
	RC522_Init ();	

	/* 调用格式化输出函数打印输出数据 */
	printf("LCD ID=0x%08X\n",lcdid);  
  
	/* 开背光 */
	LCD_BK_ON();
  
	PcdReset();
  
	M500PcdConfigISOType ( 'A' );//设置工作方式
		
  while ( 1 )
  {
	  printf("\nRFID start\n");
	  Delay_ms(1000);
      IC_test ();//IC卡检测	
	  //scanf("%s",ucaRxBuf);
	  if(test() == 1)
	  {
		printf("%s\r\n",ucaRxBuf);
	 
		LCD_DispString_EN(0,20,ucaRxBuf,BLACK, YELLOW,FONT_24);
	  }
		printf("\nRFID stop\n");
  }
}

/** 
	* 接收串口的数据,分析并处理 
	* 可以将此段代码封装为一个函数,在主程序其它流程调用
*/
int test()
{
		if(Rxflag)
		{
			if (usRxCount < sizeof(ucaRxBuf))
			{
				ucaRxBuf[usRxCount++] = ucTemp;
			}
			else
			{
				usRxCount = 0;
			}
			
			/* 遇到换行字符,认为接收到一个命令 */
			if (ucTemp == '+')	/* 换行字符 */
			{
				usRxCount = 0;
				return 1;
			}
			Rxflag=0;
		}
	return 0;
}

	
	
/**
  * 函数功能: 门禁测试函数
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */
void IC_test ( void )
{
	char cStr [ 30 ];
	//unsigned char s=0x08;
	unsigned char ucArray_ID [ 4 ];  //先后存放IC卡的类型和UID(IC卡序列号)
	uint8_t ucStatusReturn;          //返回状态
	//uint8_t *len;
	//uint8_t *buf;
	//while ( 1 )
	{ 
       /*寻卡*/
		if ( ( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ) ) != MI_OK )                                   
			 /*若失败再次寻卡*/
			ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID );		   
		if ( ucStatusReturn == MI_OK  )
		{
		/*防冲撞(当有多张卡进入读写器操作范围时,防冲突机制会从其中选择一张进行操作)*/
			if ( PcdAnticoll ( ucArray_ID ) == MI_OK )  
			{
				sprintf ( cStr, "The Card ID is: %02X%02X%02X%02X", ucArray_ID [ 0 ], ucArray_ID [ 1 ], ucArray_ID [ 2 ], ucArray_ID [ 3 ] );							
				printf ( "%s\r\n",cStr ); 
				LCD_DispString_EN(0,0,cStr,BLACK, YELLOW,FONT_24);
				//USART_printf(USART2," \r\n %s \r\n",cStr);
				
				/*选卡*/
				ucStatusReturn=PcdSelect(ucArray_ID) ;       
			}        
		}
		//scanf("%s",buf);
		//printf("%c",USART_ReceiveData(USARTx));
		//LCD_DispString_EN(0,20,get_rebuff(len),BLACK, YELLOW,FONT_24);
	}
}
/******************************************************************************/
/*                 STM32F10x Peripherals Interrupt Handlers                   */
/*  Add here the Interrupt Handler for the used peripheral(s) (PPP), for the  */
/*  available peripheral interrupt handler's name please refer to the startup */
/*  file (startup_stm32f10x_xx.s).                                            */
/******************************************************************************/
void USART1_IRQHANDLER(void)
{
	printf("/n11111/n");
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{ 	
	    Rxflag=1;		
		ucTemp = USART_ReceiveData(USART1);
	} 
	 
}

/******************* (C) COPYRIGHT 2015-2020 硬石嵌入式开发团队 *****END OF FILE****/

目前还只能读RFID通过zigbee发送,无法处理zigbee接收到的信息神奇。

应该是程序没写好等我后面一起发 

三、GPIO分配表

cc2530:
    PA2/USART2_TXD                              串口2发送
    PA3/USART2_RXD                              串口2接收
RC522:
    PB12/TIM1_BKIN                              CS
    PB13/TIM1_CH1N                              SCK
    PB14/TIM1_CH2N                              MOSI
    PB15/TIM1_CH3N                              MISO
    PC0/ADC123_IN10/OV_D0                       restart
TFT:
    省略,这块不懂原理我就直接用了
    PE2/TP_NIRQ                                 电阻触摸屏中断
    PE3/TP_SCK                                  电阻触摸屏时钟线
    PE4/TP_MOSI                                 电阻触摸屏数据线
    PE5/TP_MISO                                 电阻触摸屏数据线
    PE6/TP_CS                                   电阻触摸屏片选
  经典A9,A10串口一

蜂鸣器:
    PD7/BEEP                                    蜂鸣器

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宇努力学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值