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

📄 flash_16x4.c

📁 AT91fr40162的FLASH读写程序
💻 C
字号:
//*----------------------------------------------------------------------------//* File Name               : flash_16x4.c//* Object                  : FLASH programmer for ://*                             AT49BV8011/AT49BV8011T//*                             AT49BV1604/AT49BV1604T//*                             AT49BV1614/AT49BV1614T//*//* Exported Resources      : AT91FlashIdentify//*                           AT91EraseSector//*                           at91_write_flash//* Imported Resources      ://*//*//* 1.0 23/04/99 JPP        : Creation//* 1.1 26/04/00 EL         : Clean up//*----------------------------------------------------------------------------#include "dtm.h"#include "dtm_v3.h"#include "flash_16x4.h"#include "externdef.h"#include <stdio.h>static int AT91WaitFlashReady (flash_word *address, flash_word data );void AT91FlashIdentify ( flash_word *base_addr, flash_word *manuf_code,flash_word *device_code,flash_word *device_code_add);int AT91EraseSector (flash_word *base_addr, U32 sector_addr);int AT91WriteFlash ( flash_word *base_addr, flash_word *load_addr,flash_word data);int AT91WriteToFlash(flash_word *base_addr,flash_word *RamBaseAddr,U32 FlashSectorAddr,int Length);int AT91WriteMemoryBlockToFlash(void);//*----------------------------------------------------------------------------//* Function Name       : AT91WaitFlashReady//* Object              : check if data is written//* Input Parameters    : Data and data address//* Output Parameters   : TRUE or FALSE//* Functions called    : none//*----------------------------------------------------------------------------static int AT91WaitFlashReady ( flash_word *address, flash_word data )//* Begin{    int count = 0 ;	flash_word data1,data2;    //* While two consecutive read don't give same value or timeout    data1 = *address;    data2 = *address;    while ((data1 != data2) && ( count++ < TIME_OUT )) {   		data1 = *address;       	data2 = *address;	}    //* If timeout    if ( count < TIME_OUT )    {        //* Return True        return ( TRUE ) ;    }    //* Return False    return ( FALSE );//* End}//*----------------------------------------------------------------------------//* Function Name       : AT91FlashIdentify//* Object              : Read the flash manufactured code and//* Input Parameters    : flash_word *load_addr = Flash bass address//* Output Parameters   : divice code and manufactured code//* Functions called    : none//*----------------------------------------------------------------------------void AT91FlashIdentify ( flash_word *base_addr, flash_word *manuf_code,flash_word *device_code,flash_word *device_code_add)//* Begin{	flash_word *address;	address = base_addr;    //* Enter Software Product Identification Mode	address += FLASH_SEQ_ADD1;    *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1;    *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2;    *(base_addr + FLASH_SEQ_ADD1) = ID_IN_CODE;    //* Read Manufacturer and device code from the device	address = base_addr;    *manuf_code  		= *address ;    address++;    *device_code 		= *address;    address++;    *device_code_add	= *address;   //* Exit Software Product Identification Mode   *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1;   *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2;   *(base_addr + FLASH_SEQ_ADD1) = ID_OUT_CODE;//* End}//*----------------------------------------------------------------------------//* Function Name       : AT91EraseSector//* Object              : erase sector//* Input Parameters    : Data and data address//* Output Parameters   : TRUE or FALSE//* Functions called    : AT91WaitFlashReady//*----------------------------------------------------------------------------int AT91EraseSector (flash_word *base_addr, U32 sector_addr)//* Begin{	flash_word *address;	address = base_addr ;	address += sector_addr/2;	    //* Enter Sector Erase Sequence codes    *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1;    *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2;    *(base_addr + FLASH_SEQ_ADD1) = ERASE_SECTOR_CODE1;    *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1;    *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2;    *address = ERASE_SECTOR_CODE2 ;    //* Wait for Flash Ready after Erase, if timeout    if ( AT91WaitFlashReady ( address, (flash_word)0xFFFF ) == FALSE )    {        //* Display Timeout and return False        return ( FALSE ) ;    }    //* set this sector erased    //* Return True    return ( TRUE ) ;//* End}//*----------------------------------------------------------------------------//* Function Name       : at91_write_flash//* Object              : write a word in flash//* Input Parameters    : flash_word *base_addr : Flash base address//*                       flash_word *load_addr : Flash data address//*                       flash_word data       : Data value//* Output Parameters   : error code : FLASH_WRITE_TIME_OUT, FLASH_WRITE_ERROR//*                       or OK : FLASH_OK//* Functions called    : AT91WaitFlashReady//*----------------------------------------------------------------------------int AT91WriteFlash (flash_word *base_addr, flash_word *load_addr,flash_word data ){    flash_word  read_data ;    //* Enter Programming code sequence    *(base_addr + FLASH_SEQ_ADD1) = FLASH_CODE1 ;    *(base_addr + FLASH_SEQ_ADD2) = FLASH_CODE2 ;    *(base_addr + FLASH_SEQ_ADD1) = WRITE_CODE ;    *load_addr = data ;    //* Wait for Flash ready after erasing, if timeout    if ( AT91WaitFlashReady (load_addr, data)!= TRUE )    {        return ( FLASH_WRITE_TIME_OUT ) ;    }    //* If Data written does not equal data    if (( read_data = *load_addr ) != data )    {        //* Return False        return ( FLASH_WRITE_ERROR );    }    //* Return OK    return ( FLASH_OK ) ;//* End}// 将RAM中从RamBaseAddress开始的Length字节写入Flash的FlashBaseAddress开始的地址中int AT91WriteToFlash(flash_word *base_addr,flash_word *RamBaseAddr,U32 FlashSectorAddr,int Length){	int i;	flash_word data;	flash_word *flashaddress,*ramaddress;	flashaddress = base_addr + FlashSectorAddr/2;	ramaddress = RamBaseAddr;	// Erase sector    if(AT91EraseSector(base_addr, FlashSectorAddr) != TRUE) ;    	//return (FLASH_ERASE_ERROR);	// Write    for (i = 0; i < Length/2; i++) {      	data = *ramaddress;        if (AT91WriteFlash(base_addr, flashaddress, data) != FLASH_OK)     		return (FLASH_WRITE_ERROR);        flashaddress++;        ramaddress++;    }	// Verify	flashaddress = base_addr + FlashSectorAddr/2;	ramaddress = RamBaseAddr;    for (i = 0; i < Length/2; i++) {      	if (*flashaddress != *ramaddress)     		return (FLASH_VERIFY_ERROR);        flashaddress++;        ramaddress++;    }	return (FLASH_OK);}// 写内存块的内容到AT91-Flash中int AT91WriteMemoryBlockToFlash(void){	int Length;	int iRetCode;	//flash_word * cpBuffer = (flash_word*)0x10000;	flash_word manuf_code=0,device_code=0,device_code_add=0;    AT91FlashIdentify ((flash_word*)FLASH_BASE, &manuf_code,&device_code,&device_code_add);	Length = 8*1024;		iRetCode =AT91WriteToFlash((flash_word*)FLASH_BASE,(flash_word*)0x10000,0x000000,Length);	return(iRetCode);}//* End file

⌨️ 快捷键说明

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