打印

关于STM32的FLASH编程可不可以在指定位置写入数据?

[复制链接]
14051|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ltjish|  楼主 | 2013-1-26 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的思路是这样的,我有些参数希望保存在一个const定义的数组中,
不知道能不能实现,我试验过很多方法,都没成功。
沙发
uet_cache| | 2013-1-26 15:14 | 只看该作者
const数据可以初始化数据,但程序中不能随便修改。CONST定义是自动编程到FLASH区的,,,好像不占RAM的,,

使用特权

评论回复
板凳
ltjish|  楼主 | 2013-1-26 15:37 | 只看该作者
对const是自动编程到FLASH区的,
不知道能不能通过FLASH编程修改const区的数据?
有谁这样做成功了没?

使用特权

评论回复
地板
uet_cache| | 2013-1-26 15:43 | 只看该作者
好像可以,但对地址有要求。

//u-easytech cache lee
//QQ:53755787
//MSN: uet_cache@msn.cn
//eeprom demo

//Programmed by Cache.Lee 2012/7/22


#include "stm32f0xx.h"
#include "stm32f0xx_adc.h"
#include "stm32f0xx_gpio.h"
#include "eeprom.h"



uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};
uint16_t VarDataTab[NB_OF_VAR] = {0, 0, 0};
uint16_t VarValue = 0;

int main(void)
{               
        FLASH_Unlock();

  /* EEPROM Init */
  EE_Init();

/* --- Store successively many values of the three variables in the EEPROM ---*/
  /* Store 0x1000 values of Variable1 in EEPROM */
  for (VarValue = 1; VarValue <= 10; VarValue++)
  {
    EE_WriteVariable(VirtAddVarTab[0], VarValue);
  }

  /* read the last stored variables data*/
  EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]);


  /* Store 0x2000 values of Variable2 in EEPROM */
  for (VarValue = 1; VarValue <=20; VarValue++)
  {
    EE_WriteVariable(VirtAddVarTab[1], VarValue);
  }

  /* read the last stored variables data*/
  EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]);
  EE_ReadVariable(VirtAddVarTab[1], &VarDataTab[1]);


  /* Store 0x3000 values of Variable3 in EEPROM */
  for (VarValue = 1; VarValue <= 30; VarValue++)
  {
    EE_WriteVariable(VirtAddVarTab[2], VarValue);
  }

  /* read the last stored variables data*/
  EE_ReadVariable(VirtAddVarTab[0], &VarDataTab[0]);
  EE_ReadVariable(VirtAddVarTab[1], &VarDataTab[1]);
  EE_ReadVariable(VirtAddVarTab[2], &VarDataTab[2]);

        while(1);
}

使用特权

评论回复
5
ltjish|  楼主 | 2013-1-26 16:32 | 只看该作者
这个貌似也只能对页写,
在论坛上看到匠人发表的问题中说是能够这样做的,我这样做确没成功,
关于问题1:答复香斑:
我说的数据区就是const数组,代码区就是指函数。
如果说是因为写保护,那我可以理解。不过如此一来,问题1就转变成了:同样是存放在FLASH中,为什么const数组可以被改写?

为了说明问题,我把相关的程序挑有用的放上来,请注意红色字体。


//--------------------------------------------------------
//数据表
//--------------------------------------------------------
const u32 R_tab[]=
{
0x12345678, //0
  //更多数据省略……
}
//--------------------------------------------------------
//函数
//--------------------------------------------------------
u32 CNT_v1(u32 data)  
{
    //代码省略……  
}

改写数据区:
  FLASH_Unlock();                             //解锁FLASH编程擦除控制器
  Address=(vu32)&(R_tab);                     //获取表格地址
  FLASH_ProgramWord ((Address), 0);           //写32位数据(调用《stm32f10x_flash.c》的函数)(这一步能够成功)
  FLASH_Lock();                               //锁定FLASH编程擦除控制器

改写代码区:
  FLASH_Unlock();                             //解锁FLASH编程擦除控制器
  Address=(vu32)&(CNT_v1);                   //获取某个函数函数地址
  FLASH_ProgramWord ((Address), 0);           //写32位数据(调用《stm32f10x_flash.c》的函数)(这一步失败)
  FLASH_Lock();                               //锁定FLASH编程擦除控制器


