写入相同的闪存地址会缩短 MCU 的使用寿命吗
Would writing to same flash address reduce lifespan of MCU
我正在使用 STM8 微控制器。由于向量 table 在闪存中,我需要写入闪存才能创建和使用向量 table。由于 vector tables 的地址是固定的,我的代码在每次启动时将相同的值写入闪存的相同内存地址。由于代码中没有闪存擦除调用,我认为在第一次写入过程之后它不会再做任何事情了。
我的问题是:如果我在每个 startup/reset 上将相同的值写入相同的闪存地址而不擦除,是否会缩短闪存的寿命?
My question is would it reduce the life of flash if I write to same
flash memory address on every startup/reset without erasing?
一般来说,写入完全相同的值不会减少寿命。
IRL 这取决于写入例程的实现,即取决于您的“操作系统”。它可能会确定写入是不必要的并且不会执行它或者它可能总是 erase/write.
FLASH erase/write 的经验值是 50 k。 (制造商仅保证在此 data sheet 上使用 100 erase/write 个循环)。
在制造商的页面上,我没有找到任何提及集成 wear-leveling,无论是闪存还是 EEPROM,请参阅
https://www.st.com/en/microcontrollers-microprocessors/stm8-8-bit-mcus.html
- 程序存储器:8-Kbyte 闪存;在 55 °C 下 100 次循环后数据保留 20 年
- 内存:1 KB
- 数据存储器:128字节真实数据EEPROM;耐力高达 100 k write/erase 周期
下一页强调您应该使用 wear-leveling 技巧:
https://embedded-lab.com/blog/continuing-stm8-microcontroller-expedition/11/
Though flash memories are primarily intended for storing application codes, it is still possible to use them just like EEPROMs using In-Application Programming (IAP). However, it is important to check that by mistake, we don’t write in those areas where application code reside. IAP can also be used for upgrading application firmware Over-The-Air (OTA).
Avoid frequent writes/erases to increase memory life cycles. If needed to write/erase data frequently use wear-leveling technique.
此问答可能是 better-suited 到 https://electronics.stackexchange.com,其中可能会找到更多有关嵌入式电子产品和闪存工作原理的专家。
闪存真正工作原理的物理学和电子学
快速回答:
Since addresses of vector tables are fixed my code writes same values to same memory address of the flash on every startup.
研究我在下面写的内容。在初始擦除操作和第一次写入操作后没有发生新的损坏。
My question is would it reduce the life of flash if I write to same flash memory address on every startup/reset without erasing?
如果您每次都将完全相同的内容写入完全相同的闪存,中间没有擦除周期,那么在第一次写入后不会发生新的损坏。只有第一次写入实际上会放电任何位(电容器),从而造成一次损坏。
详情:
My question is would it reduce the life of flash if I write to same flash memory address on every startup/reset without erasing?
让我在这里补充一些见解。
下面我的粗略理解大致了解了一般原理、用法和行为,但如果你真的想了解更多关于它的物理知识,你可以从阅读这篇文章开始:https://en.wikipedia.org/wiki/Flash_memory.
以下是我对闪存真正工作原理的理解:
- 擦除:闪存是存储在微型电容器中的存储器。 “擦除”将所有电池充电到高电压,根据您的 mcu,这可能被认为是二进制零(
0
) 或 二进制一(1
).然而,对于我下面的其余分析,让我们假设一个 充电 到高电压的位被认为是二进制零 (0
)。 “擦除”循环会破坏电容器单元壁的原子结构,因为在充电过程中电子会通过它。擦除周期是在整个闪存“页面”或大块内存(通常大小为数千字节)上一次完成的。就使用的能量和时间而言,擦除是一项昂贵的操作,因为一堆电荷泵必须将微小的 mcu 电压泵送到高电压,这可以在一次大洪水中为整个闪存页面的所有单元充电为电容器组充电的能量。
- 写入:“写入”可以在粒度字(例如:4 字节)或字节级别(粒度取决于 mcu)上完成,而不是在大闪存页面级别,通常以千字节为单位。它速度很快,因为它所要做的就是将一位或几位短路到地以使电容器放电,从而将高电压 (
0
) 变为低电压 (1
)。 “写入”一个 1
到位只是将该位从 HIGH (0
) 放电到 LOW (1
)。如果该位之前被“擦除”以首先将其充电到高电平(0
),它只会改变任何东西。从 HIGH 到 LOW 稍微放电也是一个破坏性过程,因为它会在电容器壁放电时通过电容器壁发射电子,因为你将该电池短路到地,当电子爆炸时在原子水平上去除物质。向 0
(高电压)“写入”一点点什么也做不了。它是一个no-op(没有操作)。正是 erase 周期将该位设置为 0
(高电平)。就像这样:
- 写入闪存
0
(高)--> 1
(低)= 充电位通过接地短路放电;这是一种分子破坏性操作。
- 正在写入 flash
0
(HIGH) --> 0
(HIGH) = 没有任何反应(写入 HIGH 是 no-op);位已经充电,写入不能充电位;只有擦除可以。该位保持高电平 (0
)。
- 正在写入 flash
1
(LOW)--> 0
(HIGH)= 没有任何反应(写入 HIGH 是 no-op);写作不能收费一点;只有 erase 可以。该位保持低电平 (1
)。
- 正在写入闪存
1
(LOW) --> 1
(LOW) = 该位对地短路以将其放电至 LOW (1
),但由于它已经出院了,什么也没有发生。没有电子想要移动,所以这是一个 non-descructive 操作,因为之前当该位从 0
(高)放电到 1
(低)。
有道理吗?
因此,如果您尝试将二进制字节 0b00000000
(所有位处于高电压)写入 0b11111111
(所有位处于低电压),那么它 放电 通过将所有位短接到地,将它们的电压从高电平变为低电平,最终得到 0b11111111
。这会损坏电容器单元。如果您尝试再次将该字节写入 0b11111111
,它会再次将所有电池短路接地,但是 没有任何反应,因为电池已经放电!没有发生新的损坏。
但是,如果您尝试将二进制 0b11111111
(所有位都处于低电压)写入 0b00000000
(所有位都处于高电压)电压,什么也不会发生! 写入不能给电池充电,只有 erase 操作可以!你最终还是 0b11111111
。没有对您的细胞造成损害。你得到了 no-op.
因此,当您 放电 一点,并且当ou 充电一点。通过 erase 循环完成充电,因此您可以计算 erase 的次数作为“损坏循环次数”的估计值“你已经强加在闪存电容器单元上了。
- 标准闪存(可在大“页面”组中擦除)通常额定高达 10,000 " write-to-1(低;通过放电)/erase-to-0(高,通过充电) 周期。请参阅您的数据表以获取确切的数字。
- EEPROM(可在非常精细的字节或字级别擦除)闪存一般为more-robust,可以处理100,000 write/erase 周期。请参阅您的数据表以获取确切的数字。
现在,有了这些知识,您的“书写”真的可以在不先擦除的情况下做任何事情吗?
你真的造成任何伤害吗?如果是第一次写造成的,后面的写会不会造成更大的伤害?
您现在应该拥有了解这些答案的工具。
我不太清楚为什么每次重置都需要写入向量 table。假设引导加载程序的某种方式具有向量间接性,则:
在写入任何形式的闪存之前,memcmp
已经存在的 data/code 以及您要写入的内容。如果相同,则什么都不做。
在不确定是否已先被擦除的情况下写入地址肯定是错误的。通常擦除的闪存具有“全一”0xFF 的值(尽管某些部分使用“全零”作为默认状态,请参见 Why do most of the non-volatile memories have logical 1 as the default state?)。假设 1 是默认状态,写入过程涉及将 1 变为 0,这就是闪光灯。但是也意味着在写的时候,只能写零。这就是为什么多次写入同一个单元格而不擦除它没有意义。
示例:
- 擦除一些 16 位闪存块,我们得到值 0xFFFF。
- 我们写入值 0xF0F0,我们得到 0xF0F0。
- 我们写入值 0xFAFA,我们仍然得到 0xF0F0,因为你不能在不擦除的情况下将 0 变成 1。所以这是一个严重的错误。
还需要注意的是,MCU 制造商指定了整个温度范围内的擦除周期数(以及数据保留),通常是工业温度范围 -40° 至 +85°(或更宽的汽车温度范围) .但是,如果您的产品大部分时间都远离此区间的极端范围,那么它的工作周期将比指定的多得多。
我正在使用 STM8 微控制器。由于向量 table 在闪存中,我需要写入闪存才能创建和使用向量 table。由于 vector tables 的地址是固定的,我的代码在每次启动时将相同的值写入闪存的相同内存地址。由于代码中没有闪存擦除调用,我认为在第一次写入过程之后它不会再做任何事情了。
我的问题是:如果我在每个 startup/reset 上将相同的值写入相同的闪存地址而不擦除,是否会缩短闪存的寿命?
My question is would it reduce the life of flash if I write to same flash memory address on every startup/reset without erasing?
一般来说,写入完全相同的值不会减少寿命。
IRL 这取决于写入例程的实现,即取决于您的“操作系统”。它可能会确定写入是不必要的并且不会执行它或者它可能总是 erase/write.
FLASH erase/write 的经验值是 50 k。 (制造商仅保证在此 data sheet 上使用 100 erase/write 个循环)。
在制造商的页面上,我没有找到任何提及集成 wear-leveling,无论是闪存还是 EEPROM,请参阅 https://www.st.com/en/microcontrollers-microprocessors/stm8-8-bit-mcus.html
- 程序存储器:8-Kbyte 闪存;在 55 °C 下 100 次循环后数据保留 20 年
- 内存:1 KB
- 数据存储器:128字节真实数据EEPROM;耐力高达 100 k write/erase 周期
下一页强调您应该使用 wear-leveling 技巧: https://embedded-lab.com/blog/continuing-stm8-microcontroller-expedition/11/
Though flash memories are primarily intended for storing application codes, it is still possible to use them just like EEPROMs using In-Application Programming (IAP). However, it is important to check that by mistake, we don’t write in those areas where application code reside. IAP can also be used for upgrading application firmware Over-The-Air (OTA).
Avoid frequent writes/erases to increase memory life cycles. If needed to write/erase data frequently use wear-leveling technique.
此问答可能是 better-suited 到 https://electronics.stackexchange.com,其中可能会找到更多有关嵌入式电子产品和闪存工作原理的专家。
闪存真正工作原理的物理学和电子学
快速回答:
Since addresses of vector tables are fixed my code writes same values to same memory address of the flash on every startup.
研究我在下面写的内容。在初始擦除操作和第一次写入操作后没有发生新的损坏。
My question is would it reduce the life of flash if I write to same flash memory address on every startup/reset without erasing?
如果您每次都将完全相同的内容写入完全相同的闪存,中间没有擦除周期,那么在第一次写入后不会发生新的损坏。只有第一次写入实际上会放电任何位(电容器),从而造成一次损坏。
详情:
My question is would it reduce the life of flash if I write to same flash memory address on every startup/reset without erasing?
让我在这里补充一些见解。
下面我的粗略理解大致了解了一般原理、用法和行为,但如果你真的想了解更多关于它的物理知识,你可以从阅读这篇文章开始:https://en.wikipedia.org/wiki/Flash_memory.
以下是我对闪存真正工作原理的理解:
- 擦除:闪存是存储在微型电容器中的存储器。 “擦除”将所有电池充电到高电压,根据您的 mcu,这可能被认为是二进制零(
0
) 或 二进制一(1
).然而,对于我下面的其余分析,让我们假设一个 充电 到高电压的位被认为是二进制零 (0
)。 “擦除”循环会破坏电容器单元壁的原子结构,因为在充电过程中电子会通过它。擦除周期是在整个闪存“页面”或大块内存(通常大小为数千字节)上一次完成的。就使用的能量和时间而言,擦除是一项昂贵的操作,因为一堆电荷泵必须将微小的 mcu 电压泵送到高电压,这可以在一次大洪水中为整个闪存页面的所有单元充电为电容器组充电的能量。 - 写入:“写入”可以在粒度字(例如:4 字节)或字节级别(粒度取决于 mcu)上完成,而不是在大闪存页面级别,通常以千字节为单位。它速度很快,因为它所要做的就是将一位或几位短路到地以使电容器放电,从而将高电压 (
0
) 变为低电压 (1
)。 “写入”一个1
到位只是将该位从 HIGH (0
) 放电到 LOW (1
)。如果该位之前被“擦除”以首先将其充电到高电平(0
),它只会改变任何东西。从 HIGH 到 LOW 稍微放电也是一个破坏性过程,因为它会在电容器壁放电时通过电容器壁发射电子,因为你将该电池短路到地,当电子爆炸时在原子水平上去除物质。向0
(高电压)“写入”一点点什么也做不了。它是一个no-op(没有操作)。正是 erase 周期将该位设置为0
(高电平)。就像这样:- 写入闪存
0
(高)-->1
(低)= 充电位通过接地短路放电;这是一种分子破坏性操作。 - 正在写入 flash
0
(HIGH) -->0
(HIGH) = 没有任何反应(写入 HIGH 是 no-op);位已经充电,写入不能充电位;只有擦除可以。该位保持高电平 (0
)。 - 正在写入 flash
1
(LOW)-->0
(HIGH)= 没有任何反应(写入 HIGH 是 no-op);写作不能收费一点;只有 erase 可以。该位保持低电平 (1
)。 - 正在写入闪存
1
(LOW) -->1
(LOW) = 该位对地短路以将其放电至 LOW (1
),但由于它已经出院了,什么也没有发生。没有电子想要移动,所以这是一个 non-descructive 操作,因为之前当该位从0
(高)放电到1
(低)。
- 写入闪存
有道理吗?
因此,如果您尝试将二进制字节 0b00000000
(所有位处于高电压)写入 0b11111111
(所有位处于低电压),那么它 放电 通过将所有位短接到地,将它们的电压从高电平变为低电平,最终得到 0b11111111
。这会损坏电容器单元。如果您尝试再次将该字节写入 0b11111111
,它会再次将所有电池短路接地,但是 没有任何反应,因为电池已经放电!没有发生新的损坏。
但是,如果您尝试将二进制 0b11111111
(所有位都处于低电压)写入 0b00000000
(所有位都处于高电压)电压,什么也不会发生! 写入不能给电池充电,只有 erase 操作可以!你最终还是 0b11111111
。没有对您的细胞造成损害。你得到了 no-op.
因此,当您 放电 一点,并且当ou 充电一点。通过 erase 循环完成充电,因此您可以计算 erase 的次数作为“损坏循环次数”的估计值“你已经强加在闪存电容器单元上了。
- 标准闪存(可在大“页面”组中擦除)通常额定高达 10,000 " write-to-1(低;通过放电)/erase-to-0(高,通过充电) 周期。请参阅您的数据表以获取确切的数字。
- EEPROM(可在非常精细的字节或字级别擦除)闪存一般为more-robust,可以处理100,000 write/erase 周期。请参阅您的数据表以获取确切的数字。
现在,有了这些知识,您的“书写”真的可以在不先擦除的情况下做任何事情吗?
你真的造成任何伤害吗?如果是第一次写造成的,后面的写会不会造成更大的伤害?
您现在应该拥有了解这些答案的工具。
我不太清楚为什么每次重置都需要写入向量 table。假设引导加载程序的某种方式具有向量间接性,则:
在写入任何形式的闪存之前,memcmp
已经存在的 data/code 以及您要写入的内容。如果相同,则什么都不做。
在不确定是否已先被擦除的情况下写入地址肯定是错误的。通常擦除的闪存具有“全一”0xFF 的值(尽管某些部分使用“全零”作为默认状态,请参见 Why do most of the non-volatile memories have logical 1 as the default state?)。假设 1 是默认状态,写入过程涉及将 1 变为 0,这就是闪光灯。但是也意味着在写的时候,只能写零。这就是为什么多次写入同一个单元格而不擦除它没有意义。
示例:
- 擦除一些 16 位闪存块,我们得到值 0xFFFF。
- 我们写入值 0xF0F0,我们得到 0xF0F0。
- 我们写入值 0xFAFA,我们仍然得到 0xF0F0,因为你不能在不擦除的情况下将 0 变成 1。所以这是一个严重的错误。
还需要注意的是,MCU 制造商指定了整个温度范围内的擦除周期数(以及数据保留),通常是工业温度范围 -40° 至 +85°(或更宽的汽车温度范围) .但是,如果您的产品大部分时间都远离此区间的极端范围,那么它的工作周期将比指定的多得多。