亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? flash.c

?? 基于HMS7202的波形發生器源程序
?? C
字號:
#include "hms7202lib.h"
#include "flash.h"

/****************************************************************/
/*           constant define
***************************************************************/
#define  FLASH_CMD_ID         0x90
#define  FLASH_CMD_READ       0xFFFFFFFF
#define  FLASH_CMD_READ_STAT  0x70707070
#define  FLASH_STAT_OK        0x00800080
#define  FLASH_CMD_CLEAR_STAT 0x50505050
#define  FLASH_CMD_BLOCK_ERASE   0x20202020
#define  FLASH_CMD_CONFM         0xD0D0D0D0
#define  FLASH_CMD_WORD_PRM   0x40404040
#define  FLASH_CMD_CLBLB      0x60606060

#define  BLOCKSIZE    0x20000
#define  BANKSIZE     0x04000000
#define  BANKMASK     0xFC000000  //64MB for each bank
#define  BLOCKMASK    0xFFFE0000    //128KB for each block

/*#define  BLOCKSIZE    0x40000
#define  BANKSIZE     0x04000000
#define  BANKMASK     0xFC000000  //64MB for each bank
#define  BLOCKMASK    0xFFFC0000    //256KB for each block(2 flash chip)*/

#define  FAIL  0x0
#define  OK    0x1

/***************************************************************/
/*        獲取flash的廠家ID和設備ID
          先獲取flash的開始地址,然后在這地址上寫讀ID命令
          等待1ms后讀取廠家ID(開始地址處的內容)和設備ID(開始地址+1處的內容)
*****************************************************************/
static int flash_get_ID(int addr,int *vendorID,int *devID)
{
    int chip_base;
    chip_base = addr & BANKMASK;
    
    *((char *)chip_base)=FLASH_CMD_ID;//讀ID命令字
    delay(10);
    
    *vendorID = *((int *)(chip_base)) & 0xff;
    *devID = *((int *)(chip_base+0x2)) & 0xff;
    
    return OK;
}

/***********************************************************/
/* 函數功能  讀取flash中的內容
   輸入參數  addr:flash開始地址,des目的指針,size欲讀取字節數
   返回值  若讀取成功,返回OK,否則,返回FAIL      
************************************************************/
static int  flash_readarry(int addr,char *des,int size)
{
    int i=0;
    volatile unsigned int *p = (volatile unsigned int *)addr;
    char *psrc = (char *)addr;
    char *pdes = des;
    if(addr < FLASH_BASE || addr > FLASH_LIMIT)
    {
        ser_printf("\n0x%x is not a valid address",addr);
        return FAIL;//not valid address
    }
    *p = FLASH_CMD_READ;//read arry mode
    while(i<size)
    {
        *pdes++ = *psrc++;
        i++;
    }
    return OK;
}

/*************************************************************/
/*       確認當前塊已解鎖,若未解鎖則解鎖,若已解鎖則返回OK
**************************************************************/
static int isunlock(int addr)
{
    int statvalue;
    volatile int *p,*pstat;
    p = (volatile int *)addr;
    pstat = (volatile int *)addr;
    
    //分析塊是否已鎖
    *p = FLASH_CMD_READ_STAT;//進入讀狀態寄存器模式
    statvalue = *p;//讀取狀態寄存器的值
    if(statvalue & 0x10001)//塊被鎖
    {
        while(*pstat & 0x00c400c4 !=0x00800080);//SR7!=1 | SR6!=0 | SR2!=0
        *p = FLASH_CMD_CLBLB;
        *p = FLASH_CMD_CONFM;//解鎖
        while(*pstat & FLASH_STAT_OK !=FLASH_STAT_OK);//等待解鎖完成
        if(*pstat & 0x00200020) //解鎖出錯
        {
            *p = FLASH_CMD_CLEAR_STAT;//清狀態寄存器
            ser_printf("\nUnlock block fail. Address: 0x%x",p);
            return FAIL;
        }
        return OK;//解鎖成功
    }
    return OK;//未被鎖
}
/************************************************************/
/*         等待設備某操作結束
         先進入讀狀態寄存器模式,然后讀取狀態寄存器的值
          根據狀態寄存器值來判斷操作是否已結束
*************************************************************/
static int flash_wait()
{
    volatile int status;
    *(volatile int *)(0x00000000) = FLASH_CMD_READ_STAT;
    do 
    {
	status = *(volatile int *)(0x00000000);
    } while(status != FLASH_STAT_OK);
}

