搜索
bottom↓
回复: 85

再说STM32中使用Flash模拟EEPROM

  [复制链接]

出0入0汤圆

发表于 2011-12-19 12:24:17 | 显示全部楼层 |阅读模式
关于这个话题已经有很多贴了,况且官方也出了操作例程,但是感觉还是比较繁琐!

    最近要用到这个功能,例程看了半天还是不怎么明白,最后只好仔细阅读了下<STM32F10xxx闪存编程>,感觉其实挺简单的,就是按照资料上说的操作相关的寄存器就可以了。
   
    附上源程序:

#define                PAGE_ADDR                                (0x08000000 + 63 * 1024)


/***************************************************************************************************
* 函数名称: MemReadByte()
* 函数功能: 从存储器中读出num字节数据
* 入口参数: *dat:读出数据的保存地址
*                        num        :读出的字节数
* 出口参数: 0:操作失败;1:操作成功
* 使用说明: 无
* 创建日期: 2010年12月15日
***************************************************************************************************/
uint8 MemReadByte(uint16 *data,uint16 num)                               
{
        uint16 *temp_addr = (uint16 *)PAGE_ADDR;
       
        while(num --)
        {
                *data ++ = *temp_addr ++;
        }
                                                                                                       
        return 1;                                                                                                       
}

/***************************************************************************************************
* 函数名称: MemWriteByte()
* 函数功能: 向存储器中写入num字节数据
* 入口参数: *dat:待写入数据
*                        num        :写入的字节数
* 出口参数: 0:操作失败;1:操作成功
* 使用说明: 无
* 创建日期: 2010年12月15日
***************************************************************************************************/
uint8 MemWriteByte(uint16 *data,uint16 num)                               
{
        FLASH_Status temp_stat;
        uint32 temp_addr = PAGE_ADDR;
               
        FLASH_Unlock();                                                                                                        // Flash解锁,允许操作相关的寄存器
        temp_stat = FLASH_ErasePage(PAGE_ADDR);                                                        // 擦出制定的页
       
        if(temp_stat != FLASH_COMPLETE)
        {
                FLASH_Lock();
                return 0;
        }
       
        while(num --)
        {
                temp_stat = FLASH_ProgramHalfWord(temp_addr,*data);
                if(temp_stat != FLASH_COMPLETE)
                {
                        FLASH_Lock();
                        return 0;
                }
       
                temp_addr += 2;
                data++;
        }
       
        FLASH_Lock();       
        return 1;
}


#include "app_cfg.h"                                       

uint16        write_buf[10] = {0,1,2,3,4,5,6,7,8,9};

int main(void)
{
        uint16 cnt;
               
           STM32Init();  
       
        MemWriteByte(write_buf,10);  
        for(cnt = 0;cnt < 10;cnt ++)
        {
                write_buf[cnt] = 11;
        }
        MemReadByte(write_buf,10);
         
    while(1)                                                                         
    {
        ;       
    }  
}

     上面的程序是在63K开始的Flash中写入10个16位的数据,然后在把他读出来,当然在每次写时需要擦除一整页,只要数据不是非常频繁修改,不会影响Flash的使用寿命!

     简单吧,呵呵!

出0入0汤圆

 楼主| 发表于 2011-12-19 12:26:11 | 显示全部楼层
上面调用的函数是标准的库函数!

出0入0汤圆

发表于 2011-12-19 12:28:19 | 显示全部楼层
顶一下~~

出0入98汤圆

发表于 2011-12-19 14:45:50 | 显示全部楼层
正想要,谢谢

出0入0汤圆

发表于 2011-12-19 19:44:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-19 22:51:46 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2011-12-19 22:56:42 | 显示全部楼层
其实这个最BUG的地方,就是不能单字节写。

出0入0汤圆

发表于 2011-12-20 00:29:44 | 显示全部楼层
回复【6楼】kinsno  
-----------------------------------------------------------------------

flash都这样...不像sram那么方便

出0入0汤圆

发表于 2011-12-21 23:49:22 | 显示全部楼层
还要电池才行;

出0入0汤圆

发表于 2011-12-22 11:31:44 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-12-28 04:36:14 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-12-28 09:18:36 | 显示全部楼层
学习下  不错

出0入0汤圆

发表于 2012-1-9 14:43:58 | 显示全部楼层
标记一下~回头试试~

出0入0汤圆

发表于 2012-1-9 20:48:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-9 22:14:41 | 显示全部楼层
这样操作不可靠,突然掉电数据容易丢失,官方模拟eeprom的例程是写满换页擦除的,均衡性和可靠性会好很多

出0入0汤圆

发表于 2012-1-10 06:01:10 | 显示全部楼层
记下

出0入0汤圆

发表于 2012-1-10 09:00:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-10 09:04:23 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-12 16:21:06 | 显示全部楼层
没有 头文件

出0入0汤圆

发表于 2012-2-5 20:24:27 | 显示全部楼层
看下。

