Example #1
0
File: FS.c Project: welbur/zj
/****************************************************************************
* 名    称:FS_Init
* 功    能:初始化系统配置,小车配置等信息
* 参    数:无
* 反    回:无
* 说    明:
****************************************************************************/
void FS_Init(void)
{
	#if SPI_FLASH_DEBUG
	u16 ChipID = 0;
	#endif
	
	SPI_Flash_Init();
	
  #if SPI_FLASH_DEBUG
	ChipID = SPI_Flash_ReadID();
	if((ChipID & FLASH_ID) == FLASH_ID)
		printf("Read SPI Flash Chip ID Success\r\n");
	else
		printf("Read SPI Flash Chip ID Error\r\n");
	#endif
	
	SPI_Flash_Read( CAR_CFG_OFFSET, (u8*)&Car_Save_Info, sizeof(Car_Save_Info));
	if( strcmp( Car_Save_Info.CheckStr , CAR_CHECK_STR)  !=  NULL )
	{
		#if SPI_FLASH_DEBUG
		printf("Read CarPara Error,Write to Default Info\r\n");
		#endif
		memset( (char*)&Car_Save_Info, 0x00, sizeof(Car_Save_Info));
		sprintf(Car_Save_Info.CheckStr,"%s",CAR_CHECK_STR);

		Car_Save_Info.CarPara.RunMode = CAR_MODE_MANUAL;
		Car_Save_Info.CarPara.SetSpeed = 15;
		
		SPI_Flash_Write( CAR_CFG_OFFSET, (unsigned char *)&Car_Save_Info, sizeof(Car_Save_Info));
	}
	#if SPI_FLASH_DEBUG
	printf("Read CarPara Success\r\n");
	#endif
	
	SPI_Flash_Read( ROUTE_CFG_OFFSET, (u8*)&Route_Save_Info, sizeof(Route_Save_Info));
	if( strcmp( Route_Save_Info.CheckStr , ROUTE_CHECK_STR)  !=  NULL )
	{
		#if SPI_FLASH_DEBUG
		printf("Read Route Error,Write to Default Info\r\n");
		#endif
		memset( (char*)&Route_Save_Info, 0x00, sizeof(Route_Save_Info));
		sprintf(Route_Save_Info.CheckStr,"%s",ROUTE_CHECK_STR);
		
		SPI_Flash_Write( ROUTE_CFG_OFFSET, (unsigned char *)&Route_Save_Info, sizeof(Route_Save_Info));
	}
	#if SPI_FLASH_DEBUG
	printf("Read Route Success\r\n");
	#endif
	

}
Example #2
0
//----读取BT参数---------------------------------------------------------------
u8 read_para_BT_enable()
{
	u8 ch;

	SPI_Flash_Read((u8*)&ch, FILE_PARA_ADDR, 1); 
	return ch;
}
Example #3
0
//初始化字体
//返回值:0,字库完好.
//其他,字库丢失
u8 font_init(void)
{
    u32 tempsys[2];//临时记录文件起始位置和文件大小

    u8 fontok=0;

    SPI_Flash_Read(&fontok,FONTINFOADDR+24,1);//读出字库标志位,看是否存在字库

    if(fontok!=0XAA)return 1;//字库错误.FLASH不存在字库
    SPI_Flash_Read((u8*)tempsys,FONTINFOADDR,8);//读出8个字节

    ftinfo.ugbksize=tempsys[1];	//UNIGBK的大小

    SPI_Flash_Read((u8*)tempsys,FONTINFOADDR+8,8);//读出8个字节

    ftinfo.f16addr=tempsys[0];	//FONT16的起始地址

    return 0;
}
Example #4
0
//code 字符指针开始
//从字库中查找出字模
//code 字符串的开始地址,GBK码
//mat  数据存放地址 size*2 bytes大小	 
void Get_HzMat(unsigned char *code,unsigned char *mat,u8 size)
{		    
	unsigned char qh,ql;
	unsigned char i;					  
	unsigned long foffset; 
	qh=*code;
	ql=*(++code);
	if(qh<0x81||ql<0x40||ql==0xff||qh==0xff)//非常用汉字
	{   		    
	    for(i=0;i<(size*2);i++)*mat++=0x00;//填充满格
	    return; //结束访问
	}          
	if(ql<0x7f)ql-=0x40;//注意!
	else ql-=0x41;
	qh-=0x81;   
	foffset=((unsigned long)190*qh+ql)*(size*2);//得到字库中的字节偏移量  		  

	if(size==16)SPI_Flash_Read(mat,foffset+ftinfo.f16addr,32);
	else SPI_Flash_Read(mat,foffset+ftinfo.f12addr,24);     												    
}  
Example #5
0
DRESULT disk_read (
	BYTE drv,		/* Physical drive nmuber (0..) */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	/* Sector address (LBA) */
	BYTE count		/* Number of sectors to read (1..255) */
)
{

	u8 res=0; 
    if (!count)return RES_PARERR;//count不能等于0,否则返回参数错误		 	 
	switch(drv)
	{
		case SD_CARD://SD卡
			if (count > 1)
			{
				SD_ReadMultiBlocks(buff, sector*BLOCK_SIZE, BLOCK_SIZE, count);
			
					  /* Check if the Transfer is finished */
			     SD_WaitReadOperation();  //循环查询dma传输是否结束
			
			    /* Wait until end of DMA transfer */
			    while(SD_GetStatus() != SD_TRANSFER_OK);
		
			}
			else
			{
				
				SD_ReadBlock(buff, sector*BLOCK_SIZE, BLOCK_SIZE);
		
					  /* Check if the Transfer is finished */
			     SD_WaitReadOperation();  //循环查询dma传输是否结束
			
			    /* Wait until end of DMA transfer */
			    while(SD_GetStatus() != SD_TRANSFER_OK);
		
			}
			break;
		case EX_FLASH://外部flash
			for(;count>0;count--)
			{
				SPI_Flash_Read(buff,sector*BLOCK_SIZE,BLOCK_SIZE);
				sector++;
				buff+=BLOCK_SIZE;
			}
			res=0;
			break;
		default:
			res=1; 
	}
   //处理返回值,将SPI_SD_driver.c的返回值转成ff.c的返回值
    if(res==0x00)return RES_OK;	 
    else return RES_ERROR;

}
Example #6
0
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 
	u32 secpos;
	u16 secoff;
	u16 secremain;	   
 	u16 i; 
	u8 * SPI_FLASH_BUF;	  
