flash(闪存)基础操作

本文讲述了Flash存储器的特点,如快速读取和有限擦写次数,以及在嵌入式系统中使用时的Pflash和Dflash区分。遇到的编程问题涉及到内存保护区域,通过调整测试地址和使用正确的库函数解决了擦除和写入操作中的数据丢失问题。
摘要由CSDN通过智能技术生成

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;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值