stm32掉電前的數(shù)據(jù)存儲(chǔ)到flash
掃描二維碼
隨時(shí)隨地手機(jī)看文章
FLASh 必須是先擦 后 寫(xiě)
下面的函數(shù)是分析案例
void FLASH_WriteByte(u32 addr ,u16 flashdata1)
{
FLASH_Status FLASHstatus = FLASH_COMPLETE;
FLASH_Unlock();//解鎖FLASH編程擦除控制器
// FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除標(biāo)志位
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
/
FLASHstatus=FLASH_ErasePage(addr);//擦除指定地址頁(yè)
FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//從指定頁(yè)的addr地址開(kāi)始寫(xiě)
//FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_Lock();//鎖定FLASH編程擦除控制
}
基本順序:解鎖->清除標(biāo)志位(可以不要)->擦除->寫(xiě)半字->清楚標(biāo)志位(也可以不要)->上鎖。
如果 FLASH_START_ADDR是宏定義的0x8000000+2048*255
1. 0x8000000是Flash的起始地址
2. 2048是因?yàn)槲矣玫氖谴笕萘啃酒?,根?jù)上一筆記Flash地址可以看出芯片每頁(yè)容量2K,即2048字節(jié),
3. 255表示芯片的最后一頁(yè),這個(gè)根據(jù)不同芯片而定。之所以從后面頁(yè)寫(xiě)起可以防止儲(chǔ)存數(shù)據(jù)破壞用戶程序。
4. addr*2是因?yàn)槊總€(gè)數(shù)據(jù)占用2字節(jié)(半字),雖然寫(xiě)入的是1字節(jié)數(shù)據(jù),但是編程是2字節(jié)為單位,
也就是說(shuō)一個(gè)字節(jié)的數(shù)據(jù)也會(huì)占用兩個(gè)字節(jié)地址。
這個(gè)子函數(shù)就是將數(shù)據(jù)flashdata1寫(xiě)到地址addr中去。數(shù)據(jù)的長(zhǎng)度是可變的。
當(dāng)需要讀入數(shù)據(jù)的時(shí)候可以直接訪問(wèn)地址,
如:rdata=*(u16 *)0x08014000; //讀flash中默認(rèn)數(shù)據(jù)
0x08014000是存儲(chǔ)的地址。