WCH沁恒单片机
直播中

李继明

7年用户 1089经验值
私信 关注
[问答]

使用CH552T的Data存储数据发现掉电,上电存储的数据变有什么好办法?

请问使用CH552T的Data存储数据,发现掉电,上电存储的数据变,请问有什么好办法?晶振频率24M
  

回帖(1)

吴樵

2022-6-1 10:02:51
  您好,代码中用到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;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分