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

📄 flash.c

📁 CF8051F040开发板的 flash_download程序
💻 C
字号:
/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: flash.C
* 文件标识: none
* 适用器件: w29c020
* 
* 摘 要: 本文件是字库(GB2312)读写子程序;使用外部22.1184MHz晶振.
* 
* 当前版本:1.2
* 作 者:张宁强
* 完成日期:2006年1月10日
*
* 历史版本:1.0 
* 原作者 : 李林利 卢阳
* 完成日期:2005年6月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件

#include "c8051f040.h"
#include "flash.h"
#include "delay.h"

/************************************************************************************/

/************************************************************************************
* 函数名称:flash_write_protect;
*
* 函数功能描述:Flash写保护函数;1:打开保护进行读写,0:进入保护状态模式;
*              
* 输入参数:Flash写保护开关;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_protect(bool flag)
{	
	unsigned char xdata *ad;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F

	if(flag==0)
	{
		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0xaa;

		P4&=0xf2;
		P4|=0x02;
		ad=0xeaaa;
		*ad=0x55;

		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0x80;

		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0xaa;

		P4&=0xf2;
		P4|=0x02;
		ad=0xeaaa;
		*ad=0x55;

		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0x20;

		Delay_ms(10);
	}
	else
	{
		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0xaa;

		P4&=0xf2;
		P4|=0x02;
		ad=0xeaaa;
		*ad=0x55;

		P4&=0xf5;
		P4|=0x05;
		ad=0xd555;
		*ad=0xa0;
	}
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:flash_chip_erase;
*
* 函数功能描述:Flash芯片擦除程序;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_chip_erase(void)
{
	unsigned char xdata *ad;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F

	P4&=0xf5;
	P4|=0x05;
	ad=0xd555;
	*ad=0xaa;

	P4&=0xf2;
	P4|=0x02;
	ad=0xeaaa;
	*ad=0x55;

	P4&=0xf5;
	P4|=0x05;
	ad=0xd555;
	*ad=0x80;

	P4&=0xf5;
	P4|=0x05;
	ad=0xd555;
	*ad=0xaa;

	P4&=0xf2;
	P4|=0x02;
	ad=0xeaaa;
	*ad=0x55;

	P4&=0xf5;
	P4|=0x05;
	ad=0xd555;
	*ad=0x10;

	Delay_ms(50);
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}


/***********************************************************************************
* 函数名称:flash_write_byte;
*
* 函数功能描述:Flash写入字节函数程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_byte(unsigned long address, unsigned char dat)
{
	unsigned char xdata *x;
	unsigned int temp;
	unsigned char sec;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F
	temp=address|0xc000;
	sec=address>>14;
	P4=sec;
	x=temp;
	*x=dat;
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:flash_write_byte_save;
*
* 函数功能描述:Flash写入字节函数程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_byte_save(unsigned long address, unsigned char dat)
{
	unsigned char xdata a[128];
	unsigned int temp;
	unsigned int t;
	unsigned char sec;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F
	temp=address|0xc000;
	sec=address>>14;

	if(sec>15)
		return ;
	P4=sec;
	t=(temp-0xc000)%128;
	temp=temp-t;

	flash_read_page(address,a);
	a[t]=dat;
	flash_write_page(address,a);
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:flash_write_string;
*
* 函数功能描述:Flash写入字符串函数程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据起始指针,unsigned char类型数据长度;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_string(unsigned long address, unsigned char *dat_sta, unsigned char count)
{
	if(count>127)
		return;
	while(count--)
	{
		flash_write_byte(address++,*dat_sta++);
	}
}

/***********************************************************************************
* 函数名称:flash_write_page;
*
* 函数功能描述:Flash按页写入函数;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据起始指针;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_page(unsigned long address, unsigned char *dat)
{
	unsigned char i;
	i=0;
	while(i<128)
	{
		flash_write_byte(address++,*dat++);
		i++;
	}
}

/***********************************************************************************
* 函数名称:flash_write_block;
*
* 函数功能描述:Flash按块写入函数;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据起始指针;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_write_block(unsigned long address, unsigned char *dat)
{
	unsigned char count;
	unsigned int ct;
	count=128;
	ct=address%0x3fff;
	address=address-ct;
	while(count--)
	{
		flash_write_page(address, dat);
		Delay_ms(10);

		address+=128;
		dat+=128;
	}
}

/***********************************************************************************
* 函数名称:flash_read_byte;
*
* 函数功能描述:Flash读取字节函数程序;
*              
* 输入参数:unsigned long类型地址;
*
* 返回数据:unsigned char;
*
* 注意:    none;
************************************************************************************/

unsigned char flash_read_byte(unsigned long address)
{
	unsigned char xdata *x;
	unsigned int temp;
	unsigned char sec;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F
	temp=address|0xc000;
	sec=address>>14;
	if(sec>15)
		return 0xff;
	P4=sec;
	x=temp;
	return *x;
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************
* 函数名称:flash_read_page;
*
* 函数功能描述:Flash读取页函数程序;
*              
* 输入参数:unsigned long类型地址,unsigned char类型数据存储起始地址指针;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void flash_read_page(unsigned long address, unsigned char *buf)
{
	unsigned char xdata *x;
	unsigned char count=128;
	unsigned int temp;
	unsigned int t;
	unsigned char sec;
	char data SFRPAGE_SAVE = SFRPAGE;    // Save Current SFR page   
    SFRPAGE = SFR_PAGE_F;    			// set SFR page F
	
	temp=address|0xc000;
	sec=address>>14;
	if(sec>15)
		return ;
	t=(temp-0xc000)%128;
	temp=temp-t;
	P4=sec;
	x=temp;
	while(count--)
	{
		*buf++=*x++;
	}
	SFRPAGE = SFRPAGE_SAVE;          // Restore SFR page
}

/***********************************************************************************/
// 文件结束
/***********************************************************************************/


⌨️ 快捷键说明

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