标签: flash-memory

如何找出哪个 mtd 设备连接到哪个 ubi 卷

我找不到一种方法来确定哪个 ubi 设备连接到哪个 mtd 设备。例如,ubi0 可以连接到 mtd1,ubi1 可以连接到 mtd0。

有谁知道一种方法来找出哪个与哪个相连?

linux flash-memory ubifs

4
推荐指数
1
解决办法
1858
查看次数

STM32 的 DMA 到闪存

我使用的是 stm32f40x 微控制器 (UC),我必须使用其内部闪存来存储一些数据。写操作,如你所知,非常慢,占用UC很长时间。所以我想到了 DMA,这里是问题:

是否可以使用DMA将数据从SRAM传输到FLASH?

感谢您的时间。

c embedded flash-memory dma stm32f4

4
推荐指数
2
解决办法
2908
查看次数

我用一个太大的程序溢出AVR的闪存吗?

我有一个项目,其中ATtiny2313V正在控制7x5 LED矩阵以显示滚动文本.为了显示文本,我构建了一个字体,该字体与程序的其余部分一起存储在闪存中.

整个程序,包括整个字体,占用1106个字节.但是当我把它加载到芯片中时,它似乎没有运行; 相反,它只是点亮了几个LED,就是这样.

但是,当我删除大部分字体,并仅使用字母A到J进行编译时,程序的大小为878字节,运行正常.

这是因为AVR闪存的某种溢出?

ATtiny2313V的数据表显示它有2KB的闪存!1106字节怎么样太多了?

更新:为了清楚起见,我使用的工具链是AVR Studio(编译代码)然后AVRDude将其上传到微控制器.据我所知,AVR Studio使用avr-gcc版本来编译代码.

avr flash-memory

3
推荐指数
1
解决办法
5636
查看次数

在ARM处理器上执行存储在外部SPI闪存中的程序

我有一个ARM处理器,能够与外部闪存芯片连接.写入芯片的是为ARM架构编译的程序,可以执行.我需要知道的是将外部闪存中的数据传输到ARM处理器上以便执行.

我可以提前运行某种复制例程,将数据复制到可执行存储空间吗?我想我可以,但ARM处理器正在运行一个操作系统,我没有足够的空间在闪存中使用.我还希望能够一次安排两个甚至三个程序的执行,并且一次将多个程序复制到内部闪存是不可行的.操作系统可以用于在可访问的内存空间内启动程序,因此任何需要事先完成的操作都可以.

c arm spi execution flash-memory

2
推荐指数
1
解决办法
5411
查看次数

如何在STM32F4探索板的Flash存储器中写入浮点数据

我正在尝试通过 VCP 接收浮点数并将其写入 STM32F4 发现板的闪存中,使用 Keil IDE。用于写入 Flash 存储器的函数:

FLASH_Status FLASH_ProgramDoubleWord(uint32_t Address, uint64_t Data);
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data);
FLASH_Status FLASH_ProgramByte(uint32_t Address, uint8_t Data);
Run Code Online (Sandbox Code Playgroud)

接受一个无符号整数值作为数据输入,但我已经设法使用以下代码在闪存中写入一个有符号整数:

int dataflash1 = -1000;
int gain;
uint32_t Address= 0x08008000;
.......
FLASH_ProgramWord(Address,dataflash1);
.......
gain=*(int*)Address;
Run Code Online (Sandbox Code Playgroud)

不过,我仍然没有设法写入浮点数据。如果我将“int”更改为“float”(它们都应该是 4 个字节的数据,在 keil 编译器指南中说)我会得到类似 1.7345673 e-42 的数字。

也许这是一个愚蠢的问题,但如果你能给我一个线索,我真的很感激。

floating-point flash-memory stm32f4discovery

2
推荐指数
1
解决办法
4935
查看次数

了解STM32参考手册中的Flash写入过程

