Flash特点:还具有快速读取和较慢的写入速度,以及有限的擦写次数。与传统的随机存取存储器(RAM)不同,闪存具有非易失性,这意味着即使在断电时也能保留存储的数据。
所以,被广泛用在嵌入式系统。
有的MCU(微控制器)将FLASH又分为Pflash(program flash)和Dflash(data flash),Pflash用于存储程序代码和只读数据。而Dflash则用于存储应用程序中的可变数据Dflash允许在运行时对数据进行擦除和编程,以满足应用的需求。
Flash 包含 256KB(64K x 32 位)主阵列,外加六个 1KB(256 x 32 位)NVR 扇区。
在许多嵌入式系统中,擦除闪存会将特定地址的数据全部擦除为1。这通常意味着在擦除操作后,闪存中的数据将变为0xFFFFFFFF(全1)。这是由于闪存器件的工作原理决定的。
一般操作为:1、解锁,通过相应的key1和key2
2、擦除,当不处于busy时,开始擦除,SR的第0位寄存器处于0x1时表示还在执行操作中,当执行完毕,硬件自动将SR的第0位置0,表示操作完成
3、擦除完可以读取rdata数据,看是否已经擦除完成,如果初始数据rdata=0x12345678变成了0xffffffff,即,擦除操作成功
4、写,将指定addr和rdata写入,但是在写的时候需要加入延时等待,确保有足够时间
5、读
6、解锁
在调试中所遇问题:
在编写flash中,rdata=0x12345678,调用擦除函数后rdata=0xffffffff,再调用编程函数,传惨rdata,为什么读取rdata不是0x12345678。
尝试过在写函数传入&rdata,但是在第5步读时数值仍为0xffffffff
解决:p-Flash有从起始地址开始0x0100_0000有用于存储程序代码和常量数据,该内存是受保护,不可访问,将测试地址选在加载区域之外的地址
在.map文件可以看到加载区域大小
所以,测试地址应选在0x00000914之后。
修改之后,可以正常的擦除和写入。
以下测试文件,直接调用hal库
int pfmc_test_app(void)
{
uint32_t rdata[8] = {0};
#if 0
uint32_t tdata[8] = {0x11223344,0x22334455,0x33445566};
uint32_t test_addr = 0x01000C00;
/* PFLASH unlock sequence */
PFLASH_Unlock();
/* PFLASH erase */
PFLASH_Sector_Erase(test_addr);
/* PFLASH prog */
PFLASH_Program_Wd(test_addr,tdata,1);
/* Read programmed data */
PFLASH_Read_Wd(test_addr,rdata,1);
/* PFLASH lock sequence */
PFLASH_Lock();
#endif
#if 1
uint32_t tdata[8] = {0x11223344,0x22334455,0x33445566};
uint32_t test_ob_addr = 0x010F0000;
/* PFLASH unlock sequence */
PFLASH_OB_Unlock();
/* PFLASH prog */
PFLASH_OB_Program(PFMC_TYPEPROGRAM_QWORD, test_ob_addr, tdata);
/* Read programmed data */
PFLASH_OB_Read(test_ob_addr,rdata);
/* PFLASH lock sequence */
PFLASH_OB_Lock();
#endif
return 0;
}