⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yy1.c.bak

📁 在SoC单片机上实现对内部Flash的操作,基于uc/os-II.
💻 BAK
字号:
/******************说明*********************
* 10/30修改
*测试: 0~64k的范围内的flash一次写入,分批读出 . 成功.0~256k没做测试
*一次性写入64k数据用时大约30秒,在写入完毕前,其它任务等待(抢占式),如果一次写入数据小于1k
*任务间感觉不到延时.
*说明:   无论是读写flash还是擦除flash都是互斥的,由Sector_Status表示,为了以后扩充flash状态定义为字节型
*10/31修改测试,解决了不能换页的问题
////////////测试说明/////////////
在扇区0从低地址0x00000000~~~~0x000003FF写入1k字节数据,
然后分别在以下地址读取数据:
0x0000--0x000F  显示0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8       
0x03F0--0x03FF  显示0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8                    
0x0400--0x040F  读出全1,说明数据正确写入扇区0即0页头1k的位置.
                
0x7FF0--0x7FFF  读出全1  
0x8000--0x800F  读出全1
0x83F0--0x83FF  读出全1
0xFFF0--0xFFFF  读出全1
0x10000--0x1000F  读出全1
0x103F0--0x103FF  读出全1
注意:keil下不能仿真页面切换,以上数据是在upsd3254bv上的实际运行情况.
*********************************************/
#include <includes.h>

void TaskStartyya(void *yydata) reentrant;
void TaskStartyyb(void *yydata) reentrant;
void TaskStartyyc(void *yydata) reentrant;
void TaskStartyyd(void *yydata) reentrant;

OS_STK TaskStartStkyya[MaxStkSize];//注意:我在ASM文件中设置?STACK空间为40H即64。
OS_STK TaskStartStkyyb[MaxStkSize];


PSD_REGS PSD8xx_reg _at_ 0x8000;
unsigned char xdata buf1[8] = {0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8};
unsigned int i;
   unsigned char j;
   unsigned int k;
   unsigned char xdata buf2[8];
   unsigned long pos;
   unsigned long pos2;
extern unsigned char Sector_Status;

///////////////////////////
////////

void main(void)
{
//初始化看门狗
	WDKEY = 0x55;             //停止看门狗

	PSD8xx_reg.VM.bits.PIO_EN = 0;          
	PSD8xx_reg.DATAOUT_A.byte = 0x2a;     	// initial output data
	PSD8xx_reg.CONTROL_A = 0x00;     	// 1=latched address out, 0=genernal I/O
	PSD8xx_reg.DIRECTION_A = 0xff;   	// 1= ouput mode, 0 = input mode 
	PSD8xx_reg.OUTENABLE_A = 0xff;		//
	PSD8xx_reg.DRIVE_A = 0x00;       	// upper 4 bits (bit7-4) are for open-drain/CMOS control of PA7-4
 //   PSD8xx_reg.PAGE=0;                                 	// 1 = open drain, 0 = CMOS
                                     	// lower 4 bits (bit3-0) are for slew late control of PA3-0
                                     	// 1 = higher slew rate, 0 = normal slew rate
	PSD8xx_reg.OMCMASK_AB = 0x00;    	// write mask control of MCellAB
                                       	// 1 = blocking write, 0 = enable write
	PSD8xx_reg.OMC_AB = 0xff;	


 
    OSInit();
    init_flash();
    InitTimer0();
    ycc_com_init(0,1200,1);
	ycc_com_init(1,9600,0);
    
    OSTaskCreate(TaskStartyya, (void *)0, &TaskStartStkyya[0],2);
    OSTaskCreate(TaskStartyyb, (void *)0, &TaskStartStkyyb[0],3);
	  OSTaskCreate(TaskStartyyc, (void *)0, &TaskStartStkyyb[0],4);
    OSTaskCreate(TaskStartyyd, (void *)0, &TaskStartStkyyb[0],5); 
    OSStart();

}