#ifdef MEM_ALLOC_TABLE_SIZE			
	SPI_FLASH_BUF=mymalloc(4096);	//使用内存管理 
	if(SPI_FLASH_BUF==NULL)return;	//申请失败
#else
	SPI_FLASH_BUF=SPI_FLASH_BUFFER;	//不使用内存管理
#endif	 
	secpos=WriteAddr/4096;//扇区地址 0~511 for w25x16
	secoff=WriteAddr%4096;//在扇区内的偏移
	secremain=4096-secoff;//扇区剩余空间大小    
	if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
	while(1) 
	{	
		SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
		SPI_USART_IO_SET(0);//SPI 工作
		for(i=0;i<secremain;i++)//校验数据
		{
			if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
			for(i=0;i<secremain;i++)	   //复制
			{
				SPI_FLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

		}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. 				   
		if(NumByteToWrite==secremain)break;//写入结束了
		else//写入未结束
		{
			secpos++;//扇区地址增1
			secoff=0;//偏移位置为0 	 

		   	pBuffer+=secremain;  //指针偏移
			WriteAddr+=secremain;//写地址偏移	   
		   	NumByteToWrite-=secremain;				//字节数递减
			if(NumByteToWrite>4096)secremain=4096;	//下一个扇区还是写不完
			else secremain=NumByteToWrite;			//下一个扇区可以写完了
		}	 
	};	 
	SPI_USART_IO_SET(1);//USART2 工作
#ifdef MEM_ALLOC_TABLE_SIZE			
	myfree(SPI_FLASH_BUF);		//释放内存	 	 
#endif
}
Example #7
0
DRESULT disk_read (
	BYTE drv,		/* Physical drive nmuber (0..) */
	BYTE *buff,		/* Data buffer to store read data */
	DWORD sector,	/* Sector address (LBA) */
	BYTE count		/* Number of sectors to read (1..255) */
)
{
	SD_Error Status = SD_OK;


	switch(drv)
	{
		case SD_CARD://SD卡
	//SD卡开始----------------------------------------
			if (count == 1) 
			{
				Status = SD_ReadBlock(buff, sector << 9 , SECTOR_SIZE);
			} 
			else 
			{
				Status = SD_ReadMultiBlocks(buff, sector << 9 , SECTOR_SIZE, count);
			}
		

	//SD卡结束----------------------------------------
			break;
	case EX_FLASH://外部flash
			for(;count>0;count--)
			{
				SPI_Flash_Read(buff,sector*SECTOR_SIZE,SECTOR_SIZE);
				sector++;
				buff+=SECTOR_SIZE;
			}
			Status=SD_OK;
			break;
	default:
			Status=SD_ERROR;
	}

			
			
			if (Status == SD_OK) 
			{
				return RES_OK;
			} 
			else
			{
				printf("Err: SD_ReadMultiBlocks(,%d,%d)\r\n",sector,count);
				return RES_ERROR;
			}
			
}
Example #8
0
//用这个函数得到字体地址
//在系统使用汉字支持之前,必须调用该函数
//包括FONT16ADDR,FONT12ADDR,UNI2GBKADDR;  
u8 Font_Init(void)
{
	u32 tempsys[2];//临时记录文件起始位置和文件大小
	u8 fontok=0;
	SPI_Flash_Read(&fontok,24,1);//读出字库标志位,看是否存在字库
	if(fontok!=0XAA)return 1;
	SPI_Flash_Read((u8*)tempsys,0,8);//读出8个字节   
	UNI2GBKADDR=tempsys[0];					  
	//printf("tempsysgbk[0]:%d\n",tempsys[0]);
	//printf("tempsysgbk[1]:%d\n",tempsys[1]);

	SPI_Flash_Read((u8*)tempsys,8,8);//读出8个字节   
	//printf("tempsysf16[0]:%d\n",tempsys[0]);
	//printf("tempsysf16[1]:%d\n",tempsys[1]);
	FONT16ADDR=tempsys[0];
	
	SPI_Flash_Read((u8*)tempsys,16,8);//读出8个字节   
	//printf("tempsysf12[0]:%d\n",tempsys[0]);
	//printf("tempsysf12[1]:%d\n",tempsys[1]);
	FONT12ADDR=tempsys[0];
	return 0;	 
}
Example #9
0
//将UNICODE码转换为GBK码
//unicode:UNICODE码
//返回值:GBK码				 
u16 UnicodeToGBK(u16 unicode)//用二分查找算法
{
   	u32 offset;
	u8 temp[2];
	u16 res;
	if(unicode<=0X9FA5)offset=unicode-0X4E00;
	else if(unicode>0X9FA5)//是标点符号
	{
		if(unicode<0XFF01||unicode>0XFF61)return 0;//没有对应编码
		offset=unicode-0XFF01+0X9FA6-0X4E00;    
	}  
	SPI_Flash_Read(temp,offset*2+UNI2GBKADDR,2);//得到GBK码   
	res=temp[0];
	res<<=8;
	res+=temp[1];						 
	return res ; //返回找到的编码
}						 							  
Example #10
0
/*******************************************************************************
* Function Name  : MAL_Read
* Description    : Read sectors
* Input          : None
* Output         : None
* Return         : 0,OK
                   1,FAIL
*******************************************************************************/
u16 MAL_Read(u8 lun, u32 Memory_Offset, u32 *Readbuff, u16 Transfer_Length)
{
	u8 STA;
	switch (lun)
	{
		case 0:		    
			STA=SD_ReadDisk((u8*)Readbuff, Memory_Offset>>9, Transfer_Length>>9);	   
			break;			    
		case 1:	 
			STA=0;
			SPI_Flash_Read((u8*)Readbuff, Memory_Offset, Transfer_Length);   		  
			break;	  
		default:
			return MAL_FAIL;
	}
	if(STA!=0)return MAL_FAIL;
	return MAL_OK;
}
Example #11
0
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
{ 
	u32 secpos;
	u16 secoff;
	u16 secremain;	   
 	u16 i;    
	u8 * SPI_FLASH_BUF;	  
   	SPI_FLASH_BUF=SPI_FLASH_BUFFER;	     
 	secpos=WriteAddr/4096;//扇区地址  
	secoff=WriteAddr%4096;//在扇区内的偏移
	secremain=4096-secoff;//扇区剩余空间大小   
 	//printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
 	if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
	while(1) 
	{	
		SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
		for(i=0;i<secremain;i++)//校验数据
		{
			if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除  	  
		}
		if(i<secremain)//需要擦除
		{
			SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
			for(i=0;i<secremain;i++)	   //复制
			{
				SPI_FLASH_BUF[i+secoff]=pBuffer[i];	  
			}
			SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

		}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间. 				   
		if(NumByteToWrite==secremain)break;//写入结束了
		else//写入未结束
		{
			secpos++;//扇区地址增1
			secoff=0;//偏移位置为0 	 

		   	pBuffer+=secremain;  //指针偏移
			WriteAddr+=secremain;//写地址偏移	   
		   	NumByteToWrite-=secremain;				//字节数递减
			if(NumByteToWrite>4096)secremain=4096;	//下一个扇区还是写不完
			else secremain=NumByteToWrite;			//下一个扇区可以写完了
		}	 
	};	 
}
Example #12
0
//更新某一个
//fxpath:路径
//fx:更新的内容 0,ungbk;1 ,gbk16;
//返回值:0,成功;其他,失败.
u8 updata_fontx(u8 *fxpath,u8 fx)
{
    u32 flashaddr=0;
    u32 tempsys[2];  //临时记录文件起始位置和文件大小
    FIL * fftemp;
    u8 res;
    u16 bread;
    u32 offx=0;
    fftemp=&gbkFile;
    if(fftemp==NULL)return 1;			//内存分配出错.
    res=f_open(fftemp,(const TCHAR*)fxpath,FA_READ);
    if(res)//打开文件失败
    {
        f_close(fftemp);
        return 2;//文件丢失
    }
    if(fftemp==NULL)return 2;

    if(fx==0)//更新UNI2GBK.SYS
    {
        tempsys[0]=ftinfo.ugbkaddr;							//UNIGBK存放地址
        tempsys[1]=fftemp->fsize;	 	  					//UNIGBK 大小
        SPI_Flash_Write((u8*)tempsys,FONTINFOADDR,8);		//记录在地址FONTINFOADDR+1~8处
        flashaddr=ftinfo.ugbkaddr;
    } else//GBK16
    {
        SPI_Flash_Read((u8*)tempsys,FONTINFOADDR,8);    //读出8个字节
        flashaddr=tempsys[0]+tempsys[1];
        tempsys[0]=flashaddr;								//GBK16的起始地址
        tempsys[1]=fftemp->fsize;	 	  					//GBK16 大小
        SPI_Flash_Write((u8*)tempsys,FONTINFOADDR+8,8);	//记录在地址FONTINFOADDR+1~8+16处
    }
    while(res==FR_OK)//死循环执行
    {
        res=f_read(fftemp,temp,1024,(UINT *)&bread);
        if(res!=FR_OK)break;				//执行错误
        SPI_Flash_Write(temp,offx+flashaddr,1024);//从0开始写入1024个数据
        offx+=bread;
        fupd_prog(fftemp->fsize,offx);			//进度显示
        if(bread!=1024)break;					//读完了.
    }
    return res;
}
Example #13
0
WCHAR ff_convert (	/* Converted code, 0 means conversion error */
	WCHAR	src,	/* Character code to be converted */
	UINT	dir		/* 0: Unicode to OEMCP, 1: OEMCP to Unicode */
)
{
   
	WCHAR t[2];
	WCHAR c;
	u32 i, li, hi;
	u16 n;			 
	u32 gbk2uni_offset=0;		  
						  
	if (src < 0x80)c = src;//ASCII,直接不用转换.
	else 
	{
 		if(dir)	//GBK 2 UNICODE
		{
			gbk2uni_offset=ftinfo.ugbksize/2;	 
		}else	//UNICODE 2 GBK  
		{   
			gbk2uni_offset=0;
		}
		//if(UK_FLAG)//存在 		    
		{
		 
			hi=ftinfo.ugbksize/2;//对半开.
			hi =hi / 4 - 1;
			li = 0;
			for (n = 16; n; n--)
			{
				i = li + (hi - li) / 2;	
				SPI_Flash_Read((u8*)&t,ftinfo.ugbkaddr+i*4+gbk2uni_offset,4);//读出8个字节  
				if (src == t[0]) break;
				if (src > t[0])li = i;  
				else hi = i;    
			}
			c = n ? t[1] : 0;  
 		}
	 ;
	}
	return c; 
}		   
Example #14
0
u8 SearchId(FILE_RECORD_STRUCT new_card)
{
	u32 addr;
	u32 finaladdr;
	u16 i;
	FILE_RECORD_STRUCT card;
	u8 ret = 0;

	if((new_card.time<LastSaveTime)||(new_card.time<0x51308fe9)||(new_card.time>0x96c8df8d))	 // LastTime 修改
	{
		ret = 3;						 //时间错误
	 	goto loop2;                      	
	}

	if(storeaddrlist.RecordCount>=RECORD_MAX_COUNT)
	{
		ret = 2;
		goto loop2;
	}

	if((timeoutaddrlist.RecordCount==0))  //表格内无数据
	{
		ret = 0;
		finaladdr = FILE_SETION_START_DATA_ADDR;
		goto loop2;		  	
	}

	finaladdr = FILE_SETION_START_DATA_ADDR + (timeoutaddrlist.RecordCount-1)*sizeof(FILE_RECORD_STRUCT);
	addr = finaladdr;
	   
	for(i=0; i<SEARCH_MAX_NUM; i++)
	{

		if((addr<FILE_SETION_START_DATA_ADDR)||(addr>FILE_SETION_END_DATA_ADDR))
		{
			ret = 4	;			  /////地址出现异常
			goto loop2;
		}	
		SPI_Flash_Read((u8*)&card, addr, sizeof(FILE_RECORD_STRUCT));
		if(((new_card.time - card.time)<=TIMEMAX))  //在比较时间内
		{
			if(new_card.rfid==card.rfid)
			{
				ret = 1;
				goto loop2;			  //卡号重复
			}		
		}
		else						 //在一定时间段内无数据
		{
			ret = 0;
			finaladdr += sizeof(FILE_RECORD_STRUCT);
			goto loop2;				  //需要保存
		}
						
		if(addr==FILE_SETION_START_DATA_ADDR)
			addr = FILE_SETION_END_DATA_ADDR;
		else
			addr = addr -  sizeof(FILE_RECORD_STRUCT);
				
	}	
	loop2:
		if(ret!= 3) 
			LastSaveTime = new_card.time;
		if(ret==0)
		{
			if(finaladdr>=FILE_SETION_END_DATA_ADDR)
				finaladdr = FILE_SETION_START_DATA_ADDR;
			SPI_Flash_WriteQ((u8*)&new_card, finaladdr, sizeof(FILE_RECORD_STRUCT));	 //存储数据

			SaveDate(&timeoutaddrlist);	
		}		

		return ret;	
}
 int main(void)
 {
		u8 Data_PC[SIZE];    //从Flash中读取数据到Data_PC,并上传至上位机
	  u16 a,b=0;

		delay_init();	    	 //延时函数初始化	  
		NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级
		uart_init(9600);	   //串口初始化为9600
		LED_Init();			     //LED端口初始化
		LCD_Init();
	  KEY_Init(); 
		WORD_Init();	
	  TIM2_Int_Init(999,7199);	  
	  TIM3_Int_Init(9,7199);
	  EXTIX_Init();		 	   //外部中断初始化
		Adc_Init();		  		 //ADC初始化
	 	SPI_Flash_Init();  	 //SPI FLASH 初始化 
		
	while(1)
	{
//功能:开机状态显示
//说明:1.开机,绿灯亮(DS1)
//      2.使用temp是为了避免重复执行该if语句
		if(flag2==1&&temp==0)     
		{
		  while(SPI_Flash_ReadID()!=W25Q64)							//检测不到W25Q64
			{
				LCD_ShowString(40,150,200,16,16,"W25Q64 Check Failed!");
				delay_ms(500);
				LCD_ShowString(40,150,200,16,16,"Please Check!      ");
				delay_ms(500);
				LED0=!LED0;//DS0闪烁
			}
	    LCD_ShowString(60,130,200,16,16,"W25Q64 Ready!");
		  LED1=0;
			temp=1;
    }
		
//功能:数据采集并保存至Flash中	
//说明:1.使用temp1是为了避免重复使能TIM3	
//      2.使用temp2是为了避免在数据上传至上位机的过程中,与终止上传功能相冲突
//      3.flag1=1代表按键按下,并开始采集	
//      4.flag2=1代表开机,flag2=0代表未开机	
//      5.采集过程中,红灯(DS0)以一定频率闪烁		
		if(flag2==1&&temp2==0&&flag1==1)
		{
      if(temp1==0)
			{
				LCD_ShowString(20,150,200,16,16,"Data collection began...");
			  TIM_Cmd(TIM3, ENABLE);   //使能TIM3中断
        LED0=0;				
      }
			temp1=1;
			if(flag_cycle==0&&flag_cycle_1==0)
			{
				SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+counter*SIZE,SIZE);
				counter++;
				flag_cycle_1=1;
      }
			if(flag_cycle==1&&flag_cycle_1==0)
			{
				SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+counter*SIZE,SIZE);
				counter++;
				flag_cycle_1=1;
      }						
		}

