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

📄 flash.c

📁 arm(str710)usb功能的实现
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                                      
**                                          	STR710 development team
**                                         	
**
**                                 http://www.appchip.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: 		flash.c
** 创 建 人: 		李海军
** 创建日期: 	2006年5月14日
** 描    述: 		该文件提供内部FLASH  的所有操作
**
**--------------历史版本--------------------------------------------------------------------------------
** 创 建 人: 		李海军
** 版      本: 		V1.0
** 日   期: 		2006年5月14日
** 描   述: 		原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/

#include "flash.h"

#if 	EN_ARM_FLASH > 0

/******************************************* 全局变量定义 ***********************************************/

/******************************************* 局部函数声明 ***********************************************/


/*********************************************************************************************************
;** 函数名称: 	flash_reset
;** 功能描述: 	flash 寄存器初始化
;** 
;** 参    数: 	无
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_reset(void)
{
	FLASH_CR0 	= 0x00000000;
	FLASH_CR1 	= 0x00000000;
	FLASH_DR0 	= 0xffffffff;
	FLASH_DR1 	= 0xffffffff;
	FLASH_ER	= 0x00000000;  

	return FLASH_ER;
}

/*********************************************************************************************************
;** 函数名称: 	flash_write_word
;** 功能描述: 	写一个32bit  数据到指定的FLASH  地址
;** 
;** 参    数: 		
;**	address :	目标FLASH  地址	
;**	data    :	要写入的数据
;**
;** 返 回 值: 	错误信息
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_write_word(UWORD32 address, UWORD32 data)
{
	flash_wait_finish();

	FLASH_CR0	|= FLASH_WPG;
	FLASH_AR	= address;
	FLASH_DR0	= data;
	FLASH_CR0	|= FLASH_WMS;
	
	flash_wait_finish();
	
	return FLASH_ER;
}

/*********************************************************************************************************
;** 函数名称: 	flash_write_double_word
;** 功能描述: 	连续写两个32bit   字到FLASH  指定地址
;** 
;** 参    数: 	
;**	address :	目标地址
;**	data0 	:	数据0
;**	data1 	:	数据1
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_write_double_word(UWORD32 address, UWORD32 data0, UWORD32 data1)
{
	flash_wait_finish();

	FLASH_CR0	|= FLASH_DWPG;
	FLASH_AR	= address;
	FLASH_DR0	= data0;
	FLASH_DR1	= data1;
	FLASH_CR0	|= FLASH_WMS;
	
	flash_wait_finish();

	return FLASH_ER;
}

/*********************************************************************************************************
;** 函数名称: 	flash_write_block
;** 功能描述: 	FLASH  批量写操作
;** 
;** 参    数: 	
;**	address :	FLASH  开始地址
;**	*p_data :	要写的数据开始地址
;**	lenght :	数据长度
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_write_block(UWORD32 address, UWORD32 * p_data, UWORD32 lenght)
{	
	SYS_BOOL		bit_set = FALSE;

	//如果不是双字地址对齐先写一个字数据;
	if(address & BIT2)
	{
		if(flash_write_word(address, * p_data))
			return FLASH_ER;

		address	+= 4;
		p_data ++;
		lenght --;
	}

	if(TRUE == lenght & BIT0)
		bit_set = TRUE;
	
	lenght >>= 1;
	while(lenght--)
	{
		if(flash_write_double_word(address, * p_data, * (p_data + 1)))
			return FLASH_ER;

		address += 8;
		p_data += 2;
	}

	if(bit_set)
		if(flash_write_word(address, * p_data))
			return FLASH_ER;
	return 0;		
}

/*********************************************************************************************************
;** 函数名称: 	flash_erase
;** 功能描述: 	擦除选中的扇区或块
;** 
;** 参    数: 	
;**	sector_mask:FLASH_BxFx		对应的扇区;
;**				FLASH_BANKx		对应的块;					
;**				可以几个扇区或两个块一起擦除
;**
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_erase(UWORD32 sector_mask)
{
	if(FLASH_BANK0 & sector_mask)
	{
		flash_wait_finish();
		FLASH_CR0 = FLASH_SER;
		FLASH_CR1 |= (FLASH_BANK0 & sector_mask);
		FLASH_CR0 |= FLASH_WMS;

		flash_wait_finish();
		
		if(FLASH_CR0 | FLASH_B0S)
			return FLASH_ER;
	}
	if(FLASH_BANK1 & sector_mask)
	{
		flash_wait_finish();
		FLASH_CR0 = FLASH_SER;
		FLASH_CR1 |= (FLASH_BANK1 & sector_mask);
		FLASH_CR0 |= FLASH_WMS;
		
		flash_wait_finish();

		if(FLASH_CR0 | FLASH_B1S)
			return FLASH_ER;
	}
	
	return 0;
}

/*********************************************************************************************************
;** 函数名称: 	flash_suspend
;** 功能描述: 	挂起当前FLASH  正在进行的操作
;** 
;** 参    数: 	无
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void flash_suspend(void)
{
	FLASH_CR0 |= FLASH_SUSP;
}

/*********************************************************************************************************
;** 函数名称: 	flash_resume
;** 功能描述: 	恢复当前挂起FLASH  的操作  
;** 
;** 参    数: 	无
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void flash_resume(void)
{
	FLASH_CR0 &= !FLASH_SUSP;
	FLASH_CR0 |= FLASH_WMS;
}

/*********************************************************************************************************
;** 函数名称: 	flash_read_word
;** 功能描述: 	从FLASH  指定地址读取一个字
;** 
;** 参    数: 		
;**	address :	目标地址
;**  
;** 返 回 值: 	返回读取的数据
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_read_word(UWORD32 address)
{
	flash_wait_finish();
	return (*((volatile UWORD32 *)address));
}

/*********************************************************************************************************
;** 函数名称: 	flash_read_block
;** 功能描述: 	连续读FLASH  数据
;** 
;** 参    数: 		
;**	address :	FLASH  开始地址
;**	*p_data :	读取数据的存储地址
;**	lenght :	数据长度
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void flash_read_block(UWORD32 address, UWORD32 * p_buf, UWORD32 lenght)
{
	while(lenght --)
	{
		* p_buf++ = flash_read_word(address);
		address += 4;
	}	
}

/*********************************************************************************************************
;** 函数名称: 	flash_sector_protect
;** 功能描述: 	对指定的FLASH  扇区写保护
;** 
;** 参    数: 		
;**	sector :	要保护的扇区
;**	b_write_unwrite:TRUE -> 写保护;FALSE -> 取消写保护
;**  
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
UWORD32 flash_sector_protect(UWORD32 sector, SYS_BOOL b_write_unwrite)
{
	UWORD32	reg_value = 0;
	
	flash_wait_finish();
	
	reg_value = flash_read_word(FLASH_NVWPAR_ADDRESS);
	
	if(b_write_unwrite)
		reg_value 	&= !(sector & FLASH_WP_ALL);
	else
		reg_value 	|= (sector & FLASH_WP_ALL);
	
	FLASH_CR0   	|= FLASH_SPR;
	FLASH_AR 	= FLASH_NVWPAR_ADDRESS;
	FLASH_DR0	= reg_value;	
	FLASH_CR0	|= FLASH_WMS;

	flash_wait_finish();
	reg_value = flash_read_word(FLASH_NVWPAR_ADDRESS);

//	UART0_SendString((UWORD8 *)"FLASH_NVWPAR_ADDRESS", reg_value);
	
	return FLASH_ER;
}

#if 0

/*********************************************************************************************************
;** 函数名称: 	flash_debug_temporary
;** 功能描述: 	临时设置调试模式和非调试模式
;** 
;** 参    数: 		
;**	b_enable_disable :		
;**					TRUE :	设置调试模式
;**					FALSE :	设置非调试模式  						
;**
;** 返 回 值: 	无
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void flash_debug_temporary(SYS_BOOL b_enable_disable)
{
	UWORD32 reg_value = 0;	

	flash_wait_finish();

	reg_value = flash_read_word(FLASH_NVAPR0_ADDRESS);

	if(b_enable_disable)
		reg_value &= !FLASH_DBGP;
	else
		reg_value |= FLASH_DBGP;

	FLASH_CR0	|= FLASH_SPR;
	FLASH_AR	= FLASH_NVAPR0_ADDRESS;
	FLASH_DR0 	= reg_value;
	FLASH_CR0	|= FLASH_WMS;
	flash_wait_finish();

}

/*********************************************************************************************************
;** 函数名称: 	flash_debug_premanent
;** 功能描述: 	永久性设置调试模式和非调试模式
;** 
;** 参    数: 		
;**		b_enable_disable :		
;**						TRUE :	设置调试模式
;**						FALSE :	设置非调试模式 
;**
;** 返 回 值: 	剩余设置次数( 总共允许设置16  次)
;**         
;** 作   者: 	李海军
;** 日   期: 	2006年5月14日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人: 
;** 日   期: 
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
WORD8 flash_debug_premanent(SYS_BOOL b_enable_disable)
{
	UWORD32 	reg_value 	= 0xffffffff;
	UWORD8  	times 		= 0;
	SYS_BOOL	  	b_set 		= FALSE;
	
	reg_value = flash_read_word(FLASH_NVAPR1_ADDRESS);
	if(reg_value == 0)
		return 0;
	if(b_enable_disable)
	{
		if((reg_value >> 16) != (reg_value & 0xffff))	
		{
			reg_value = ((reg_value&0xffff) << 16) | (reg_value&0xffff);
			b_set   	= TRUE;
		}
	}
	else
	{
		if((reg_value >> 16) == (reg_value & 0xffff))	
		{
			reg_value = (reg_value & 0xffff0000) | (((reg_value&0xffff0000) << 1) >> 16);
			b_set   	= TRUE;
		}
	}
	
	if(b_set)
	{
		FLASH_CR0 	|= FLASH_SPR;
		FLASH_AR 	= FLASH_NVWPAR_ADDRESS;
		FLASH_DR0	= reg_value;
		FLASH_CR0	|= FLASH_WMS;
	}
	
	times = 16;
	while(!(BIT0 & reg_value))
	{
		times--;
		reg_value >>=1;
	}
	
	flash_wait_finish();

	return (times);

}
#endif

#endif

⌨️ 快捷键说明

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