在STM32F4上有两种模拟EEPROM的方法:
第二个选项在这里描述:AN3969.
但遗憾的是,谷歌未能提供有关如何使用第一个选项的信息 - 使用4Kb备份SRAM作为EEPROM?
任何人都可以帮助这个话题吗?
我最近确定需要在微控制器的EEPROM中存储不经常更新的配置变量.立即向程序添加状态会让人担心
广泛的谷歌搜索只发现了一篇文章,通过固件更新保持您的EEPROM数据有效.有没有人使用过该文章中讨论的方法?有更好的替代方法吗?
我正在开发一个Arduino库,它可以最大限度地延长AVR EEPROM的使用寿命.它需要您想要存储的变量数量,其余部分.这是我的尝试,在所有情况下都不起作用.
Atmel表示,每个存储器单元的额定写入/擦除周期为100,000次.他们还提供了一份应用说明,介绍了如何进行磨损均衡.以下是应用笔记的摘要.
通过在两个存储器地址之间交替写入,我们可以将擦除/写入增加到200,000个周期.三个存储器地址为您提供300,000个擦除/写入周期,依此类推.要自动执行此过程,将使用状态缓冲区来跟踪下一次写入的位置.状态缓冲区的长度也必须与参数缓冲区的长度相同,因为也必须对其进行磨损均衡.由于我们无法存储下一个写入的索引,因此我们在状态缓冲区中增加相应的索引.
这是一个例子.
<------------------- EEPROM -------------------->
0 N
-------------------------------------------------
Parameter Buffer | Status Buffer |
-------------------------------------------------
Initial state.
[ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 ]
First write is a 7. The corresponding position
in the status buffer is changed to previous value + 1.
Both buffers are circular.
[ 7 | 0 | 0 | 0 | …
Run Code Online (Sandbox Code Playgroud) 我试图在stm32f0上模拟EEPROM.STM提供了一份应用说明.
在样本中main.c
,
int main(void)
{
/*!< At this stage the microcontroller clock setting is already configured,
this is done through SystemInit() function which is called from startup
file (startup_stm32f0xx.s) before to branch to application main.
To reconfigure the default setting of SystemInit() function, refer to
system_stm32f0xx.c file
*/
/* Unlock the Flash Program Erase controller */
FLASH_Unlock();
/* EEPROM Init */
EE_Init();
/* --- Store successively many values of the three variables in the EEPROM ---*/ …
Run Code Online (Sandbox Code Playgroud) 我在小型嵌入式设备重新设计(PID控制器)中要解决的主要问题是设备参数存储。我在这里部分介绍的旧解决方案节省空间,但在添加新参数时维护起来很笨拙。它基于必须与 EEPROM 地址匹配的设备参数 ID,如下例所示:
// EEPROM variable addresses
#define EE_CRC 0 // EEPROM CRC-16 value
#define EE_PROCESS_BIAS 1 // FLOAT, -100.00 - 100.00 U
#define EE_SETPOINT_VALUE 3 // FLOAT, -9999 - 9999.9
#define EE_SETPOINT_BIAS 5 // CHAR, -100 - 100 U
#define EE_PID_USED 6 // BYTE, 1 - 3
#define EE_OUTPUT_ACTION 7 // LIST, DIRE/OBRNU
#define EE_OUTPUT_TYPE 8 // LIST, GRIJA/MOTOR
#define EE_PROCESS_BIAS2 9 // FLOAT, -100.00 - 100.00 U
#define EE_SETPOINT_VALUE2 11 // FLOAT, -9999 - 9999.9
#define EE_SETPOINT_BIAS2 …
Run Code Online (Sandbox Code Playgroud) 我买了一个I2C EEPROM.我想存储传感器和电压数据.我假设该值可能大于一个字节,并且可能存在大量数据.实现具有小文件分配表的文件系统是否值得这样?例如,这将使我更容易窥视EEPROM.
来自Java Card API 2.2.1的一些引用:
Signature
课程描述:
撕裂或卡重置事件将初始化的Signature对象重置为先前通过调用init()初始化时所处的状态.对于支持与临时密钥数据集,如DES,三重DES,AES,和韩国SEED签名对象密钥成为与用来初始化签名对象的密钥对象相关联的清除事件未初始化密钥的算法.
Signature.init(...)
描述:
为了获得最佳性能,当theKey参数是临时密钥时,实现应尽可能使用瞬态空间进行内部存储.
这是否意味着有些算法需要在每次Signature.init(...)
调用时重写持久性内存?如果是的话,这种不愉快的行为有什么理由吗?
我问这个问题,因为我在applet中遇到了一个奇怪的行为.它计算ECDSA签名.在大约10万个签名后,卡(J2X145 by NXP)似乎坏了(我不能再选择applet了).持续的内存损坏可能是原因,因为我Signature.init(...)
每次收到输入数据时都会调用.这可能Signature.init(...)
是这种行为的原因吗?
我想将一些文本写入 Arduino ESP32 的闪存中。它有点工作,但不是我想要的。
void writeString(const char* toStore, int startAddr) {
int i = 0;
for (; i < LENGTH(toStore); i++) {
EEPROM.write(startAddr + i, toStore[i]);
}
EEPROM.write(startAddr + i, '\0');
EEPROM.commit();
}
Run Code Online (Sandbox Code Playgroud)
我的电话
writeString("TEST_STRING_TO_WRITE", 0);
Run Code Online (Sandbox Code Playgroud)
只将 TEST 写入内存。我不懂为什么。是因为_吗?或者我错过了一些不同的东西?
这是使用的 LENGTH 宏
#define LENGTH(x) (sizeof(x)/sizeof(x[0]))
Run Code Online (Sandbox Code Playgroud)
以及我用来再次从内存中读取字符串的方法(似乎工作正常):
String readStringFromFlash(int startAddr) {
char in[128];
char curIn;
int i = 0;
curIn = EEPROM.read(startAddr);
for (; i < 128; i++) {
curIn = EEPROM.read(startAddr + i);
in[i] = curIn;
}
return String(in);
}
Run Code Online (Sandbox Code Playgroud) 我观看了 Ben Eater 的关于构建基于 6502 芯片的计算机的视频,但我陷入了第 3 部分(汇编语言 VS 机器代码)。他正在对 32k EEPROM 进行编程,并通过汇编进行编程以闪烁 LED。这是他使用的汇编程序http://sun.hasenbraten.de/vasm/ 这是他的代码:
但我有一个关于org
指令的问题,这就是我所理解的 org 告诉汇编器从哪个地址开始的意思?在图片中org
equals$8000
所以我认为第一个地址指令应该是8000
但是当他输出文件时它 equal 0000
。
为什么第一条指令的地址不是8000
?
我尝试通过I2C 读取和写入带有Raspberry Pi B + 的Atmel 24C256 EEPROM,但是我无法正常工作.
这是我到目前为止的代码:
#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <string.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <errno.h>
#include <linux/i2c.h>
#define DEVICE_PATH "/dev/i2c-1"
#define PAGE_SIZE 64
#define DEVICE_ADDR 0x50 // 0b1010xxxx
int file_desc;
char buffer[PAGE_SIZE + 2]; // 64 bytes + 2 for the address
void teardownI2C()
{
int result = close(file_desc);
}
void setupI2C()
{
file_desc = open(DEVICE_PATH, O_RDWR);
if(file_desc < 0)
{
printf("%s\n", strerror(errno));
exit(1); …
Run Code Online (Sandbox Code Playgroud)