您好,代码中用到DataFlash一般也会有写Flash的函数在代码中,要注意上下电过程芯片不正常的时候代码跑飞的风险,意外进入Flash写函数。
extern UINT8 FLASH_CHECK_BYTE_1;
extern UINT8 FLASH_CHECK_BYTE_2;
UINT8 UserDefFlashErase( UINT16 Addr, UINT16 len )
{
bit e_all;
UINT8 status; /* 返回操作状态 */
UINT8 FlashType; /* Flash 类型标志 */
UINT16 addr = Addr+UserDefineFlashAddr;
UINT16 restlen = len;
/* 判断是否可以正常执行FLASH操作 */
if( ( FLASH_CHECK_BYTE_1 != DEF_FLASH_OP_CHECK1 ) && ( FLASH_CHECK_BYTE_2 != DEF_FLASH_OP_CHECK2 ) )
{ //FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2通常在USB中断中满足一定条件置位,或者在GPIO中断中置位,这个标志的置位来源一定是芯片外部操作实现的,防止自己就擦写了
return 0x02;
}
if((addr>=DATA_FLASH_ADDR) && (addr/* DataFlash区域 */
{
FlashType = bDATA_WE;
}
else /* CodeFlash区域 */
{
FlashType = bCODE_WE;
}
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
//下面就是FLASH的擦(554以下不需要擦)、写、读
//操作结束之后FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2及时复位
GLOBAL_CFG |= FlashType;
do
{
ROM_ADDR = addr; /* 写入目标地址 */
ROM_BUF_MOD = bROM_BUF_BYTE; /* 选择块擦除模式或单字节编程模式 */
ROM_DAT_BUF = 0; /* 擦写数据缓冲区寄存器为0 */
if ( ROM_STATUS & bROM_ADDR_OK ) /* 操作地址有效 */
{
ROM_CTRL = ROM_CMD_ERASE; /* 启动擦除 */
if(ROM_STATUS & bROM_CMD_ERR)
{
status = 0x02; /* 未知命令或超时 */
return status;
}
else
{
status = 0x00; /* 操作成功 */
}
}
else
{
status = 0x01; /* 地址无效 */
return status;
}
addr += 64;
if( restlen >= 64 )
{
restlen -= 64;
}
else if( restlen 64 )
{
restlen = 0;
}
}while( restlen );
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
GLOBAL_CFG &= ~FlashType; /* 开启写保护 */
EA = e_all; /* 恢复全局中断状态 */
CH549WDTModeSelect(1); /* 启动看门狗 */
return status;
}
您好,代码中用到DataFlash一般也会有写Flash的函数在代码中,要注意上下电过程芯片不正常的时候代码跑飞的风险,意外进入Flash写函数。
extern UINT8 FLASH_CHECK_BYTE_1;
extern UINT8 FLASH_CHECK_BYTE_2;
UINT8 UserDefFlashErase( UINT16 Addr, UINT16 len )
{
bit e_all;
UINT8 status; /* 返回操作状态 */
UINT8 FlashType; /* Flash 类型标志 */
UINT16 addr = Addr+UserDefineFlashAddr;
UINT16 restlen = len;
/* 判断是否可以正常执行FLASH操作 */
if( ( FLASH_CHECK_BYTE_1 != DEF_FLASH_OP_CHECK1 ) && ( FLASH_CHECK_BYTE_2 != DEF_FLASH_OP_CHECK2 ) )
{ //FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2通常在USB中断中满足一定条件置位,或者在GPIO中断中置位,这个标志的置位来源一定是芯片外部操作实现的,防止自己就擦写了
return 0x02;
}
if((addr>=DATA_FLASH_ADDR) && (addr/* DataFlash区域 */
{
FlashType = bDATA_WE;
}
else /* CodeFlash区域 */
{
FlashType = bCODE_WE;
}
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
//下面就是FLASH的擦(554以下不需要擦)、写、读
//操作结束之后FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2及时复位
GLOBAL_CFG |= FlashType;
do
{
ROM_ADDR = addr; /* 写入目标地址 */
ROM_BUF_MOD = bROM_BUF_BYTE; /* 选择块擦除模式或单字节编程模式 */
ROM_DAT_BUF = 0; /* 擦写数据缓冲区寄存器为0 */
if ( ROM_STATUS & bROM_ADDR_OK ) /* 操作地址有效 */
{
ROM_CTRL = ROM_CMD_ERASE; /* 启动擦除 */
if(ROM_STATUS & bROM_CMD_ERR)
{
status = 0x02; /* 未知命令或超时 */
return status;
}
else
{
status = 0x00; /* 操作成功 */
}
}
else
{
status = 0x01; /* 地址无效 */
return status;
}
addr += 64;
if( restlen >= 64 )
{
restlen -= 64;
}
else if( restlen 64 )
{
restlen = 0;
}
}while( restlen );
SAFE_MOD = 0x55; /* 进入安全模式 */
SAFE_MOD = 0xAA;
GLOBAL_CFG &= ~FlashType; /* 开启写保护 */
EA = e_all; /* 恢复全局中断状态 */
CH549WDTModeSelect(1); /* 启动看门狗 */
return status;
}
举报