請(qǐng)問(wèn)使用CH552T的Data存儲(chǔ)數(shù)據(jù),發(fā)現(xiàn)掉電,上電存儲(chǔ)的數(shù)據(jù)變,請(qǐng)問(wèn)有什么好辦法?晶振頻率24M
您好,代碼中用到DataFlash一般也會(huì)有寫(xiě)Flash的函數(shù)在代碼中,要注意上下電過(guò)程芯片不正常的時(shí)候代碼跑飛的風(fēng)險(xiǎn),意外進(jìn)入Flash寫(xiě)函數(shù)。
extern?UINT8?FLASH_CHECK_BYTE_1;
extern?UINT8?FLASH_CHECK_BYTE_2;
UINT8?UserDefFlashErase(?UINT16?Addr,?UINT16?len?)
{
????bit?e_all;
????UINT8?status;????????????????????????????????????/*?返回操作狀態(tài)?*/
????UINT8?FlashType;?????????????????????????????????/*?Flash?類(lèi)型標(biāo)志?*/
????UINT16?addr?=?Addr+UserDefineFlashAddr;
????UINT16?restlen?=?len;
????/*?判斷是否可以正常執(zhí)行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中斷中置位,這個(gè)標(biāo)志的置位來(lái)源一定是芯片外部操作實(shí)現(xiàn)的,防止自己就擦寫(xiě)了
????????return?0x02;
????}
????if((addr>=DATA_FLASH_ADDR)?&&?(addr/*?DataFlash區(qū)域?*/
????{
????????FlashType?=?bDATA_WE;
????}
????else?????????????????????????????????????????????/*?CodeFlash區(qū)域?*/
????{
????????FlashType?=?bCODE_WE;
????}
????SAFE_MOD?=?0x55;?????????????????????????????????/*?進(jìn)入安全模式?*/
????SAFE_MOD?=?0xAA;
????//下面就是FLASH的擦(554以下不需要擦)、寫(xiě)、讀
????//操作結(jié)束之后FLASH_CHECK_BYTE_1和FLASH_CHECK_BYTE_2及時(shí)復(fù)位
????GLOBAL_CFG?|=?FlashType;
????????do
????????{
????????????ROM_ADDR?=?addr;?????????????????????????????????/*?寫(xiě)入目標(biāo)地址?*/
????????????????ROM_BUF_MOD?=?bROM_BUF_BYTE;?????????????????????/*?選擇塊擦除模式或單字節(jié)編程模式?*/
????????????????ROM_DAT_BUF?=?0;?????????????????????????????????/*?擦寫(xiě)數(shù)據(jù)緩沖區(qū)寄存器為0?*/
????????????????if?(?ROM_STATUS?&?bROM_ADDR_OK?)?????????????????/*?操作地址有效?*/
????????????????{
????????????????????????ROM_CTRL?=?ROM_CMD_ERASE;????????????????????/*?啟動(dòng)擦除?*/
????????????????????????if(ROM_STATUS?&?bROM_CMD_ERR)
????????????????????????{
????????????????????????????????status?=?0x02;????/*?未知命令或超時(shí)?*/
????????????????????????????????return?status;
????????????????????????}
????????????????????????else
????????????????????????{
????????????????????????????????status?=?0x00;????/*?操作成功?*/
????????????????????????}
????????????????}
????????????????else
????????????????{
????????????????????????status?=?0x01;????/*?地址無(wú)效?*/
????????????????????????return?status;
????????????????}
????????????????addr?+=?64;
????????????????if(?restlen?>=?64?)
????????????????{
????????????????????restlen?-=?64;
????????????????}
????????????????else?if(?restlen?<?64?)
????????????????{
????????????????????restlen?=?0;
????????????????}
????????}while(?restlen?);
????SAFE_MOD?=?0x55;?????????????????????????????????/*?進(jìn)入安全模式?*/
????SAFE_MOD?=?0xAA;
????GLOBAL_CFG?&=?~FlashType;????????????????????????/*?開(kāi)啟寫(xiě)保護(hù)?*/
????EA?=?e_all;??????????????????????????????????????/*?恢復(fù)全局中斷狀態(tài)?*/
????????CH549WDTModeSelect(1);???????????????????????????/*?啟動(dòng)看門(mén)狗?*/
????return?status;
}