当前位置:首页 > 单片机 > 单片机
[导读]FLASh 必须是先擦 后 写下面的函数是分析案例void FLASH_WriteByte(u32 addr ,u16 flashdata1){FLASH_Status FLASHstatus = FLASH_COMPLETE;FLASH_Unlock();//解锁FLASH编程擦除控制器// FLASH_ClearFlag(FLASH_FLAG

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是存储的地址。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读
关闭