FLASh 有必要是先擦后写
下面的函数是剖析事例
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是因为我用的是大容量芯片,依据上一笔记Flash地址能够看出芯片每页容量2K,即2048字节,
3. 255表明芯片的最终一页,这个依据不同芯片而定。之所以从后边页写起能够避免贮存数据损坏用户程序。
4. addr*2是因为每个数据占用2字节(半字),尽管写入的是1字节数据,可是编程是2字节为单位,
也便是说一个字节的数据也会占用两个字节地址。
这个子函数便是将数据flashdata1写到地址addr中去。数据的长度是可变的。
当需求读入数据的时分能够直接拜访地址,
如:rdata=*(u16 *)0x08014000; //读flash中默许数据
0x08014000是存储的地址。