/**********************************************************/
/*             清除狀態寄存器
***********************************************************/
static int flash_clr_status()
{
    *(volatile unsigned int *)(0x00000000) = FLASH_CMD_CLEAR_STAT;
}
/*********************************************************/
/*               擦除塊,一次只能擦除一個塊
輸入參數block_base,塊基地址,128K字節對齊
************************************************************/
static int flash_block_erase(int block_base)
{
    volatile int *pstat,*pblock,*p;
    pblock = (volatile int *)block_base;
    pstat = (volatile int *)block_base;
    p     = (volatile int *)block_base;
    int i;
    
    
    if(isunlock(block_base) == FAIL) return FAIL;
    
    *pblock = FLASH_CMD_BLOCK_ERASE;
    *pblock = FLASH_CMD_CONFM;
    while(*pstat & FLASH_STAT_OK != FLASH_STAT_OK);//等待塊擦除結束
    i = *pstat;
    if(*pstat & 0x00200020) //說明擦除操作出錯
    {
        *p = FLASH_CMD_CLEAR_STAT;//清狀態寄存器
        ser_printf("\nBlock erase fail. Address: 0x%x",pblock);
        return FAIL;
    }    
    return OK;
}

/**************************************************************/
/*   片擦除
  輸入參數block_base,片擦除開始地址,128K字節對齊;block_num,欲擦除的塊數
***************************************************************/
int flash_chip_erase(int addr, int block_num)
{
    int i,block_base;
    block_base = addr & BLOCKMASK;
    for(i=0;i<block_num;i++)
    {
        if(flash_block_erase(block_base) == FAIL) return FAIL;
        block_base += BLOCKSIZE;
    }
    return OK;
}

/************************************************************/
/*           片字編程
輸入參數  base_addr,開始地址;pData,數據指針;data_size,數據大小,以字為單位
*************************************************************/
int flash_word_pgm(int base_addr, int* pData, int data_size)
{
    int i,addr,block_num;
    volatile int *p,*pstatvalue;
    volatile int *pdes;
    addr = base_addr;
    pstatvalue = (volatile int *)base_addr;
    pdes = (int *)base_addr;
    block_num = (((base_addr+data_size*4) & BLOCKMASK)-(base_addr & BLOCKMASK))/0x20000+1;
    //先判斷所用的塊是否已解鎖
    for(i=0;i<block_num;i++)
    {
      if(isunlock(addr) == FAIL) return FAIL;
      addr +=BLOCKSIZE;
    }
    //進行字編程
    
    for(i=0;i<data_size;i++)
    {
        p = (volatile int *)(base_addr + i);
        pstatvalue = p;
        *p = FLASH_CMD_WORD_PRM;
        *pdes++ = *pData++;
        delay(100);
        *p = FLASH_CMD_READ_STAT;
        delay(100);
        while(*pstatvalue & FLASH_STAT_OK != FLASH_STAT_OK);//等待編程操作結束
        if(*pstatvalue & 0xfffefffe != FLASH_STAT_OK)
        {
            ser_printf("\nProgram fail.  Address: 0x%x",pdes-1);
            return FAIL;
        } 
    }
    //進行字節校驗
    *((volatile int *)addr) = FLASH_CMD_READ;
    
    for(i=data_size;i>0;i--)
    {
      if(*--pdes !=*--pData)
      {
          ser_printf("\nVerify error. Address: 0x%x",pdes);
          return FAIL;
      }
    }
    return OK;
    
}


