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;

}