我正在编程stm32l412kb,我将在某一时刻将数据写入闪存(从UART)。从stm32l41xx 参考手册中,我了解了在写入内存之前如何清除内存的步骤,但是在第84页上有一个步骤,我不知道在写入实际数据时该怎么做。那一步是

在所需的存储器地址执行数据写入操作

它提到什么数据写入操作?我看不到内存地址到任何寄存器,所以我假设它要使用指针?我将如何去做呢?

非常感谢您的帮助,非常感谢,

哈里

c read-write stm32 flash-memory

2
推荐指数
1
解决办法
190
查看次数

将全局声明的缓冲区写入FLASH时出现STM32 Hardfault异常

我正在尝试为STM32F030x8编写一个bootloader应用程序.我通过UART将bin文件写入控制器.当UART RDR寄存器中存在数据时,我将其放入全局声明的1Kb缓冲区中.每次缓冲区已满,我都会尝试将其写入FLASH.写入FLASH后,应用程序向PC软件发出确认,并准备接受新的1Kb块.因此,在写入FLASH时,不会写入缓冲区.当我尝试将全局缓冲区写入FLASH时,应用程序进入Hardfault处理程序.

但是当我使用memcpy()将缓冲区复制到1Kb的本地声明的缓冲区中,并尝试将该缓冲区写入FLASH时,它没有任何问题.

为什么我不能只将全局声明的缓冲区写入FLASH?当本地声明的缓冲区写入FLASH时为什么没有问题?

提前致谢!

编辑:

uint32_t FLASH_If_Write(__IO uint32_t* FlashAddress, uint32_t* Data ,uint16_t DataLength)
{
  uint32_t i = 0;

  for (i = 0; (i < DataLength) && (*FlashAddress <= (USER_FLASH_END_ADDRESS-4)); i++)
  {
    /* the operation will be done by word */ 
    if (FLASH_Program(FLASH_TYPEPROGRAM_WORD, *FlashAddress, *(uint32_t*)(Data+i)) == 1)
    {
     /* Check the written value */
      if (*(uint32_t*)*FlashAddress != *(uint32_t*)(Data+i))
      {
        /* Flash content doesn't match SRAM content */
        return(2);
      }
      /* Increment FLASH destination address */
      *FlashAddress += 4;
    }
    else …
Run Code Online (Sandbox Code Playgroud)

c stm32 flash-memory bootloader stm32f0

1
推荐指数
1
解决办法
2217
查看次数

使用U-boot闪存SD卡图像

我的覆盆子pi为零,在开发过程中我花了很多时间弹出SD卡并重新闪存.SD卡映像是在Buildroot中准备的,因此它包括带内核的引导分区,设备树覆盖和rootfs分区.是否有更简单的方法重新刷SD卡?例如通过网络?我知道U-boot可以通过tftp加载内核,但是如果我不仅需要内核,而是整个图像(设备树覆盖非常重要)?

boot flash-memory embedded-linux buildroot u-boot

1
推荐指数
1
解决办法
655
查看次数

在STM32的OTP中写入64位数据

我试图在STM32L4芯片的内存闪存中写入数据.这是在编程上下文中完成的,其中我使用C调用ST-Link实用程序命令行.

这是一个闪存的例子:

               0             4             8             C
0x1FFF7000  FFFFFFFF     FFFFFFFF       FFFFFFFF       FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经能够在64位数据空间上只写32 :

               0             4             8             C
0x1FFF7000  AAAAAAAF     FFFFFFFF       BBBCCCDD       FFFFFFFF
Run Code Online (Sandbox Code Playgroud)

在前32位写入时,第二个32位被锁定.因此,如果内存处于先前状态,则不允许以下写入:

               0             4             8             C
0x1FFF7000  AAAAAAAF     00000001       BBBCCCDD       FFFFFFFF
                            ^^                            ^^
                         Not allowed                     Locked
Run Code Online (Sandbox Code Playgroud)

我只能在64位数据空间中写入大小受32位限制的数据.我发现这非常奇怪,因为没有理由以这种方式处理内存.

编辑:这是真的,因为我想在OTP中写,当我在别处写的时候,它似乎正常工作

第一种可能的方案

我对上一个问题的回答引用了这个:

级别2:无调试
在此级别中,保证级别1得到保证.此外,Cortex®-M4调试端口,从RAM启动(启动RAM模式)和从系统存储器启动(启动加载器模式)不再可用.在用户执行模式(引导闪存模式)下,Flash主存储器上允许所有操作....... 根本无法删除
2级:这是不可逆转的操作.

有没有办法让启用级别2允许我在64位内存空间上写两次32位?

第二种可行方案

查看芯片的文档,我找到了闪存编程序列(第102页):

  1. 通过检查闪存状态寄存器(FLASH_SR)中的BSY位,检查没有闪存主存储器操作正在进行.
  2. 由于之前的编程,检查并清除所有错误编程标志.如果没有,则设置PGSERR.
  3. 将Flash控制寄存器(FLASH_CR)中的PG位置1.
  4. 在所需的存储器地址,主存储器块或OTP区域内执行数据写操作.只能编程双字. - 在与双字对齐的地址中写入第一个字 - 写第二个字
  5. 等到FLASH_SR寄存器中的BSY位清零.
  6. 检查FLASH_SR寄存器中是否设置了EOP标志(表示编程操作已成功),并通过软件将其清除.
  7. 如果不再有编程请求,则清零FLASH_SR寄存器中的PG位.

我一直无法理解第3步中的PG位是什么.但是当我尝试设置它时,不允许写入. …

embedded stm32 cpu-registers flash-memory

1
推荐指数
1
解决办法
1782
查看次数

如何擦除和覆盖 Spi EEPROM 中的数据

我使用WinBond W25Q64JV SPI Flash芯片来存储数据,微控制器是STM32F101RCT6。当我尝试将数据存储在华邦芯片中时,它工作正常,我可以在华邦芯片中读取和写入数据,但如果我想覆盖同一地址中的新数据,它不会被覆盖,并且会提供旧数据新数据未写入同一内​​存中。如果我使用擦除选项,则会擦除所有地址位置中的所有数据,我无法擦除特定地址数据。删除所有地址数据后,我可以写入新数据,但我正在丢失所有其他位置的数据,因此请指导我覆盖同一地址位置中的新数据/特定地址的擦除选项,我的代码如下

     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
     HAL_Delay(1000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
     Spi_data[0]=0x06;  //Write Enable
     HAL_SPI_Transmit(&hspi2,Spi_data,1,1000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET); 
     Spi_data[0]=0x02; //Page Program
     Spi_data[1]=0x00;
     Spi_data[2]=0x10;
     Spi_data[3]=0x14;
     Spi_data[4]=0x43;
     HAL_SPI_Transmit(&hspi2,Spi_data,5,10000);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);

     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
     Spi_data[0]=0x03;//Read Data
     Spi_data[1]=0x00;
     Spi_data[2]=0x10;
     Spi_data[3]=0x14;
     HAL_SPI_Transmit(&hspi2,Spi_data,4,100);
     HAL_SPI_Receive(&hspi2,GSdata,4,100);
     HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)

当我尝试覆盖 0x1014 位置中的新数据时,如果我使用以下擦除选项,它不会被覆盖,它会擦除​​所有内存地址数据

   HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_RESET);
   Spi_data[0]=0x20;//Erase
   Spi_data[1]=0x00;
   Spi_data[2]=0x10;
   Spi_data[3]=0x14;
   HAL_SPI_Transmit(&hspi2,Spi_data,4,1000);
   HAL_GPIO_WritePin(CHIP_SELECT_GPIO_Port, CHIP_SELECT_Pin, GPIO_PIN_SET);
Run Code Online (Sandbox Code Playgroud)

请指导我覆盖同一地址中的新数据/特定地址的擦除选项

microcontroller spi stm32 flash-memory eeprom

1
推荐指数
1
解决办法
2745
查看次数