我找不到一种方法来确定哪个 ubi 设备连接到哪个 mtd 设备。例如,ubi0 可以连接到 mtd1,ubi1 可以连接到 mtd0。
有谁知道一种方法来找出哪个与哪个相连?
我使用的是 stm32f40x 微控制器 (UC),我必须使用其内部闪存来存储一些数据。写操作,如你所知,非常慢,占用UC很长时间。所以我想到了 DMA,这里是问题:
是否可以使用DMA将数据从SRAM传输到FLASH?
感谢您的时间。
我有一个项目,其中ATtiny2313V正在控制7x5 LED矩阵以显示滚动文本.为了显示文本,我构建了一个字体,该字体与程序的其余部分一起存储在闪存中.
整个程序,包括整个字体,占用1106个字节.但是当我把它加载到芯片中时,它似乎没有运行; 相反,它只是点亮了几个LED,就是这样.
但是,当我删除大部分字体,并仅使用字母A到J进行编译时,程序的大小为878字节,运行正常.
这是因为AVR闪存的某种溢出?
ATtiny2313V的数据表显示它有2KB的闪存!1106字节怎么样太多了?
更新:为了清楚起见,我使用的工具链是AVR Studio(编译代码)然后AVRDude将其上传到微控制器.据我所知,AVR Studio使用avr-gcc版本来编译代码.
我有一个ARM处理器,能够与外部闪存芯片连接.写入芯片的是为ARM架构编译的程序,可以执行.我需要知道的是将外部闪存中的数据传输到ARM处理器上以便执行.
我可以提前运行某种复制例程,将数据复制到可执行存储空间吗?我想我可以,但ARM处理器正在运行一个操作系统,我没有足够的空间在闪存中使用.我还希望能够一次安排两个甚至三个程序的执行,并且一次将多个程序复制到内部闪存是不可行的.操作系统可以用于在可访问的内存空间内启动程序,因此任何需要事先完成的操作都可以.
我正在尝试通过 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 的数字。
也许这是一个愚蠢的问题,但如果你能给我一个线索,我真的很感激。
我正在编程stm32l412kb,我将在某一时刻将数据写入闪存(从UART)。从stm32l41xx 参考手册中,我了解了在写入内存之前如何清除内存的步骤,但是在第84页上有一个步骤,我不知道在写入实际数据时该怎么做。那一步是
在所需的存储器地址执行数据写入操作
它提到什么数据写入操作?我看不到内存地址到任何寄存器,所以我假设它要使用指针?我将如何去做呢?
非常感谢您的帮助,非常感谢,
哈里
我正在尝试为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) 我的覆盆子pi为零,在开发过程中我花了很多时间弹出SD卡并重新闪存.SD卡映像是在Buildroot中准备的,因此它包括带内核的引导分区,设备树覆盖和rootfs分区.是否有更简单的方法重新刷SD卡?例如通过网络?我知道U-boot可以通过tftp加载内核,但是如果我不仅需要内核,而是整个图像(设备树覆盖非常重要)?
我试图在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页):
- 通过检查闪存状态寄存器(FLASH_SR)中的BSY位,检查没有闪存主存储器操作正在进行.
- 由于之前的编程,检查并清除所有错误编程标志.如果没有,则设置PGSERR.
- 将Flash控制寄存器(FLASH_CR)中的PG位置1.
- 在所需的存储器地址,主存储器块或OTP区域内执行数据写操作.只能编程双字. - 在与双字对齐的地址中写入第一个字 - 写第二个字
- 等到FLASH_SR寄存器中的BSY位清零.
- 检查FLASH_SR寄存器中是否设置了EOP标志(表示编程操作已成功),并通过软件将其清除.
- 如果不再有编程请求,则清零FLASH_SR寄存器中的PG位.
我一直无法理解第3步中的PG位是什么.但是当我尝试设置它时,不允许写入. …
我使用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)
请指导我覆盖同一地址中的新数据/特定地址的擦除选项