希望匠人出来说明下具体怎么做的。

使用特权

评论回复
6
JasonWangFAE| | 2013-1-26 17:10 | 只看该作者
you need to erase flash first before you programming the flash.

使用特权

评论回复
7
zchong| | 2013-1-26 17:49 | 只看该作者
flash如果内容不是全FFFF,再想写入的话,需要先擦除

使用特权

评论回复
8
yyql008| | 2013-1-26 18:43 | 只看该作者
用模拟EEPROM不就是了.....考虑那么多....

使用特权

评论回复
9
ltjish|  楼主 | 2013-1-27 11:17 | 只看该作者
zchong 发表于 2013-1-26 17:49
flash如果内容不是全FFFF,再想写入的话,需要先擦除

我在const数组初始化的时候写入ffff也不行。

使用特权

评论回复
10
ltjish|  楼主 | 2013-1-27 11:20 | 只看该作者
yyql008 发表于 2013-1-26 18:43
用模拟EEPROM不就是了.....考虑那么多....

对,我现在就是在模拟EEPROM。但是我模拟的EEPROM是只要写入,不需要擦除的,擦除需要整页擦,既然我不需要擦了。那我就没必要用整页来模拟EEPROM了。

使用特权

评论回复
11
ltjish|  楼主 | 2013-1-27 11:28 | 只看该作者
JasonWangFAE 发表于 2013-1-26 17:10
you need to erase flash first before you programming the flash.

3Q for your answer。
另外我想知道,FLASH数据的写入是不是还有其他的条件。比如是不是一定要整页没被初始化或都是0XFFFF,

使用特权

评论回复
12
28182900| | 2013-1-27 13:21 | 只看该作者
骂人咔咔咔咔咔咔咔咔咔咔咔咔

使用特权

评论回复
13
yyql008| | 2013-1-27 21:15 | 只看该作者
本帖最后由 yyql008 于 2013-1-27 21:31 编辑

flash 写之前,需要擦除的,也就是说flash某个地址已经写入了数据,现在对该地址要写新数据,需要擦除(而且一擦除,就得擦除一页,好像是因为写数据,只能把1变为0,擦除可以把所有位擦为1,好像工艺原因,把0变成1,比1变成0要难,所有才有一擦除得整页擦除,写可以对指定地址操作)
如果按你的思路,对falsh指定位置存储数据,以后又修改该处数据,每更新一次就得擦除一页.
STM32模拟eeprom有虚拟地址的概念,调用上层的eeprom写函数,虽然虚拟地址没变,实际操作的flash地址变,目的就是尽量介绍擦除的次数了...,如果你用STM32的eeprom,可以把擦除flash次数减少到最少的.觉得你用模拟eeprom是最好的解决办法了...

使用特权

评论回复
14
txcy| | 2013-1-27 22:41 | 只看该作者
应该是可以的

使用特权

评论回复
15
ltjish|  楼主 | 2013-1-28 10:10 | 只看该作者
yyql008 发表于 2013-1-27 21:15
flash 写之前,需要擦除的,也就是说flash某个地址已经写入了数据,现在对该地址要写新数据,需要擦除(而且一擦 ...

模拟EEPROM只是保持的地址在变,但是依然占用这一页,也就是一页干不了其它事情,这一页写满后擦除,这样是能减少擦除次数,但是我想要的效果是减少占用的空间,而不是次数,因为我不需要擦除。

使用特权

评论回复
16
ltjish|  楼主 | 2013-3-8 10:01 | 只看该作者
再顶!

使用特权

评论回复
17
LIUXRUI2010| | 2013-6-25 17:22 | 只看该作者
非常好 学习了

使用特权

评论回复
18
trumpxp| | 2013-6-25 19:39 | 只看该作者
不是很了解   楼主   帮你顶一个   很好的学习方案   

使用特权

评论回复
19
dl349621994| | 2014-4-25 11:45 | 只看该作者
不明白      

使用特权

评论回复
20
Eagle_fly| | 2014-5-19 09:55 | 只看该作者
学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

17

帖子

1

粉丝