作者 主题:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片 (Read 1827 times)

0会员和1位客人正在查看此主题。

离线 3dgeo

  • 频繁的贡献者
  • **
  • 帖子:263
  • 国家: Au.
EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« on: 2020年12月15日,晚上11:35:52»
你好,

我想存储几kB的设置/预设,由于128KB外部闪存块大小我希望在MCU闪存中存储预设。我的想法是使用每个预设(例如1kb)使用预定义的内存量,并在读取预设时将第一字节定义为其ID以识别。如果预设更新MCU查找新的emty空间,请在那里写入新预设,并将旧预设第1个字节设置为0x00以指示它's no longer valid.
据我所知,外部Flash在不删除它的情况下在同一页面上没有任何麻烦写入(仅写入"0" - 我知道闪光灯如何工作)。
但在谷歌搜索后发现了 这个:
"...但是,STM32中的内部闪存控制器's won'否则否则否则否则 整个页面被清除."
这是真的? STM控制器不会允许多个写入?如果SO保存到MCU闪光灯熄灭窗口,CUZ重写16KB少于1KB的浪费寿命。
 

在线的 ve7xen

  • 频繁的贡献者
  • **
  • 帖子:849
  • 国家: 加利福尼亚州
    • VE7XEN博客
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#1开: 2020年12月16日,12:51:04»
STM32F4XX的参考手册表示(P 86):

引用
注意:如果将位从“1”到“0”的比特更改为“0”,则可以不需要擦除操作,连续写入操作。写作'1'需要闪存擦除操作

所以 seems to explicitly permit this use, even within a single byte.

但不确定ST EEPROM仿真库所做的。如果您想要此,您可能需要自己实现它。
« 上次编辑:2020年12月16日,12:52:53 am by Ve7xen »
73 de Ve7xen.
他/他
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#2开: 2020年12月16日,12:51:52»
你好,

我想存储几kB的设置/预设,由于128KB外部闪存块大小我希望在MCU闪存中存储预设。我的想法是使用每个预设(例如1kb)使用预定义的内存量,并在读取预设时将第一字节定义为其ID以识别。如果预设更新MCU查找新的emty空间,请在那里写入新预设,并将旧预设第1个字节设置为0x00以指示它's no longer valid.
据我所知,外部Flash在不删除它的情况下在同一页面上没有任何麻烦写入(仅写入"0" - 我知道闪光灯如何工作)。
但在谷歌搜索后发现了 这个:
"...但是,STM32中的内部闪存控制器's won'否则否则否则否则 整个页面被清除."
这是真的? STM控制器不会允许多个写入?如果SO保存到MCU闪光灯熄灭窗口,CUZ重写16KB少于1KB的浪费寿命。

在我的STM32F103诊断程序中,有一个MCU闪存测试,将0x55和0xAA写入所有'hidden'2nd 64kb闪存块内存位置。我必须在将0x55写入每个位置后删除该块,然后测试它们现在是0x55。我对0xAA做同样的事情。

换句话说,在MCU闪存擦除之后,我可以将任何东西写入任何闪存位置,但要将数据更改为首先擦除该位置。擦除块的大小取决于模型之间变化的闪存控制器。在STM32F103的情况下,最小MCU闪光擦除块大小为1KB。

例如,STM32L053C8允许128字节擦除块,但是MCU闪光灯最大为64KB。

F4看起来像最小擦除闪存块是2KB。

Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

在线的 筱唑.

  • 常规贡献者
  • *
  • 帖子:171
  • 国家: NZ.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#3开: 2020年12月16日,上午12:54:19»
虽然您可以使用内部闪存作为设置等的NVM存储,但我们发现在系统Flash中拥有此商店的开发和固件更新通常不方便,我们如何分区。
我们最近切换到需要一个需要它的电路板上的小型eeprom芯片。在开发和固件更新期间,在开发和固件更新中更容易处理和批判性,每次编程MCU时,设置不会擦除。体积也很便宜 //www.digikey.com/en/products/detail/stmicroelectronics/M24C04-FMN6P/5402891

我只表明了这一点,因为您提到了用于存储这些设置的外部闪存芯片,

如果成本是您的项目的关注,那么使用内部闪光灯绝对可能。
ST甚至有一些示例代码(尽管没有F4。仅适用于G0,G4等)。 //www.st.com/en/embedded-software/x-cube-eeprom.html
它们还为F4处理器提供了一个应用笔记。
//www.st.com/resource/en/application_note/dm00036065-eeprom-emulation-in-stm32f40xstm32f41x-microcontrollers-stmicroelectronics.pdf