void TaskStartyya(void *yydata) reentrant
{   int i;
    yydata=yydata;
    
    clrscr();
    PrintStr("\n\t\t*******************************\n");
    PrintStr("\t\t*     Hello! The world.       *\n");
    PrintStr("\t\t*******************************\n\n\n");
    PrintStr("\t\t zai 0x0000---0x03ff zhong xie ru 1k shu ju  \n\n\n");  
    while(1)
    {	
    	 PrintStr("\tAAAAAA111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	     P3_3=0;	    
       for(i=0;i<8192;i++)   //在flash中写入64k数据
	     {
	       pos =(unsigned long )(8*i);
	       ycc_mem_write(&buf1[0],8,pos);
	     }		  
	    #ifdef USE_COM2
		  PrintChar2('A');
		  PrintChar2('T');
		  PrintChar2('\r');
		#endif  
    }    
}

 
void TaskStartyyb(void *yydata) reentrant
{
    yydata=yydata; 
    PrintStr("0x0000--0x0000F \n"); 	
     ycc_mem_read(&buf2[0],8,0x0000);
     for(j=0;j<8;j++)
    	{
	       PrintByte(buf2[j]);
	    }
     ycc_mem_read(&buf2[0],8,0x0008);
    for(j=0;j<8;j++)
	  {
	      PrintByte(buf2[j]);
      }
	    PrintStr("\n");
	  PrintStr("\tBBBBBBBBB111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	  
    while(1)
   {
     
 
	 ///////////////////////////////
     PrintStr("0x03F0--0x03FF \n"); 	  
   ycc_mem_read(&buf2[0],8,0x03F0);
    for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }	 	
  ycc_mem_read(&buf2[0],8,0x03F8);
  for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }	 
 PrintStr("\n");
 	  PrintStr("\tBBBBBBBBB111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	 
 ///////////////////////////////////////////
      PrintStr("0x0400--0x040F \n"); 	
  ycc_mem_read(&buf2[0],8,0x0400);
  for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }
   ycc_mem_read(&buf2[0],8,0x0408);
  for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }	 
 PrintStr("\n");
	  PrintStr("\tBBBBBBBBB111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	
//////////////////////////////////////
  PrintStr("0x7FF0--0x7FFF\n");          //扇区1尾
  ycc_mem_read(&buf2[0],8,0x7FF0);
  for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }
  ycc_mem_read(&buf2[0],8,0x7FF8);
  for(j=0;j<8;j++)
	{
	    PrintByte(buf2[j]);
	 }
	  PrintStr("\n");
  	  PrintStr("\tBBBBBBBBB111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	

 
    }   

}


  void TaskStartyyc(void *yydata) reentrant
 {
	  yydata=yydata; 	
	  while(1)
	  {
		////////////////////////////////////////////
     PrintStr("0x8000--0x800F\n");    //扇区2头
     ycc_mem_read(&buf2[0],8,0x8000);
     for(j=0;j<8;j++)
	      {
	        PrintByte(buf2[j]);
	      }
    ycc_mem_read(&buf2[0],8,0x8008);
    for(j=0;j<8;j++)
	      {
	         PrintByte(buf2[j]);
	      }
    PrintStr("\n");
     	  PrintStr("\tCCCCCCCCCCC111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	
    PrintStr("0x83F0--0x83FF\n");
    ycc_mem_read(&buf2[0],8,0x83F0);
     for(j=0;j<8;j++)
	      {
	         PrintByte(buf2[j]);
	       }
    ycc_mem_read(&buf2[0],8,0x83F8);
      for(j=0;j<8;j++)
	       {
	          PrintByte(buf2[j]);
	       }
    PrintStr("\n");
      	  PrintStr("\tCCCCCCCCCCC111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	  
///////////////////////////////////////
     PrintStr("0xFFF0--0xFFFF\n");  // 扇区2尾
     ycc_mem_read(&buf2[0],8,0xFFF0);  
     for(j=0;j<8;j++)
	    {
	        PrintByte(buf2[j]);
	    }
     ycc_mem_read(&buf2[0],8,0xFFF8);  
    for(j=0;j<8;j++)
	   {
	       PrintByte(buf2[j]);
	    }
    PrintStr("\n");
          	  PrintStr("\tCCCCCCCCCCC111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	 

    }
  }


 void TaskStartyyd(void *yydata) reentrant
 {
   	yydata=yydata; 	
   	while(1)
   	{
   		////////////////////////////////////////
   PrintStr("0x10000--0x1000F\n");         //扇区3头
    ycc_mem_read(&buf2[0],8,0x10000);  
     for(j=0;j<8;j++)
	   {
	       PrintByte(buf2[j]);
	   }
   ycc_mem_read(&buf2[0],8,0x10008);  
   for(j=0;j<8;j++)
	   {
	      PrintByte(buf2[j]);
	   }
       PrintStr("\n");
         	  PrintStr("\tDDDDDDDDDDDDD111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	   
////////////////////////////////////////////////////	
	    PrintStr("0x103F0--0x103FF\n"); 
     ycc_mem_read(&buf2[0],8,0x103F0);  
      for(j=0;j<8;j++)
	     {
	        PrintByte(buf2[j]);
	     }
    ycc_mem_read(&buf2[0],8,0x103F8);  
     for(j=0;j<8;j++)
	     {
	         PrintByte(buf2[j]);
	     }
     PrintStr("\n");
        PrintStr("\tDDDDDDD111111 is active.\n");
    	 P3_3=1;
        OSTimeDly(OS_TICKS_PER_SEC);    
	    P3_3=0;	
    }
  }
   	
   


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -