stm32掉電前的數(shù)據(jù)存儲到flash
FLASh 必須是先擦 后 寫
下面的函數(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);//清除標志位
FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
/
FLASHstatus=FLASH_ErasePage(addr);//擦除指定地址頁
FLASHstatus=FLASH_ProgramHalfWord(addr, flashdata1);//從指定頁的addr地址開始寫
//FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);
FLASH_Lock();//鎖定FLASH編程擦除控制
}
基本順序:解鎖->清除標志位(可以不要)->擦除->寫半字->清楚標志位(也可以不要)->上鎖。
如果 FLASH_START_ADDR是宏定義的0x8000000+2048*255
1. 0x8000000是Flash的起始地址
2. 2048是因為我用的是大容量芯片,根據(jù)上一筆記Flash地址可以看出芯片每頁容量2K,即2048字節(jié),
3. 255表示芯片的最后一頁,這個根據(jù)不同芯片而定。之所以從后面頁寫起可以防止儲存數(shù)據(jù)破壞用戶程序。
4. addr*2是因為每個數(shù)據(jù)占用2字節(jié)(半字),雖然寫入的是1字節(jié)數(shù)據(jù),但是編程是2字節(jié)為單位,
也就是說一個字節(jié)的數(shù)據(jù)也會占用兩個字節(jié)地址。
這個子函數(shù)就是將數(shù)據(jù)flashdata1寫到地址addr中去。數(shù)據(jù)的長度是可變的。
當需要讀入數(shù)據(jù)的時候可以直接訪問地址,
如:rdata=*(u16 *)0x08014000; //讀flash中默認數(shù)據(jù)
0x08014000是存儲的地址。