注:本人感覺是STM32 Flash本身的問題.
最近做STM32的遠程升級,保存到Flash里面,用於記錄更新狀態的信息總是無故的清理掉
最終測試發現 STM32的 Flash 擦除操作 並不一定會真正的清除,
測試代碼 ,底層為原子哥的底層,注:底層程序沒有問題.
FLASH_DATA_ADDR 地址為 0x800f802
u16 ReadDat[10]={10000,0x3031,0x3032,0x3033,0x3034,0x3035,0x3036,0x3037,0x3038,0x3038};
u16 ReadDatata=0;
printf("0000000000000000000000000\r\n"); delay_ms(1000); // IAPSetUpdateVersionServer("22222222222222");//存儲雲端版本 STMFLASH_Write(FLASH_DATA_ADDR+6,&ReadDat[0],1);//寫一個數據 delay_ms(1000); printf("1111111111111111111111111111111111\r\n"); delay_ms(1000); STMFLASH_Write(FLASH_DATA_ADDR,&ReadDatata,1); //寫一個數據 delay_ms(1000); printf("ReadDatata=%d\r\n",ReadDatata);//打印讀出的數據 if(ReadDatata == 65535) ReadDatata=0; delay_ms(1000); printf("222222222222222222222222\r\n"); delay_ms(1000); STMFLASH_Write(FLASH_DATA_ADDR+2,&ReadDatata,1);//寫入一個數據 delay_ms(1000); printf("333333333333333333333\r\n"); delay_ms(1000); ReadDatata = 1; STMFLASH_Write(FLASH_DATA_ADDR,&ReadDatata,1);//寫一個數據 while(1);
測試發現,執行擦除操作以后,有個位置的數據竟然是0xBF
擦除前后都是 4 ,說明操作是完全沒有問題的!!!!!!
但是執行擦除以后卻........
所以寫入數據的時候就會報錯
說明STM32的Flash確實有bug
出現這種bug...有點蒙,
為了應對這個問題,我做了少許修改
一,擦除以后,再次判斷是否真的擦除
二,存儲數據的地址從每一頁的第十個字節開始
當前方式正在測試,每隔10S更新切換一次程序,每次皆會大量的操作Flash,我讓它執行一天時間,看下數據出錯的概率.
注:其實最優的方法是 分為A,B兩個區域,兩個區域來回存儲數據,然后為了可靠,最好還有一個區域放置初始化的數據!如果A,B皆有問題
則重新調取數據.