/*****************************************************************/
/*                     片編程
輸入參數 addr開始地址;pData數據指針;data_size數據字節數
***************************************************************/
/*int flash_pgm(int addr, char* pData, int data_size)
{
    char block_data[128*1024];//block data
    volatile int status;
    int base_addr,block_addr,length;
    int i,j,block_num;
    short *pSrc;
    short *pDest;
    base_addr = (addr & BANKMASK);//屏蔽基地址低25位,即取基地址對應的flash開始地址


	// count sector number 
	block_num = (((addr+data_size) & BLOCKMASK) - (addr & BLOCKMASK))/0x20000+1;
	
	// erase each sector 
	block_addr = addr & BLOCKMASK;
	for( i = 0 ; i < block_num ; i++ )
	{
		block_addr = block_addr + i*0x20000;
		// read data from block 
		for( j = 0 ; j < 32*1024 ; j++ )
			((long *)block_data)[j] = ((long *)block_addr)[j];//將block_data[128*1024]的基地址和塊開始地址對齊
		if( i == 0 )//第0個塊
		{
			// copy length 
			length = 128*1024-(addr-block_addr);
			length = (length < data_size)? length : data_size;
			// copy target data to temp data 
			
			for( j = 0 ; j < length ; j++ )
			{
				block_data[addr-block_addr+j] = pData[j];
			}
		}
		else if( i == (block_num - 1) )//最后一個塊
		{
			length = (addr+data_size) - block_addr;
			for( j = 0 ; j < length ; j++ )
			{
				block_data[j] = pData[data_size-length+j];
			}
		}
		else
		{
			for( j = 0 ; j < 128*1024 ; j++ )
			{
				block_data[j] = pData[block_addr-addr+j];
			}
		}
		// erase block 
		if(flash_block_erase(block_addr)==FAIL)  return FAIL;
		// write data to sector 
		pDest = (short *)block_addr;
		pSrc = (short *)block_data;
		for( j = 0 ; j < 64*1024 ; j++ )
		{
		    *((volatile int *)(base_addr)) = FLASH_CMD_WORD_PRM;
		    pDest[j] = pSrc[j];
		    //*(volatile int *)(0x00000000) = FLASH_CMD_READ_STAT;//進入讀狀態模式
           do 
           {   
               status = *(volatile int *)(0x00000000);
           } while(status & FLASH_STAT_OK != FLASH_STAT_OK);//等待字編程結束
           if(status&0x08 != 0x0 ) return FAIL;

		    // check data 
		    if( pDest[j] != pSrc[j] )
		    {
		    	ser_printf("\nwrite address %x error!\n",block_addr+j*2);
		    	return FAIL;
		    }
		}
	}
	
	return OK;
}*/


