通常情況下,F(xiàn)lash在整頁擦除后全部變?yōu)?,寫入只能從1變?yōu)?,想要從0變?yōu)?,就必須擦除整頁。
也就是說,一處FLASH原本為 1110,如果寫入1011,再讀取時(shí),應(yīng)該會讀到1010,既多次寫入之間的「按位與」。
CH32V203 的FLASH也滿足這一特點(diǎn)嗎??
通常情況下,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)試日志:
一次寫入中,復(fù)位時(shí)FLASH中的值為07dc,寫入DF56成功后,再進(jìn)行了復(fù)位,并且隨后進(jìn)行了進(jìn)行了斷電復(fù)位。
可以看到,芯片的FLASH可以由1寫到0,也可以由0寫到1。
我并沒有在手冊中找到關(guān)于FLASH特性的準(zhǔn)確描述,這是我參考的手冊版本:
請問,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ù) }
代碼似乎無法高亮顯示。
您好,關(guān)于CH32V203的FLASH,寫入一次之后不擦除再次進(jìn)行寫入,讀出的是第二次寫入的值,不會進(jìn)行“按位與”。即不擦除寫入也是可以正常讀出寫入的值的。但一般正常進(jìn)行FLASH操作時(shí),建議在編程寫入之前執(zhí)行一下擦除操作。后續(xù)若有問題,可通過郵箱(lzs@wch.cn)和我溝通。
非常感謝。