//功能:将Flash中采集到的数据上传至上位机	
//说明:1.使用temp1是为了保证上传是在采集之后进行
//      2.使用temp3是为了避免由于按键误操作使得该程序重复被执行
//      3.flag1=0代表按键再次被按下,上传开始	;若再次被按下,则上传被终止;之后再按就没有作用了	
//      4.上传过程中,红灯(DS0)以一定频率闪烁
		if(temp1==1&&temp3==0&&flag1==0)
		{
			TIM_Cmd(TIM3, DISABLE);    //失能TIM3中断
			
			//用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题
			if((time_collect-1)%42!=0)
			{
				data_residue=(time_collect-1)%42*6;
				if(flag_cycle==0)
				{
					SPI_Flash_Write((u8*)TEXT_Buffer2,FLASH_SIZE+(counter+1)*SIZE,SIZE);
        }
				if(flag_cycle==1)
				{
					SPI_Flash_Write((u8*)TEXT_Buffer1,FLASH_SIZE+(counter+1)*SIZE,SIZE);					
        }
      }
				
			LCD_ShowString(20,170,200,16,16,"Data collection complete!");
			LCD_ShowString(20,190,200,16,16,"Data is being uploaded...");
			temp2=1;

			for(a=1;a<counter;a++)
			{
				LED0=!LED0;
				SPI_Flash_Read(Data_PC,FLASH_SIZE+a*SIZE,SIZE);
				for(b=0;b<SIZE;b++)     
				{
				 if(flag1==1)      //上传中途使用按键停止传送
				 {
					break;
				 }
				 USART_GetFlagStatus(USART1, USART_FLAG_TC);
				 USART_SendData(USART1,Data_PC[b]);			  
				 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);				
				}
				if(flag1==1)      //上传中途使用按键停止传送
				{
				 LCD_ShowString(20,210,200,16,16,"Data upload is terminated!");	
				 break;
				}
			}
			
			//用于解决当采集时间不是42ms的倍数时,部分采集数据未写入FLash的问题
			if(flag1!=1&&(time_collect-1)%42!=0)
			{
				LED0=!LED0;
				SPI_Flash_Read(Data_PC,FLASH_SIZE+(a+1)*SIZE,SIZE);
				for(b=0;b<data_residue;b++)     
				{
				 if(flag1==1)      //上传中途使用按键停止传送
				 {
					break;
				 }
				 USART_GetFlagStatus(USART1, USART_FLAG_TC);
				 USART_SendData(USART1,Data_PC[b]);			  
				 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);				
				}
				if(flag1==1)      //上传中途使用按键停止传送
				{
				 LCD_ShowString(20,210,200,16,16,"Data upload is terminated!");	
				 break;
				}
      }
			
			if(flag1!=1)   //要么显示数据上传完成,要么显示数据上传完成
			{
				LCD_ShowString(20,210,200,16,16,"Data upload is completed!");
			}
			temp3=1;		
     }