希望这些方法中的任何一个都可以帮助您!
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#4开: 2020年12月16日,01:53:52»
我在那个主题上写了一个简短的应用程序 http://ww1.microchip.com/downloads/en/DeviceDoc/EEPROM_Emulation_for_Flash-Only_Devices_DS90003222A.pdf (无用的微芯片,它是通用的)。

这种方法的实际实施就在这里 //github.com/ataradov/open-5012h/blob/master/config.c

在基于闪存的设备上的EEPROM方法有点不同,但实际上比在许多情况下与真实的EEPROM更好。至少我发现它更好。
亚历克斯
 

离线 3dgeo

  • 频繁的贡献者
  • **
  • 帖子:263
  • 国家: Au.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#5: 2020年12月16日,下午12:39:58»
答复的回复,

ST Lib使用2(或更多块) - 它将一个块数据组合在一起"new"数据并将其写入其他块,反之亦然。它非常有意义,但我'无论如何编码我自己的lib。我能做的一件事'查找/弄清楚是如何为此目的保留这些块,我'm guessing it'通过IDE设置完成?我应该很好地编码其他东西。

所以'毕竟,可以多次写入MCU闪光,我想我'LL必须尝试两种方式并选择最好的方式。


... F4看起来像最小擦除闪存块是2KB。

F4有16kb到128kb块。一世'm猜测你错误地用页面 - 我不知道f411页面的大小,但2kb似乎是正确的 - 你只能通过块写页面和erace。作为我've说 - 我知道闪光灯有效。


...希望这些方法中的任何一个都可以帮助您!

好吧,一世'仅M仅考虑两个选项 - PCB上已存在的内部闪存或闪存。我能"fit"Bootloader和实际固件之间的EEPROM块以避免冲突。但我仍然没有'T有Bootloader准备好了,所以我希望有关如何保留EEPROM块的提示。

我在那个主题上写了一个简短的应用程序 http://ww1.microchip.com/downloads/en/DeviceDoc/EEPROM_Emulation_for_Flash-Only_Devices_DS90003222A.pdf (无用的微芯片,它是通用的)。

这种方法的实际实施就在这里 //github.com/ataradov/open-5012h/blob/master/config.c

在基于闪存的设备上的EEPROM方法有点不同,但实际上比在许多情况下与真实的EEPROM更好。至少我发现它更好。

谢谢,将抛出眼球。
 
以下用户感谢此帖子: Techman-001.

离线 Tagli.

  • 贡献者
  • 帖子:15
  • 国家: TR.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#6开启: 2020年12月16日,01:20:57 PM»
我能做的一件事'查找/弄清楚是如何为此目的保留这些块,我'm guessing it'通过IDE设置完成?
您可以通过修改链接器脚本来保留内存。您需要定义一个新部分。
您还可以在源文件中定义Const数组,但编译器可能会优化它。所以我推荐链接脚本方式。
Gokce taglioglu.
 
以下用户感谢此帖子: 3dgeo

离线 3dgeo

  • 频繁的贡献者
  • **
  • 帖子:263
  • 国家: Au.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#7: 2020年12月16日,07:00:09 PM »
我能做的一件事'查找/弄清楚是如何为此目的保留这些块,我'm guessing it'通过IDE设置完成?
您可以通过修改链接器脚本来保留内存。您需要定义一个新部分。
您还可以在源文件中定义Const数组,但编译器可能会优化它。所以我推荐链接脚本方式。

所以,如果我想保留行业2和部门3:

原来的:
代码: [选择]
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K
}

我的mod:
代码: [选择]
/* Memories definition */
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 32K
  FLASH1   (rx)    : ORIGIN = 0x8010000,   LENGTH = 448K
}

我需要做什么其他更改?
存储器地图:
« 上次编辑:2020年12月16日,07:11:33 PM通过3DGeo »
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#8开: 2020年12月16日,晚上07:10:24»
GNU链接器的闪光灯中间的储备几乎不可能。您的更改不会做任何事情,您还需要更改脚本的其余部分。但是,如果像这样拆分闪光灯,则必须手动将代码放在不同的部分中。

此设备的布局根本不理想。

我认为可以做的最简单的事情是保留了向量表的前16 kB和一些固定代码,如重置处理程序和中断向量,然后为EEPROM分配1 ANS 2,然后放置其余代码。
亚历克斯
 