出0入0汤圆

发表于 2012-3-2 14:04:42 | 显示全部楼层
正好参考学习下。谢谢

出0入0汤圆

发表于 2012-3-2 15:17:30 | 显示全部楼层
这样保存一些不是经常修改的值就不用外接一个eeprom了

出0入0汤圆

发表于 2012-3-2 20:05:07 | 显示全部楼层
好贴,这个要马克。

出0入0汤圆

发表于 2012-4-9 19:13:28 | 显示全部楼层
谢谢,正在研究stm32的flash保存数据。

出50入0汤圆

发表于 2012-4-19 17:17:20 | 显示全部楼层
mark,刚好有用。

出0入0汤圆

发表于 2012-4-19 21:31:02 | 显示全部楼层
顶顶顶顶顶

出0入0汤圆

发表于 2012-5-5 22:45:55 | 显示全部楼层
楼主费心, 我最近在有用到,用的是一样的方法!!!

出0入0汤圆

发表于 2012-5-7 08:13:10 | 显示全部楼层
最近真好要用,试试楼主的看看行不新

出0入0汤圆

发表于 2012-5-26 22:04:53 | 显示全部楼层
15楼
"这样操作不可靠,突然掉电数据容易丢失,官方模拟eeprom的例程是写满换页擦除的,均衡性和可靠性会好很多"
能否说具体点?

出0入0汤圆

发表于 2013-5-30 18:16:40 | 显示全部楼层
这个要mark的,以后写flash用的上

出0入0汤圆

发表于 2013-5-30 18:38:59 | 显示全部楼层
一进来就开始擦除   temp_stat = FLASH_ErasePage(PAGE_ADDR);                                                        // 擦出制定的页
这样每次写数据前都必须先把所有有用的数据读出来,然后调用擦除,再写入......

出0入8汤圆

发表于 2013-5-30 19:17:29 | 显示全部楼层
mark,以后备用。

出0入0汤圆

发表于 2013-5-31 00:16:01 | 显示全部楼层
mark        

出0入0汤圆

发表于 2013-5-31 09:38:48 | 显示全部楼层
这个我用过,只是写的时间比较长。不过如果用外部计数,定时器什么的会影响的。

出10入0汤圆

发表于 2013-6-3 09:16:45 | 显示全部楼层
mark                             

出0入0汤圆

发表于 2013-6-3 12:00:25 | 显示全部楼层
我也用过,是对音频数据保存 感觉没那么麻烦啊  就是调用俩函数 一个是FLASH擦除 一个是写半字

出0入0汤圆

发表于 2013-6-3 13:50:12 | 显示全部楼层
多谢,先收藏了!!

出0入0汤圆

发表于 2013-7-3 16:41:59 | 显示全部楼层
mark STM32 FLASH

出0入0汤圆

发表于 2013-8-10 19:50:39 | 显示全部楼层
楼主人太好了    真不知道怎么感谢你 顶一下吧

出0入0汤圆

发表于 2013-10-14 12:32:15 | 显示全部楼层
我用楼主的调通了。。官方的死活调不通。楼主好人,好人一生平安。

出0入0汤圆

发表于 2013-10-14 13:03:01 | 显示全部楼层
这一块一直用的现成的代码,看了你这个我明白了。

出0入0汤圆

发表于 2013-10-18 13:54:18 | 显示全部楼层
正在寻找解决类似于此类问题的方法,楼主好人啊!!!

出0入0汤圆

发表于 2013-11-21 13:14:24 | 显示全部楼层
顶一下,可以用!!!!

出0入0汤圆

发表于 2013-11-21 19:06:35 | 显示全部楼层
如何保证那片区域不会被程序覆盖掉? 就是先保留出那片flash

出0入0汤圆

发表于 2013-12-7 15:30:02 | 显示全部楼层
非常感谢,调了2天,用了楼主的程序才调通.

出0入0汤圆

发表于 2013-12-18 11:37:02 | 显示全部楼层
mark STM32 FLASH

出0入0汤圆

发表于 2013-12-18 11:53:27 | 显示全部楼层
标记一下,或许用得上

出0入0汤圆

发表于 2013-12-18 12:25:58 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2014-1-14 15:40:22 | 显示全部楼层

好东西,mark

出0入0汤圆

发表于 2014-1-14 20:54:18 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2014-1-14 20:59:18 | 显示全部楼层
收藏,,

出0入0汤圆

发表于 2014-1-15 10:46:33 | 显示全部楼层
留个记号,下次用到再来!谢谢分享!

出0入0汤圆

发表于 2014-1-15 12:24:59 | 显示全部楼层
最小是16位的数据

出0入0汤圆

发表于 2014-1-19 10:13:04 | 显示全部楼层
学习下  不错

出0入0汤圆

发表于 2014-3-26 14:09:52 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-3-30 16:09:01 | 显示全部楼层
标记下,用的上。顶一个

出0入0汤圆

