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

📄 复件 flash.c.bak

📁 在SoC单片机上实现对内部Flash的操作,基于uc/os-II.
💻 BAK
📖 第 1 页 / 共 2 页
字号:
						// exit criteria

		*(FLASH_COMMON_X555) = 0xF0;  // reset the flash array (short reset instruction) 
		 OSTimeDly(3);       // now delay 3 msec per dat sheet
         }
 
   	return(done);		// a successful flash erase returns 1, timeout error returns 0
}




/*Module: flash_reset
  Resets the main Flash memory to Read Array mode.
  After this reset, the Flash memory may be read like a ROM device. 
  You'll need to include the header files generated by PSDsoft
  Express. */
/***************************************************************
函数名:              flash_reset
功能描述:   复位主flash
参数 :       
            
            
注意:        
**************************************************************/


void flash_reset()reentrant	// reset flash, read array mode

{

	//  Note:  the following constants (FLASH_COMMON_XXXX)
	//     are declared type volatile in the header file 
	//	   so they are not optimized away by the compiler

  EA = 0;
	*(FLASH_COMMON_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
	*(FLASH_COMMON_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
	*(FLASH_COMMON_X555) = 0xF0;		// write 0xF0 command to reset 
	EA = 1;

						// Flash memory to Read Array Mode
  OSTimeDly(3);                    // now delay 3 msec per dat sheet
}

/***************************************************************
函数名:            flash_erase_sector
功能描述:         擦除主flash的特定扇区
参数 :      volatile unsigned char xdata* flash_bulk_erase_address 该地址
            位于任何一个flash扇区中
                                      
注意:        传入的地址应该和flash存储器的分页关系无关,
             否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
             要加锁
说明:       返回1成功;返回0 擦除失败,超时错误.
            不加锁
**************************************************************/

unsigned char flash_erase_sector(
     volatile unsigned char xdata * sector_erase_address)reentrant

{
	 char done;
 	 unsigned char poll;
 	 unsigned char error;
	 unsigned char err;
	 WDRST = 0x00;                        //清零看门狗
	 done = FALSE;
	 EA = 0;								
	 *(FLASH_COMMON_X555) = 0xAA;			// unlock main flash, write 0xAA to addess 0xX555
	 *(FLASH_COMMON_XAAA) = 0x55;			// unlock main flash, write 0x55 to addess 0xXAAA
	 *(FLASH_COMMON_X555) = 0x80;			// write 0x80 command 
	 *(FLASH_COMMON_X555) = 0xAA;			// continue unlock sequence
	 *(FLASH_COMMON_XAAA) = 0x55;			// continue unlock sequence
	 *(sector_erase_address) = 0x30;		// write 0x30 command to indicate sector erase command
   EA = 1;

  	do			// now use data polling method to verify successful erase
		 {  
	   	poll = *(sector_erase_address); 	// read flash status from any address
		                                	// within the  flash address sector space
   		  								
		error = poll & NVM_ERROR;	    	// save timeout error bit at DQ5
                
		poll = poll & NVM_DATA_POLL;		// look at D7   
		
		if (poll == NVM_DATA_POLL)			// compare DQ7 

			done = TRUE;					// erase OK,
											// indicate successful exit criteria

		else if (error == NVM_ERROR)		// check for timeout error   

			err = TRUE;						// indicate timeout error occurred

		} while((done == FALSE) && (error == FALSE)); 


	if (err == TRUE)				// make sure timeout error and data poll didn't 
									// occur simultaneously
		{
		poll = *(sector_erase_address); 	// Read flash status again

		poll = poll & NVM_DATA_POLL;		// get DQ7 of poll byte read from flash  

		if (poll == NVM_DATA_POLL)			// compare DQ7 

			done = TRUE;					// the flash erased OK at the same
											// time timout error occured, indicate successful 

			*(FLASH_COMMON_X555) = 0xF0;  		// reset the flash array (short reset instruction) 
      OSTimeDly(3);
		}									// exit criteria
   	return(done);		// a successful flash erase returns 1, timeout error returns 0
  
  
}
/***************************************************************
函数名:            flash_erase_the_sector
功能描述:         擦除主flash的给定的某个扇区扇区
参数 :      unsigned char sector  取值为 0~7                                     
注意:        要擦除某个扇区时给出扇区号既可
             
**************************************************************/
unsigned char flash_erase_the_sector(unsigned char sector)reentrant
{

   switch(sector)           //选择扇区 0~~7
	{
		case 0 :PSD8xx_reg.PAGE = SECTOR_0;		        
		         break;
		case 1 :PSD8xx_reg.PAGE = SECTOR_1;
		        break;		
		case 2 :PSD8xx_reg.PAGE = SECTOR_2;       
		        break;
		case 3 :PSD8xx_reg.PAGE = SECTOR_3;       
		        break;
		case 4 :PSD8xx_reg.PAGE = SECTOR_4;     
		        break;
		case 5 :PSD8xx_reg.PAGE = SECTOR_5;
		        break;
		case 6 :PSD8xx_reg.PAGE = SECTOR_6;   
		        break;
		case 7 :PSD8xx_reg.PAGE = SECTOR_7;
		        break;
		default :
		        return (0);  //越界	
		        break;
	 }
     flash_erase_sector(SECTOR_BASE_ADDRESS);

}
/***************************************************************
函数名:              flash_read_id
功能描述:        读主flash标识
参数 :       
            
            
注意:        传入的地址应该和flash存储器的分页关系无关,
             否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
**************************************************************/


unsigned char flash_read_id(volatile unsigned char *flash_id_address)reentrant	// read flash identifier
{

  
   unsigned char id;

  EA = 0;
	*(FLASH_COMMON_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
	*(FLASH_COMMON_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
	*(FLASH_COMMON_X555) = 0x90;		// write 0x90 command to get ID
  EA = 1;
	id = *(flash_id_address);		// read flash status, address bit A6 = 0
						//				  A1 = 0
						//				  A0 = 1
	*(FLASH_COMMON_X555) = 0xF0;  // reset the flash array (short reset instruction) 
	OSTimeDly(3); 	        // now delay 3 msec per dat sheet

	return (id);				// return byte ID value
  
}


/******************************数据转移处理***************************/
void Move (unsigned char *src, unsigned char *dest,  int len) reentrant
{
	if ( len <= 0 ) return;
	if ( src < dest ) {
		src += len;
		dest += len;
		do {
		*--dest = *--src;
		} while ( --len > 0 );
	} else
		do {
		     *dest++ = *src++;
		} while ( --len > 0 );
}
/***************************************************************
函数名:            Move_from_flash
功能描述:         读取flash中指定长度的数据
参数 :      src 源地址,指向flash中数据;dest 目的地址,指向接受数据缓冲区.
                                      
注意:        传入的src地址应该和flash存储器的分页关系无关,
             否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
**************************************************************/
void Move_from_flash (unsigned char *src, unsigned char *dest,  int len)reentrant
{
	
	
	Move(src, dest, len);
	
   
} 


/***************************************************************
函数名:            Move_to_flash
功能描述:         写flash
参数 :      src 源地址,指向数据缓冲区;dest 目的地址,指向flash.
                                      
注意:        传入的dest地址应该和flash存储器的分页关系无关,
             否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
             成功返回1,失败返回0
**************************************************************/
unsigned char Move_to_flash (unsigned char *src, unsigned char *dest,  int len)reentrant
{   
 //   unsigned char xdata *temp;
//	unsigned char dat;
//	temp = dest;
  WDRST = 0x00;   //清零看门狗
	if ( len <= 0 ) return (0);
	if ( src < dest ) {
		src += len;
		dest += len;
		do {
//		--dest ;
//		dat = *--src;
//        *--temp = *--src;
//		if(!(flash_write_with_poll(dest,dat))) return (0);
        if(!(flash_write_with_poll(dest,*src))) return (0);
		    --dest;
		    --src;
		} while ( --len > 0 );
	} else
		do {
//		     dest++;
//		     dat = *src++;
//		if(!(flash_write_with_poll(dest,dat))) return (0);
        if(!(flash_write_with_poll(dest,*src))) return (0);
             dest++;
			 src++;
		} while ( --len > 0 );
		return (1);
} 


 /******************************/
void FlashLock(void)
{
	while(MemLock == USED)
	{
		OSTimeDly(WAITFORFLASH);       //延时多长时间??
	}
	MemLock = USED;
}
/********************************/
 /******************************/
void FlashUnLock(void)
{
	MemLock = UNUSED;
}
/*******************************/

⌨️ 快捷键说明

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