离线 Jeroen3.

  • 超级贡献者
  • ***
  • 帖子:3620
  • 国家: NL.
  • 嵌入式工程师
    • Jeroen3..nl.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#9: 2020年12月16日,07:16:39 PM»
您还应该为此进行一节。
代码: [选择]
/* Memories definition */
MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
  FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 512K - LENGTH(PRESET)
  PRESET (r) : ORIGIN = ORIGIN(FLASH)+LENGTH(FLASH), LENGTH = erase size
}
SECTIONS
{
  /* put const from presets.c in PRESET flash sector */
  .presets :
  {
  KEEP(*(.presets))
  } >PRESET
}

@Ataradov,为什么你说这是不可能的?一世'在一个项目中完成了。或者我有什么重要的吗?

更换32k以擦除尺寸
« 最后编辑:2020年12月16日,07:38:16 PM由Jeroen3 »
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#10: 2020年12月16日,07:21:23 PM»
如果闪光灯,擦除操作将擦除128K,则在最终预留32K时没有点。

这是为了EEPROM仿真,而不是静态部分。
亚历克斯
 

离线 Jeroen3.

  • 超级贡献者
  • ***
  • 帖子:3620
  • 国家: NL.
  • 嵌入式工程师
    • Jeroen3..nl.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#11开: 12月16日,2020年,07:45:50 PM»
真的。 32K在407中没有任何意义。
 

离线 Tagli.

  • 贡献者
  • 帖子:15
  • 国家: TR.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#12: 2020年12月16日,07:54:20 PM»
我认为我们可以忘记扇区0,因为我们需要它为矢量表。第1,2和3个看起来很有希望。我们可以移动.text部分,因此它可以从扇区4开始。

BTW,是否有可能具有多个部分.Text?我的意思是单个输入部分的多个输出部分?或者需要连续吗?
Gokce taglioglu.
 

离线 3dgeo

  • 频繁的贡献者
  • **
  • 帖子:263
  • 国家: Au.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#13开启: 12月16日,2020年,07:54:41 PM»
嗯,使用工作引导程序我认为我可以通过使用Sectos 0和1对引导加载程序来实现这一点,跳过两个扇区和刻录固件到扇区4和UP - 从似乎直截了当的测试中。
但是,由于我有0个关于链接器文件的知识,我认为我skipp仿真EEPROM直到我有一个引导加载程序。一世'LL使用外部闪光至此。

大学教师'这让我错了,如果有人走我真正的设置链接器文件,我会感激,但我意识到这是一个巨大的要求。
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#14: 2020年12月16日,08:04:28 PM»
是的,如果有一个引导加载程序,那么为引导加载程序分配16K是有意义的,然后为EEPROM为32k,然后为应用程序的其余部分。

通过GNU接头,不可能具有分裂部分。
亚历克斯
 
以下用户感谢此帖子: 3dgeo

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#15: 2020年12月16日,08:50:45 PM»
对于引导加载程序修改,它是微不足道的。只是这样做:

代码: [选择]
MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K
  FLASH    (rx)    : ORIGIN = 0x8000000 + 48K,   LENGTH = 512K - 48K
}
[/cpde]

That's it, you don't need to do anything about about that 32K chunk, just use it directly from the EEPROM code. This linker script guarantees it will be empty.
亚历克斯
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#16开: 2020年12月17日,07:43:03»
I'M A FORTH用户(技术人员不是编程器),并刚刚在我的F4发现板上进行了一些测试,看看我是否可以用00覆盖闪存数据。

极大的失败。

我从系统中隔离块11进行此测试。
代码: [选择]
Sector 11  0x080E0000 - 0x080FFFFF  128 Kbytes

我能够将0xAA保存到0x080F0000 没有问题,但闪光灯控制器在尝试将00直接保存到它之后抱怨,将0x080f0000设置为AA。

然后我尝试将0xFF保存到0x080f0000,闪存控制器没有'抱怨,但它没有'T更改值,它保持在0xAA。

我可以改变0x080f0000到00的唯一方法是通过擦除扇区11。

It'对于ME看起来越来越明智地使用外部存储器,可能是用于NV数据或CONFIGS的FM25CL64B-DG SPI FRAM。

Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#17开: 2020年12月17日,07:46:06»
无法在相同词(或更频繁为64或128位块)的原因是闪存上的ECC。这是不可能的"update"ECC位与您的新写作。这并不失败,它是内存密度更高的结果。大多数新的高性能MCU将有这个。

