📄 flash.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 + -