//功能:关机并擦除Flash	
//说明:1.flag2=0代表关机,与上temp1,temp2是要保证前面的已被执行
//      2.关机过程中擦除Flash,完成之后红绿灯同时亮一秒后灭		 
		if(temp1==1&&temp2==1&&flag2==0)   //关机机状态显示
		{
			flag1=0;
			flag2=0;
      temp1=0;
      temp2=0;			
			LED0=1;
			LED1=1;
			SPI_Flash_Erase_Chip();
		  LED0=0;
			LED1=0;
			delay_ms(1000);
			LED0=1;
			LED1=1;
			LCD_ShowString(80,230,200,16,16,"Shutdown!");
    }
  }	
}
Example #16
0
/*
*	函数名:USART3_ReceiveDW()
*	描述:	串口3数据接收处理
*	输入:	无
*	输出: 	无
*	返回:	无
*/
void USART3_ReceiveDW()			//接收到的数据处理
{
	if(USART3_Flag & 0x20)
	{
		u8 tem=(USART3_RxBuffer[1]-0x30)*10+USART3_RxBuffer[2]-0x30;	//计算命令字
		switch(USART3_RxBuffer[0])
		{
			case 'R':
			{	//读命令
				switch(tem)
				{
					case 1: //发送本机地址
					{
						Send_Address();	
						Clear_RxBuffer();
						break;
					}
					case 2: //发送本机机器类型
					{
						Send_MACHINE_TYPE();	
						Clear_RxBuffer();
						break;
					}
					case 3: //发送本机当前运行状态
					{
						USART3_TxBuffer[0]=RUN_STATE;
						USART3_TxBuffer[1]=0x0D;		//结束符
						USART3_TxBuffer[2]=0x0A;
						USART3_TxLen=3;
						USART3_SendDW();	
						Clear_RxBuffer();
						break;
					}
					case 4: //发送机器当前模具条码
					{
						SendMJCode();
						Clear_RxBuffer();
						break;
					}
					case 5: //发送当前员工条码  
					{
						SendYGCode();
						Clear_RxBuffer();
						break;
					}
					case 6: //发送机器当前模具开模总数
					{
						Send_MMYY(MJ_Cnt);
						Clear_RxBuffer();
						break;
					}
					case 7: //发送机器当前模具安装时间
					{
						Send_MMYY(MJ_Tim);
						Clear_RxBuffer();
						break;
					}
					case 8: //发送机器当前员工开模计数
					{
						Send_MMYY(YG_Cnt);
						Clear_RxBuffer();
						break;
					}
					case 9: //发送机器当前员工在岗时间
					{
						Send_MMYY(YG_Tim);
						Clear_RxBuffer();
						break;
					}
					case 20: //返回指令字001命令
					{
						USART3_SendWorld=1;
						Clear_RxBuffer();
						break;
					}
					case 21: //返回指令字110命令
					{
						USART3_SendWorld=2;
						Clear_RxBuffer();
						break;
					}
					case 22: //返回指令字111命令
					{
						USART3_SendWorld=3;
						Clear_RxBuffer();
						break;
					}
					case 23: //返回指令字112命令
					{
						USART3_SendWorld=4;
						Clear_RxBuffer();
						break;
					}
					case 24: //返回指令字113命令
					{
						USART3_SendWorld=5;
						Clear_RxBuffer();
						break;
					}
					case 25: //返回指令字114命令
					{
						USART3_SendWorld=6;
						Clear_RxBuffer();
						break;
					}
					case 26: //返回指令字110命令
					{
						USART3_SendWorld=19;
						Clear_RxBuffer();
						break;
					}
					case 27: //返回指令字111命令
					{
						USART3_SendWorld=8;
						Clear_RxBuffer();
						break;
					}
					case 28: //返回指令字112命令
					{
						USART3_SendWorld=9;
						Clear_RxBuffer();
						break;
					}
					case 29: //返回指令字113命令
					{
						USART3_SendWorld=10;
						Clear_RxBuffer();
						break;
					}
					case 30: //返回指令字114命令
					{
						USART3_SendWorld=11;
						Clear_RxBuffer();
						break;
					}
					case 31: //返回指令字115命令
					{
						USART3_SendWorld=12;
						Clear_RxBuffer();
						break;
					}
					case 32: //返回指令字116命令
					{
						USART3_SendWorld=13;
						Clear_RxBuffer();
						break;
					}
					case 33: //返回指令字117命令
					{
						USART3_SendWorld=14;
						Clear_RxBuffer();
						break;
					}
					case 34: 	//返回系统上电信息
					{
						USART3_SendWorld=15;
						Clear_RxBuffer();
						break;
					}
					case 35:	//返回员工上岗信息
					{
						USART3_SendWorld=16;
						Clear_RxBuffer();
						break;
					}
					case 36:	//返回模具安装信息
					{
						USART3_SendWorld=17;
						Clear_RxBuffer();
						break;
					}
					case 37:	//返回模具安装信息
					{
						USART3_SendWorld=19;
						Clear_RxBuffer();
						break;
					}
					default :
					{	//命令错误
						Send_Error();
						Clear_RxBuffer();
						break;
					}
				}
				break;
			}
			case 'W':
			{	//写命令
				switch(tem)
				{
					case 1:		//修改本机地址
					{	
						SPI_Flash_Write(&USART3_RxBuffer[3],Flash_Base0,3);	//修改本机站号
						SPI_Flash_Read(ADDRESS,Flash_Base0,3);		//读取地址
						Send_Address();		//返回修改后的地址
						Clear_RxBuffer();
						break;
					}
					case 2:		//修改本机机器类型
					{	
						SPI_Flash_Write(&USART3_RxBuffer[3],Flash_Base1,2);	//修改本机机器类型
						SPI_Flash_Read(MACHINE_TYPE,Flash_Base1,2);		//读取机器类型
						Send_MACHINE_TYPE();		//返回修改后的机器类型
						Clear_RxBuffer();
						break;
					}
					case 3:		//修改模具条码
					{
						Clear_RxBuffer();
						break;
					}
					case 4:		//修改员工条码
					{
						u8 i;
						if(YGTM_Flag & 0x01)
						{//当前有员工条码
							if(YG_CodeLend == (USART3_RxCounter-5))
							{	//新接收的员工条码与旧的员工条码长度相同
								if(Char_Compare(YG_Code,&USART3_RxBuffer[3],YG_CodeLend)==1)
								{//接收到相同的条码,认为员工结束上岗		
									YGTM_Flag =0;		//清员工条码标志位
									USART3_SendWorld=14;	//发送员工上岗结束
								}
								else
								{//接收到不同的条码
									YGTM_Flag = 0;
									YGTM_Flag |= 0x02;		//清员工条码标志位
									USART3_SendWorld=14;	//发送员工上岗结束
									for(i=0;i<USART3_RxCounter-5;i++)
									New_YG_Code[i]=USART3_RxBuffer[i+3];
									New_YG_CodeLend=USART3_RxCounter-5;
								}
							}
							else
							{//新接收的员工条码与旧的员工条码长度不相同,则认为接收到新条码
								YGTM_Flag =0;
								YGTM_Flag |=02;		//清员工条码标志位
								USART3_SendWorld=14;	//发送员工上岗结束
								for(i=0;i<USART3_RxCounter-5;i++)
								New_YG_Code[i]=USART3_RxBuffer[i+3];
								New_YG_CodeLend=USART3_RxCounter-5;
							}
						}
						else
						{//当前无员工条码,则认为接收到新条码
							YGTM_Flag |=0X01;	//标志当前有条码
							for(i=0;i<USART3_RxCounter-5;i++)
							YG_Code[i]=USART3_RxBuffer[i+3];
							YG_CodeLend=USART3_RxCounter-5;
							USART3_SendWorld=13;	//发送新条员工码数据
						}
						Clear_RxBuffer();
						break;
					}
					case 5:
					{//订单生产完毕,指示灯闪烁
						LED_ON();
						Clear_RxBuffer();
						break;
					}
					case 6:
					{//指示灯停止闪烁
						LED_OFF();
						Clear_RxBuffer();
						break;
					}
					case 7:
					{//修改模具开模数量,:W07|1234
						MJ_Cnt=(USART3_RxBuffer[5]-0x30)*1000+(USART3_RxBuffer[6]-0x30)*100+(USART3_RxBuffer[7]-0x30)*10+USART3_RxBuffer[8]-0x30;	//计算命令字
						YG_Cnt=MJ_Cnt;
						Clear_RxBuffer();
						break;
					}
					default :
					{	//命令错误
						Send_Error();
						Clear_RxBuffer();
						break;
					}
				}
				break;
			}
			case 'S':
			{	//系统相关命令
				switch(tem)
				{
					case 1:	
					{	//系统软件复位
						NVIC_SystemReset();		//系统软件复位
						Clear_RxBuffer();
						break;
					}
					case 2:
					{	//读取系统当前运行时间
						USART3_SendWorld=100;
						Clear_RxBuffer();
						break;
					}
					case 3:
					{//用于接收上位机返回的信息,不处理
						Clear_RxBuffer();
						break;
					}
					default:
					{	//错误,没此命令
						Send_Error();
						Clear_RxBuffer();
						break;
					}
				}
				break;
			}
			default: 
			{	//命令错误
// 				Send_Error();
				break;
			}
		}
		Communicate_Computer();
		USART3_Flag &= 0x0F;		//清标识位
		USART3_RxCounter=0;			//清零
		USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);	//开中断
	}
}