再次,如果你正确做事,这不是一个真正的问题。
亚历克斯
 
以下用户感谢此帖子: Jeroen3.

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#18开启: 2020年12月17日,08:10:57 AM»
无法在相同词(或更频繁为64或128位块)的原因是闪存上的ECC。这是不可能的"update"ECC位与您的新写作。这并不失败,它是内存密度更高的结果。大多数新的高性能MCU将有这个。

再次,如果你正确做事,这不是一个真正的问题。

你是说ECC是否需要被禁用能够覆盖MCU Flash位置?

我看不见"ECC"位域在STM32F407的参考手册中,仅针对灵活的静态存储器控制器(FSMC),因此似乎无法禁用MCU Flash的ECC?

您是否能够为此线程的读者执行此操作的正确方法?
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#19: 2020年12月17日,08:17:06»
ECC. often can not be disabled, and often is not even exposed to the user (except in strange limitations of programming ).

但在检查数据表之后,它会出现 该设备没有ECC。实际上,参考手册是明确的:"在从'1'到'0'的比特更改位时,可能需要连续的写操作而无需擦除操作。写入'1'需要闪存擦除操作。 "

那么Flash Controller如何抱怨究竟是如何抱怨的? STMS非常详细,闪存操作上的错误代码。

哦,等你有407.我正在寻找原始设备的手册。好的,407 RM中存在相同的精确文本。
« 上次编辑:2020年12月17日,08:19:34 Am由Ataradov »
亚历克斯
 

离线 名义动物

  • 超级贡献者
  • ***
  • 帖子:2460
  • 国家: FI.
    • 我的主页和电子邮件地址
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#20开: 2020年12月17日,08:03:53 PM»
我在那个主题上写了一个简短的应用程序 http://ww1.microchip.com/downloads/en/DeviceDoc/EEPROM_Emulation_for_Flash-Only_Devices_DS90003222A.pdf (无用的微芯片,它是通用的)。

这种方法的实际实施就在这里 //github.com/ataradov/open-5012h/blob/master/config.c

在基于闪存的设备上的EEPROM方法有点不同,但实际上比在许多情况下与真实的EEPROM更好。至少我发现它更好。
很有意思!  I'在没有文件系统的情况下,在没有文件系统的情况下,在没有文件系统的情况下建议使用类似的东西,以找到对数时间中的最新计数器 - 假设媒体在首次使用之前被清除到所有零或所有零。 (如果使用8 GB microSD使用512字节的扇区,则获得16米的扇区,因此线性搜索是不可行的。 如果没有无效的扇区,则需要最多读取最多27个计数器(如果我算是右)以找到最新的次数;唯一的"trick"在实现搜索时,通过寻找不连续性来处理部分使用和完全使用的情况。) 使用512字节的扇区和64位计数器(避免所有使用寿命限制),您仍然有504个字节为用户数据。
 

离线 Jeroen3.

  • 超级贡献者
  • ***
  • 帖子:3620
  • 国家: NL.
  • 嵌入式工程师
    • Jeroen3..nl.
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#21开: 2020年12月17日,08:17:23 PM»
无法在相同词(或更频繁为64或128位块)的原因是闪存上的ECC。
[...]
当然是。为什么没有'当我尝试这个时,我想到了这一点 :palm:
他们经常不 '甚至在手册中谈论这一点。但他们不't need to really.

所以你可以'T覆盖,只追加。
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#22: 2020年12月17日,晚上11:56:58»
无法在相同词(或更频繁为64或128位块)的原因是闪存上的ECC。
[...]
当然是。为什么没有'当我尝试这个时,我想到了这一点 :palm:
他们经常不 '甚至在手册中谈论这一点。但他们不't need to really.

所以你可以'T覆盖,只追加。

我只看起来只有STM32 L,G系列,STM303F实际上有ECC闪光灯。
//en.wikipedia.org/wiki/STM32

