我正在ESP32-DevKitC板上开发一个C++应用程序,我可以在其中感应加速度计的加速度。应用程序的目标是存储加速度计数据,直到存储空间已满,然后通过 WiFi 发送所有数据并重新开始。在可能的情况下,micro 也会进入深度睡眠模式。
我目前正在使用 ESP32 NVS 库,它有很好的文档记录并且非常易于使用。该负面的,这是该库使用的闪存,因此很多著作,最终会降低驱动器。
我知道 Espressif 还提供了一些其他存储库(FAT、SPIFFS 等),但据我所知(如果我错了,请纠正我),它们都使用闪存驱动器。
有没有其他可能做我想做的事但不使用闪存?
声明
我正在尝试使用STM32F405的内部闪存来存储一堆用户可设置的字节,这些字节在重新启动后仍然存在.
我正在使用:
uint8_t userConfig[64] __attribute__((at(0x0800C000)));
Run Code Online (Sandbox Code Playgroud)
为我想要存储的数据分配内存.
当程序启动时,我检查第一个字节是否设置为0x42,如果没有,我使用以下方法设置:
HAL_FLASH_Unlock();
HAL_FLASH_Program(TYPEPROGRAM_BYTE, &userConfig[0], 0x42);
HAL_FLASH_Lock();
Run Code Online (Sandbox Code Playgroud)
之后,我检查了价值userConfig[0],我看到0x42......太棒了!
然而,当我点击重置时,再次查看该位置,它0x42不再是......
知道我哪里错了吗?我也尝试过:
#pragma location = 0x0800C00
volatile const uint8_t userConfig[64]
Run Code Online (Sandbox Code Playgroud)
但我得到了相同的结果..
我正在开发一个使用NAND闪存进行存储的嵌入式应用程序.现在看来,我们不会使用Linux或任何其他RTOS.应用程序必须处理意外断电.
我们一直在寻找不同的文件系统解决方案,包括YAFFS2,JFFS2,FAT + FTL以及HCC Embedded的解决方案.
我听说FAT + FTL是一个正常的选择,但我担心在出现意外断电和性能的情况下会丢失数据.如果有人能分享这方面的见解和经验,将不胜感激
我正在尝试使用MTD块设备在NAND闪存上写,但我不明白一切.
我在这里读到
mtdblockN 是只读块设备N.mtdN 是读/写字符设备N.mtdNro 是只读字符设备N.但是我想用writeC中的一个简单的方法直接将字节写入分区,我不明白它是如何工作的(我读过一些我首先必须删除我要写的扇区).
我应该使用哪种设备以及如何在此设备上书写?
我是嵌入式系统编程的新手.我正在使用8051芯片组的设备.我在示例程序中注意到,在定义变量时,有时它们使用关键字xdata.像这样...
static unsigned char xdata PatternSize;
而其他时候省略了xdata关键字.
我的理解是xdata关键字指示编译器将该变量存储在外部闪存中.
在什么情况下我应该使用xdata在外部存储变量?访问这些变量需要更长时间,对吧?使用xdata存储的值在设备硬重置后不会保留吗?
另外,我理解static关键字意味着变量将在每次调用它所定义的函数时持续存在.是否必须一起使用static和xdata?
我试图在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) 我想写一个变量,例如一个数字为5的整数到FLASH,然后在电源消失后再次打开设备读取它.
我已经知道为了写东西我首先需要擦除页面然后写.
在手册中它说:
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY1 = 0x0819 2A3B
- 在Flash选项密钥寄存器(FLASH_OPTKEYR)中写入OPTKEY2 = 0x4C5D 6E7F
我该如何执行此任务?
扇区0的块地址从0x0800 0000到0x0800 3FFF,这是我想写的地方.
这里是手册的链接,第71页:STM32手册
我需要将不同长度的项目存储在闪存芯片中的循环队列中.每个项目都有它的封装,所以我可以弄清楚它有多大以及下一个项目的开始位置.当缓冲区中有足够的项目时,它将换行到开头.
在闪存芯片中存储循环队列的好方法是什么?
我想存储成千上万件物品的可能性.所以从头开始读到缓冲区的末尾并不理想,因为搜索到最后需要时间.
此外,因为它是圆形的,我需要能够区分第一个项目和最后一个项目.
最后一个问题是它存储在闪存中,因此擦除每个块都非常耗时,并且每个块只能执行一定次数.
我通过发出以下命令成功备份了我的SD卡两次
sudo dd if=/dev/sdb of=/home/user/Documents/raspi/images/raspi1.v2.iso bs=1M
Run Code Online (Sandbox Code Playgroud)
但是,现在它给了我以下错误:
dd: reading `/dev/sdb': Input/output error
3027+1 records in
3027+1 records out
3174977536 bytes (3.2 GB) copied, 200.723 s, 15.8 MB/s
Run Code Online (Sandbox Code Playgroud)
环顾网络,这似乎表明SD卡已损坏.但是,我的raspi(我用这张SD卡运行)运行良好(ish)和磁盘工具声称SD卡没有损坏.
有没有其他方法可以找出为什么dd抱怨,如果卡已损坏,如果是,如何修复SD卡.
更新:
我放弃了尝试dd在SD卡上运行,但我确实弄清楚了什么损坏了我的SD卡,这是在本网站上指定的Raspi固件的更新
我想知道“flush”和“flash”是什么意思以及它们之间的区别。