/****************************************************************/
/*               flash測試函數
****************************************************************/
void flash_test()
{
    char data[256];
    int i,vendorID,devID;
    
    flash_get_ID(0x00000002,&vendorID,&devID);
    ser_printf("\nvendor ID: 0x%x  dev ID: 0x%x",vendorID,devID);
    flash_readarry(0x00000000,data,256);
    for(i=0;i<256;i++)
    data[i] = i;
    flash_chip_erase(0x00000000,1);
    delay(10000);
    
    /*for(i=0;i<4;i++)
    {
    *((volatile int *)0x000a0000) = FLASH_CMD_WORD_PRM;
    *((volatile int *)0x000a0000+i) = 0x55+i;
    //delay(100);
    }*/
    flash_word_pgm(0x00000000,(int *)data,64);
    
    
    //flash_pgm(0x00001000,data,0x256);
    
    
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线看国产一区二区| 99riav久久精品riav| 亚洲一线二线三线久久久| 日本一二三四高清不卡| www国产亚洲精品久久麻豆| 日韩午夜小视频| 精品国产免费人成在线观看| 日韩一区二区三区电影在线观看 | 国产一区二区精品久久91| 免费观看成人av| 久久99在线观看| 国产美女在线精品| 不卡一区二区中文字幕| 色噜噜久久综合| 欧美人成免费网站| 日韩亚洲电影在线| 国产欧美久久久精品影院| 国产日产欧美一区二区三区| 国产精品毛片久久久久久| 最新国产成人在线观看| 五月天久久比比资源色| 国模大尺度一区二区三区| 波多野结衣视频一区| 欧美日韩精品欧美日韩精品一 | www.欧美色图| 欧美系列日韩一区| 欧美tickling挠脚心丨vk| 国产视频911| 亚洲乱码国产乱码精品精可以看 | 中文字幕欧美三区| 亚洲精品写真福利| 麻豆精品国产91久久久久久| 不卡视频一二三| 欧美丰满少妇xxxxx高潮对白 | 色猫猫国产区一区二在线视频| 精品视频123区在线观看| 欧美刺激脚交jootjob| 中文字幕不卡三区| 青青草国产成人99久久| 成人黄色片在线观看| 欧美一级片免费看| 亚洲激情自拍偷拍| 国产精品 日产精品 欧美精品| 在线免费观看日本欧美| 国产色产综合色产在线视频| 无码av免费一区二区三区试看 | 亚洲自拍偷拍九九九| 国内一区二区在线| 精品视频资源站| 综合色天天鬼久久鬼色| 国产麻豆日韩欧美久久| 91精品国产欧美一区二区成人| 中文字幕中文乱码欧美一区二区 | 亚洲色图欧美偷拍| 国产精品中文欧美| 日韩一区二区三区在线视频| 亚洲靠逼com| 国产不卡高清在线观看视频| 日韩一区二区中文字幕| 亚洲高清不卡在线| 欧美中文字幕不卡| 亚洲精品视频免费观看| 99久久精品国产观看| 国产欧美一区二区精品性色超碰| 日韩精品一卡二卡三卡四卡无卡| 91极品美女在线| 亚洲精品高清视频在线观看| 97精品久久久午夜一区二区三区 | 欧美高清一级片在线| 亚洲精品免费一二三区| 97久久久精品综合88久久| 国产日产欧美精品一区二区三区| 韩国三级电影一区二区| 欧美成人精品1314www| 热久久国产精品| 欧美一二三区在线| 麻豆成人91精品二区三区| 日韩女优制服丝袜电影| 久久精品国产精品亚洲精品| 精品国产区一区| 国产乱码精品一区二区三区av| 精品国产乱码久久久久久蜜臀| 免费国产亚洲视频| www国产亚洲精品久久麻豆| 国产精品影视天天线| 国产女人18水真多18精品一级做| 国产乱色国产精品免费视频| 国产欧美日韩卡一| 一本一道波多野结衣一区二区| 亚洲一区二区视频在线观看| 欧美色网一区二区| 久久精品国产99| 国产日本亚洲高清| 一本一本大道香蕉久在线精品| 亚洲午夜一区二区三区| 51精品久久久久久久蜜臀| 麻豆精品国产传媒mv男同| 欧美国产一区在线| 欧美性一区二区| 蜜桃av噜噜一区二区三区小说| 日韩精品一区二区三区三区免费| 久久精品免费看| 国产精品美女久久福利网站| 欧美亚洲动漫制服丝袜| 国产一区二区三区不卡在线观看| 中文字幕一区二区三区蜜月| 欧美精品在线观看一区二区| 久久99热狠狠色一区二区| 国产精品电影一区二区| 宅男在线国产精品| 成人激情动漫在线观看| 日韩av中文字幕一区二区三区| 久久久久久久久99精品| 91成人看片片| 国产一区 二区| 亚洲成a人片在线不卡一二三区 | 在线中文字幕不卡| 日本不卡一区二区三区高清视频| 日本一区二区视频在线| 制服丝袜亚洲色图| 99视频有精品| 国产精品一区二区在线观看不卡| 亚洲一区二区三区爽爽爽爽爽| 精品少妇一区二区三区视频免付费| av成人老司机| 久久97超碰国产精品超碰| 亚洲愉拍自拍另类高清精品| 国产女人18水真多18精品一级做| 91精品国产一区二区| 日本乱码高清不卡字幕| 国产精品一区2区| 日韩av二区在线播放| 亚洲欧美中日韩| 久久亚洲综合色| 欧美一级欧美三级在线观看 | 日韩国产精品91| 一区二区三区在线视频免费| 国产精品国产自产拍高清av王其 | 91麻豆精品国产91| 日本福利一区二区| 91片在线免费观看| 成人午夜视频福利| 国产精品一区二区91| 久草在线在线精品观看| 日韩二区三区四区| 日韩成人午夜精品| 天天色 色综合| 视频一区二区中文字幕| 亚洲18影院在线观看| 亚洲国产一区二区三区青草影视| 亚洲美女淫视频| 一区二区三区在线观看动漫 | 蜜臀久久99精品久久久久久9| 亚洲国产欧美在线| 亚洲一二三区在线观看| 亚洲在线成人精品| 亚洲第一福利视频在线| 日韩国产一二三区| 美女爽到高潮91| 国产精品亚洲视频| 波多野洁衣一区| 色婷婷综合激情| 欧美日韩国产大片| 日韩免费一区二区| 欧美激情一区二区三区| 中文字幕在线不卡国产视频| 亚洲天堂网中文字| 亚洲高清免费观看| 久久精品国产精品亚洲精品 | 亚洲男人天堂一区| 亚洲一区二区三区在线看| 午夜av区久久| 韩国成人精品a∨在线观看| 国产成人自拍在线| 91丨porny丨国产入口| 欧美在线一二三| 欧美mv和日韩mv国产网站| 日本一区二区电影| 午夜亚洲国产au精品一区二区| 美女尤物国产一区| 成av人片一区二区| 9191久久久久久久久久久| 久久婷婷综合激情| 亚洲色图欧洲色图| 免费成人av在线| av在线这里只有精品| 91精品国产综合久久久久| 国产女人18水真多18精品一级做| 亚洲福利一区二区| 国产不卡高清在线观看视频| 欧美视频一区二区三区在线观看| 日韩精品一区二区在线观看| 亚洲欧洲韩国日本视频| 美国毛片一区二区三区| 色老头久久综合| 国产欧美日韩在线观看| 视频一区视频二区在线观看| 不卡一二三区首页| 欧美精品一区二区三区四区| 亚洲午夜精品17c|