STM32F407没有提及车载ECC(OP'S MCU)在REF手册或SVD中's.
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#23开: 2020年12月17日,晚上11:58:47»
是的,OPS芯片的参考手册允许任何设置1的写字 - > 0.
亚历克斯
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#24开: 2020年12月18日,12:57:50»
ECC. often can not be disabled, and often is not even exposed to the user (except in strange limitations of programming ).

但在检查数据表之后,它会出现 该设备没有ECC。实际上,参考手册是明确的:"在从'1'到'0'的比特更改位时,可能需要连续的写操作而无需擦除操作。写入'1'需要闪存擦除操作。 "

那么Flash Controller如何抱怨究竟是如何抱怨的? STMS非常详细,闪存操作上的错误代码。

哦,等你有407.我正在寻找原始设备的手册。好的,407 RM中存在相同的精确文本。

一个优秀的问题,我不'实际上现在知道我'M等待来自第四种系统的架构师的反馈(MeCrisp-Stellaris)。

我Greppped MECRISP-Stellaris源头,似乎错误来自Forth Kernel,而不是F407 Flash_SR寄存器,其中包含闪存问题的以下位域。

:flash_sr_eop( - x addr)5位flash_sr; \ flash_sr_eop,操作结束
:flash_sr_wrprt( - x addr)4 bit flash_sr; \ flash_sr_wrpt,写保护错误
:flash_sr_pgerr( - x addr)2 bit flash_sr; \ flash_sr_pgerr,编程错误
:flash_sr_bsy( - x addr)0 bit flash_sr; \ flash_sr_bsy,忙

我期望flash_sr_pgerr是这个问题,但我可以't看到它被提出(或其他任何人)或在源中找到它,但是源主要是德语,而不是符合CMSIS-SVD兼容,所以我'LL必须等待建筑师的建议。
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#25 on: 2020年12月18日,09:03:28»
ECC. often can not be disabled, and often is not even exposed to the user (except in strange limitations of programming ).

但在检查数据表之后,它会出现 该设备没有ECC。实际上,参考手册是明确的:"在从'1'到'0'的比特更改位时,可能需要连续的写操作而无需擦除操作。写入'1'需要闪存擦除操作。 "

那么Flash Controller如何抱怨究竟是如何抱怨的? STMS非常详细,闪存操作上的错误代码。

哦,等你有407.我正在寻找原始设备的手册。好的,407 RM中存在相同的精确文本。

一个优秀的问题,我不'实际上现在知道我'M等待来自第四种系统的架构师的反馈(MeCrisp-Stellaris)。

我Greppped MECRISP-Stellaris源头,似乎错误来自Forth Kernel,而不是F407 Flash_SR寄存器,其中包含闪存问题的以下位域。

:flash_sr_eop( - x addr)5位flash_sr; \ flash_sr_eop,操作结束
:flash_sr_wrprt( - x addr)4 bit flash_sr; \ flash_sr_wrpt,写保护错误
:flash_sr_pgerr( - x addr)2 bit flash_sr; \ flash_sr_pgerr,编程错误
:flash_sr_bsy( - x addr)0 bit flash_sr; \ flash_sr_bsy,忙

我期望flash_sr_pgerr是这个问题,但我可以't看到它被提出(或其他任何人)或在源中找到它,但是源主要是德语,而不是符合CMSIS-SVD兼容,所以我'LL必须等待建筑师的建议。

架构师指出,他的装配代码有防止改变闪存,一旦删除了这段代码,所有内容都按照用户手册的预期工作。

代码: [选择]
Sector 11  0x080E 0000 - 0x080F FFFF  = 128 Kbytes
代码: [选择]
11 eraseflashsector Erase sector 11
 ok.
read_$F0000 000000FF  ok.
flash_0xAA->$F0000  ok.
read_$F0000 000000AA  ok.
flash_0x00->$F0000  ok.
read_$F0000 00000000  ok.
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#26: 2020年12月18日,09:16:19»
我想存储几kB的设置/预设,由于128KB外部闪存块大小我希望在MCU(STM32F407)闪存中存储预设。我的想法是使用每个预设(例如1kb)使用预定义的内存量,并在读取预设时将第一字节定义为其ID以识别。如果预设更新MCU查找新的emty空间,请在那里写入新预设,并将旧预设第1个字节设置为0x00以指示它's no longer valid.

概括:

是的,可以完成这一点,单个闪存位置可以让数据刷新"0"'s, (but not "1"'s).

最低擦除尺寸是涉及的部门。我的测试使用了Sector 11。
注意:MCU(STM32F407) 没有ECC闪光.

代码: [选择]
Sector 11  0x080E 0000 - 0x080F FFFF  = 128 Kbytes
11 eraseflashsector Erase sector 11  ok.


来自STM32F407发现板的数据运行MECRISP-Stellaris,显示上面。

代码: [选择]
read_$F0000 000000FF  ok.

flash_0xAA->$F0000  ok.

read_$F0000 000000AA  ok.

flash_0x00->$F0000  ok.