发表于 2014-3-30 16:29:07 | 显示全部楼层
在实际运用中,Flash 与 EEPROM 存储少量参数配置信息到底哪个更可靠一点呢?现在公司用的是flash,之前公司用的是EEPROM。有相当实践经验的谈谈

出0入0汤圆

发表于 2014-3-30 16:41:02 | 显示全部楼层
学习下  不错

出0入0汤圆

发表于 2014-5-9 16:44:39 | 显示全部楼层
不错,拿来用了下,是正确的。

出0入0汤圆

发表于 2014-5-11 10:07:23 | 显示全部楼层
标记下  谢谢了

出0入0汤圆

发表于 2014-8-5 23:05:12 | 显示全部楼层
mark一下,最近正要用到掉电保存数据呢

出0入0汤圆

发表于 2014-8-18 15:57:42 | 显示全部楼层
mark

出0入0汤圆

发表于 2016-6-22 16:33:24 | 显示全部楼层
这个果然有用,谢谢了。

出0入0汤圆

发表于 2016-6-27 05:53:08 | 显示全部楼层

这个如何保证那片区域不会被程序覆盖掉? 一点不懂呢,FLASH是不是读不影响寿命啊?好心人帮解答一下

出30入0汤圆

发表于 2016-10-13 19:35:07 | 显示全部楼层
代码收到,可以用,谢谢。

出30入0汤圆

发表于 2016-10-13 19:37:32 | 显示全部楼层
当时板子上没有加EEPROM.用拔码开关选择功能,后程序功能越来越多,找到这个示例,拿来就可以用,

出0入0汤圆

发表于 2016-10-13 20:13:03 | 显示全部楼层
LZ为何不记录写入的偏移地址,然后根据偏移地址进行数据写入,就不用每次都要进行Page擦除操作

出0入0汤圆

发表于 2016-10-14 09:38:39 | 显示全部楼层
渣渣……

出0入0汤圆

发表于 2016-10-14 09:39:03 | 显示全部楼层
莫莫这也能火?

出0入0汤圆

发表于 2016-10-14 09:40:57 | 显示全部楼层
真正的模拟EEPROM在应用层看到的就是单双字节读写!!!

出0入0汤圆

发表于 2016-10-16 00:56:38 | 显示全部楼层
mark~~~~~~

出0入0汤圆

发表于 2016-10-22 15:52:19 | 显示全部楼层
mark,学习一下

出0入0汤圆

发表于 2016-10-22 22:04:22 | 显示全部楼层
现在原子写的《STM32F4开发指南》中就有关于该方面的例程,大家可以去看看

出0入0汤圆

发表于 2016-10-26 10:20:33 | 显示全部楼层
st提供的库例程还是很有用,仔细看看基本上都能掌握,楼主还是很有心的告诉大家怎么操作

出0入0汤圆

发表于 2016-12-1 17:09:42 | 显示全部楼层
正要用到,谢谢楼主!

出0入0汤圆

发表于 2016-12-1 20:11:03 | 显示全部楼层
加上浮点型读写就完善了

出0入0汤圆

发表于 2017-3-30 09:47:08 | 显示全部楼层
mark  flash 保存数据

出0入0汤圆

发表于 2018-5-3 09:20:34 | 显示全部楼层
要用,试一下

出0入0汤圆

发表于 2018-5-7 11:20:01 | 显示全部楼层
以后能用到,不错。

出0入0汤圆

发表于 2018-5-18 21:21:05 | 显示全部楼层
谢谢,挺方便

出100入113汤圆

发表于 2018-5-19 07:30:18 | 显示全部楼层
玩玩可以,做产品还是在家一片EEPROM吧,就几毛钱,原因是程序的安全可靠性。

出0入0汤圆

发表于 2018-5-21 20:07:52 | 显示全部楼层
saccapanna 发表于 2018-5-19 07:30
玩玩可以,做产品还是在家一片EEPROM吧,就几毛钱,原因是程序的安全可靠性。 ...

模拟EEPROM一样可靠,只是楼主这个……

出100入113汤圆

发表于 2018-5-22 09:36:35 | 显示全部楼层
xld826 发表于 2018-5-21 20:07
模拟EEPROM一样可靠,只是楼主这个……

如果你能保证程序绝对无bug,程序绝对不跑飞,那就是可靠的,不然意外飞入Flash写程序,结果是灾难性的。我一般bootloader后,就彻底锁死Flash的写操作,直到复位。

出0入0汤圆

发表于 2018-5-22 20:38:25 | 显示全部楼层
saccapanna 发表于 2018-5-22 09:36
如果你能保证程序绝对无bug,程序绝对不跑飞,那就是可靠的,不然意外飞入Flash写程序,结果是灾难性的。 ...

已经量产

出0入0汤圆

发表于 2018-5-30 16:39:28 来自手机 | 显示全部楼层
过几天要用到

出0入0汤圆

发表于 2018-9-10 10:54:18 | 显示全部楼层
mark一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 10:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表