CH32V203 FLASH 寫入和擦除的實(shí)際效果

通常情況下,F(xiàn)lash在整頁擦除后全部變?yōu)?,寫入只能從1變?yōu)?,想要從0變?yōu)?,就必須擦除整頁。

也就是說,一處FLASH原本為 1110,如果寫入1011,再讀取時(shí),應(yīng)該會讀到1010,既多次寫入之間的「按位與」。


CH32V203 的FLASH也滿足這一特點(diǎn)嗎??

const?uint16*?flash_store?=?(const?uint16*)(0x08000000?+?16?*?1024?-?256);//這個(gè)指針指向FLASH中用于寫入測試的地址

int?main(void)?{
????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
????printfInit(115200);
????printf("\n\n\n%s?V%d.%d.%d??-??%s\n",?App_description.app_name,?App_description.high_ver,?App_description.middle_ver,?App_description.low_ver,?__DATA_TIME__);
????printf("SystemClk:%u\n",?Core::Tick_par_second);????
????printf("Reset?value:%x\n",?flash_store[0]);//每次啟動后,讀取這一位
????Random::init();
????Ammc6Slave::init();
????while?(1);
}
void?Ammc6Slave::onRecvAccess(const?byte*?rbuf,?byte?len,?byte*?sbuf){//收到總線數(shù)據(jù)的響應(yīng)函數(shù)
????sbuf[0]?=?0x11;
????sbuf[1]?=?0x22;
????sbuf[2]?=?0xa2;
????sbuf[3]?=?0x99;
????sbuf[4]?=?rbuf[0];
????sbuf[5]?=?rbuf[1];
????sbuf[6]?=?rbuf[2];
????sbuf[7]?=?rbuf[3];
????Ammc6Slave::sendAccess(8);
????Ammc6Slave::loadFinish();
????uint16?data_to_write?=?rbuf[1];//待寫入的數(shù)據(jù)由總線提供
????data_to_write?<<=?8;
????data_to_write?|=?rbuf[0];
????printf("before?%x?write:?%x\n",?data_to_write,?flash_store[0]);//顯示寫入前的數(shù)據(jù)
????Flash::write(flash_store,?data_to_write);
????printf("after?write:?%x\n",flash_store[0]);//顯示寫入后的數(shù)據(jù)
}

實(shí)際上,我寫了這樣的程序進(jìn)行測試。


實(shí)際測試后產(chǎn)生了這樣的調(diào)試日志:
image.png


一次寫入中,復(fù)位時(shí)FLASH中的值為07dc,寫入DF56成功后,再進(jìn)行了復(fù)位,并且隨后進(jìn)行了進(jìn)行了斷電復(fù)位。

可以看到,芯片的FLASH可以由1寫到0,也可以由0寫到1。
我并沒有在手冊中找到關(guān)于FLASH特性的準(zhǔn)確描述,這是我參考的手冊版本:

image.png


請問,CH32V203? Flash的編程特性是什么樣的?編程是否既能讓數(shù)據(jù)從0到1,又能讓數(shù)據(jù)從1到0?


如果用于保存配置信息,是否可以一直使用編程,從不進(jìn)行擦除?這樣做是否安全?


無法刪除樓層嗎?


這一層刪除了



const?uint16*?flash_store?=?(const?uint16*)(0x08000000?+?16?*?1024?-?256);//這個(gè)指針指向FLASH中用于寫入測試的地址

int?main(void)?{
????NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
????printfInit(115200);
????printf("\n\n\n%s?V%d.%d.%d??-??%s\n",?App_description.app_name,?App_description.high_ver,?App_description.middle_ver,?App_description.low_ver,?__DATA_TIME__);
????printf("SystemClk:%u\n",?Core::Tick_par_second);????
????printf("Reset?value:%x\n",?flash_store[0]);//每次啟動后,讀取這一位
????Random::init();
????Ammc6Slave::init();
????while?(1);
}
void?Ammc6Slave::onRecvAccess(const?byte*?rbuf,?byte?len,?byte*?sbuf){//收到總線數(shù)據(jù)的響應(yīng)函數(shù)
????sbuf[0]?=?0x11;
????sbuf[1]?=?0x22;
????sbuf[2]?=?0xa2;
????sbuf[3]?=?0x99;
????sbuf[4]?=?rbuf[0];
????sbuf[5]?=?rbuf[1];
????sbuf[6]?=?rbuf[2];
????sbuf[7]?=?rbuf[3];
????Ammc6Slave::sendAccess(8);
????Ammc6Slave::loadFinish();
????uint16?data_to_write?=?rbuf[1];//待寫入的數(shù)據(jù)由總線提供
????data_to_write?<<=?8;
????data_to_write?|=?rbuf[0];
????printf("before?%x?write:?%x\n",?data_to_write,?flash_store[0]);//顯示寫入前的數(shù)據(jù)
????Flash::write(flash_store,?data_to_write);
????printf("after?write:?%x\n",flash_store[0]);//顯示寫入后的數(shù)據(jù)
}

代碼似乎無法高亮顯示。image.png


您好,關(guān)于CH32V203的FLASH,寫入一次之后不擦除再次進(jìn)行寫入,讀出的是第二次寫入的值,不會進(jìn)行“按位與”。即不擦除寫入也是可以正常讀出寫入的值的。但一般正常進(jìn)行FLASH操作時(shí),建議在編程寫入之前執(zhí)行一下擦除操作。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。



非常感謝。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频