read_$F0000 00000000  ok.




 
« 上次编辑:2020年12月18日,09:18:36 AM通过Techman-001 »
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 阿塔拉多夫

  • 超级贡献者
  • ***
  • 帖子:7354
  • 国家: 我们
    • 个人网站
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#27: 2020年12月18日,09:19:56 AM»
这里唯一有一个领域的危险是在你擦除的时候可能会消失,你会丢失你的设置。您需要至少两个部门进行可靠操作。
亚历克斯
 

离线 Techman-001.

  • 频繁的贡献者
  • **
  • 帖子:716
  • 国家: Au.
  • 电子技术员过去50年
    • MECRISP Stellaris非官方Userdoc
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#28 on: 2020年12月18日,上午10:14:19»
这里唯一有一个领域的危险是在你擦除的时候可能会消失,你会丢失你的设置。您需要至少两个部门进行可靠操作。

如果Hobbyist愿意放弃那个专业水平的数据安全性,则可以使用第二个可以建立64KB的记录器"hidden" flash block in a "blue-pill"使用大多数单位的STM32F103C8 MCU。
这将为主程序留下64KB,这对于C和FORT而言是吨。
Bluepill Diagnostics:  //sourceforge.net/projects/mecrisp-stellaris-folkdoc/files/stm32fxx-diagnostics-v1.5.bin
Cortex-M的Mecrisp-Stellaris;非官方DOC: //mecrisp-stellaris-folkdoc.sourceforge.io/
实时谈论真实的人,irc:freenode.net #mecrisp
 

离线 S. Petrukhin

  • 超级贡献者
  • ***
  • 帖子:1044
  • 国家: 茹
Re:EEPROM仿真 - STM32F4 Flash VS外部闪存芯片
« 回复#29开: 2020年12月20日,03:21:39»
闪光灯的逻辑是它可以't接受使用mov(如EEP​​ROM)的数据,它接受数据和。 IE。您可以将0写入每位闪光灯,但您可以'T写入1.写入1,您需要在相同的时间擦除整个扇区 - 删除闪光灯中包含1的所有位。

当我经常需要写一个字节时,似乎不必补充EEPROM,经常擦除闪光灯将被擦拭。我组织了一系列数据细胞。第一个字节是具有值的签名:FFH-Cell是空闲的,0FH-Cell包含当前数据,00H-Cell被取消。因此,通过查找具有签名0FH的单元格,我可以找到实际数据。要编写新的实际数据,我将签名00h写入当前单元格,签名0FH到下一个。当扇区结束时,我删除了它并使用了一个新的圆圈。

代码: [选择]
const
    cEmptyFlashCell = 0xFF;
    cActualFlashCell = 0x0F;
    cCanceledFlashCell = 0x00;
    cEmptyFlashValue = 0;

type
    tFlashCell = record
       Singnatute : byte;
       Value : byte;
   end;

const
   cLowFlashData = 1;
   cHighFlashData = cSectorSize div SizeOf(tFlashCell);

type
   tFlashData = array[cLowFlashData..cHighFlashData] of tFlashCell;

var
   FlashData : tFlashData absolute cFlashEnd-cFlashSectorSize;

funtion GetFlashCurrPos:dword;
var i: dword;
begin
   i:=cLowFlashData;
   while (i<=cHighFlashData) and (FlashData[i].Signature<>cActualFlashCell ) do Inc(i);
   if i>cHighFlashData then i:=cLowFlashData;
   Result:=i;
end;

function GetFromFlashValue:byte;
var t: dword;
begin
   t:=GetFlashCurPos;
   if FlashData[t].Signature=cEmptyFlashCell then begin
      Result:=cEmptyFlashValue;
   and else begin
      Result:=FlashData[t].Value;
   end;
end;

procedure SetToFlashValue(aValue:byte);
var t: dword;
begin
    t:=GetFlashCurPos;
    if t=cHighFlashData then begin
       EraseFlashSector;
       t:=cLowFlashData;
    end else begin
       if FlashData[t].Signature<>cEmptyFlashCell then begin
          SaveToFlash(t,cCanceledFlashCell,0);
          Inc(t);
       end;
    end;
    SaveToFlash(t,cActualFlashCell,aValue);
end;

« 上次编辑:2020年12月20日,03:34:21 AM由S. Petrukhin »
对不起我的英语。
 
以下用户感谢此帖子: d


分享我

掘客  Facebook  诽谤  美味的  Technorati.  推特  谷歌  雅虎
SMF.