在FLASH中固定位置存入数据

本文介绍在STM32开发中如何将常量数组存储于特定Flash区域的三种方法,包括使用CARM编译器的关键字__at()进行直接定位、利用RV编译器的scatter文件实现绝对定位等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法二:先在程序中定义一个const 类型的常量数组,并指定其存储位置(方便找到写入、读取位置),这样编译器就会分配你指定的空间将常量数组存入FLASH中。当你做擦除。读写操作时,只要在这个常量数组所在的地址范围就好。

  const uint8_t table[10] __at(0x08010000) {0x55} ;
  MDK3.03A开始就支持关键字 __at() 
  需要加#include 

方法三:在程序中定义一个const 类型的常量数组,无需指定其存储位置。只要定义一个32位的变量存储这个数组的FLASH区地址就行。

  uint32_t address;//STM32的地址是32位的
  const uint8_t imageBuffer[1024] {0,1,2,3,4,5,6,7};

  address (uint32_t) imageBuffer;




方法二只能用在CARM编译器上,目前KEIL默认不支持。 RV下可以用以下方法来支持:

RV下绝对定位可以利用scatter做到
以RV的hello例子烧录0x1fc的0x87654321加密位为例
首先在hello.c中加入
const int    encrypt __attribute__((section("encrypt")))= 0x87654320;
其次修改scatter file
UV3会自动产生一个scatter file,默认位于 你的工程目录\ojb\你的工程名字.sct
可以在这个文件的基础上修改:
原来的hello.sct的内容

LR_IROM1 0x00000000 0x00040000  {  ; load region
  ER_IROM1 0x00000000  {       ; load address = execution address
   *.o (RESET, +First)
   * (+RO)
  }
  RW_IRAM1 0x40000000 0x00004000  {  ; RW data
   * (+RW +ZI)
  }
}
另存为hello1.sct,并修改为:
LR_IROM1 0x00000000 0x00040000  {  ; load region
  ER_IROM1 0x00000000  {       ; load address = execution address
   *.o (RESET, +First)
   }
   ER_IROM2 0x000001fc FIXED
   {
    *.o (encrypt)
   }
   ER_IROM3 0x200 FIXED
   {
   * (+RO)
  }
  RW_IRAM1 0x40000000 0x00004000  {  ; RW data
   * (+RW +ZI)
  }
}
然后,修改设置
http://bbs.21ic.com/upfiles/img/2006724114655201.jpg

在STM32单片机中,将多个数据写入Flash通常涉及以下几个步骤: 1. **初始化**: 首先,需要通过HAL库中的函数如`HAL_FLASHEx_ForceWrite`或`HAL_FLASH_Unlock`对Flash解锁并设置相应的操作模式。 2. **创建缓冲区**: 创建一个连续的内存区域用于存储要写入数据,每个数据项应按照Flash的字节地址对齐。 3. **分块写入**: STM32 Flash一般按块进行操作,每个数据块大小通常是固定的(例如4KB)。你需要计算好每个数据元素所在的字节数,并多次调用`HAL_FLASH_Program`函数,一次写入一块数据。确保每次写入后更新写入位置。 ```c uint8_t *data = ...; // 数据开始地址 for (int i = 0; i < num_data_elements; i++) { size_t offset = i * data_element_size; HAL_FLASH_Program(FLASH_TYPEPROGRAM.responseText, offset, data + offset); } ``` 4. **数据校验**: 如果有条件,可以在写入后对数据进行校验,例如使用CRC校验码。 5. **刷新**: 写入所有数据后,别忘了调用`HAL_FLASH_Erase Sector`或`HAL_FLASH_Flush`来清除写入缓存,并最后调用`HAL_FLASH_SuspendOperation`来确保数据安全地保存到Flash中。 6. **读取**: 要读取数据,同样使用Flash API,例如`HAL_FLASH_Read`或`HAL_FLASHEx_Read`,按照相同的地址顺序逐块读取数据。 注意:这个过程可能需要多次循环,因为它依赖于Flash的具体结构和操作特性。另外,在实际应用中,记得处理可能出现的错误和异常情况。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值