完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想在STM32F103上定义一个不是常量的查找表,就是
一个闪存页面在正常操作中显示, 但每隔一段时间我希望能够擦除该表并将一个新表写入闪存页面。我知道如何使用HAL函数在我的程序中执行我需要的操作,但我需要在链接器文件中声明这个内存块并且我在查找示例时遇到了很多麻烦。CubeMX的默认mem.ld如下所示:
看起来我需要一个输出部分块之后,我提交一个关键字> FLASH但我不知道将是什么关键字或如何在代码中声明表以给它正确的地址。 我已经看过模拟的EEPROM应用笔记,但对于内存来说,似乎需要额外的大量开销才能看到足够的擦除/写入周期来关注内存的生命周期。有人知道要怎么做吗?
|
|
相关推荐
10个回答
|
|
链接器没有任何理由可以参与,在某些时候你需要指定表的位置,闪存的擦除块。可以假设你只想更新该表而不是整个二进制文件,所以希望该表是一个单独的二进制文件。可以在链接器脚本中对该地址进行硬编码,但在代码中的某处可能很容易创建#define
|
|
|
|
注意:链接不是C语言标准的一部分,因此每个编译器都以不同方式实现链接器文件。你使用的是GCC,因此我分享一些适用于它的代码。
(1)创建一个给定位置和大小的名为FIXED_DATA的区域。请注意,我的代码来自不同的设备。检查你的数据表确实看到块的大小(它们在设备内的大小可能不同!)。确保相应地减小FLASH的大小,否则你将收到有关它们不适合内存的错误。 (2)创建一个名为FIXED_DATA的部分。它实际上不必被称为FIXED_DATA,但它有助于跟踪。属性NOLOAD告诉链接器不填充区域(见下文)。 (3)将所有标记为STATIC DATA的变量放入该存储器部分 (4)将此部分中的所有内容放入我们上面创建的名为FIXED_DATA的区域 在C文件中,你只需要标记要放入该区域的变量。我建议将它们称为const,因为通常不想直接写入闪存。Volatile有助于编译器优化,假设const数据永远不会改变。 为什么要经历所有这些麻烦,而不是在其他答案中使用更简单的解决方案?因为它可以升级。如果将来要进行FW更新,你可能希望将存储的数据保留在内存中。链接器文件中的NOLOAD指令就是这样:链接器不会用0填充数据,因为如果你有一个全局变量通常会这样做。 |
|
|
|
在我看来,楼上是正确的方法,很好的答案
|
|
|
|
非常感谢3楼,最近盯着一堆链接器文件的一个问题,应该有某种形式。= ALIGN(4); 声明STATIC_DATA属性后的语句,或者是数据类型隐含的语句。
|
|
|
|
我认为你不能错误地对齐数据,最小的数据类型是8位,编译器将填充插入结构和位域以确保正确对齐。如果你确实需要对齐一些更大的大小(例如16个字节),我建议你也在链接器文件中进行。那么,当你向该部分添加新变量时可以保证对齐。
|
|
|
|
关于挥发性的好点。在STM32的情况下,遗憾的是小页面(如果是非均匀的)位于闪存的开头,因此将中断向量与.text分开可能很有用。也就是说,它更加独立于闪存大小,例如,如果你在原型设计阶段选择较小的MCU
|
|
|
|
是的,你的表有一个部分是最干净的。
但最简单的方法是按页面大小减少FLASH部分,然后: int *table = (int *) (0x0800000 +0x20000 - PAGE_SIZE) |
|
|
|
如果你有闪存备用,你可以声明一个全局const变量的两倍大小的flash页面,并将其起始地址四舍五入到flash页面大小的倍数。有点浪费,但不需要做linkerscript魔术。
|
|
|
|
这并不复杂,基本上你需要的是一个常量全局变量,它将放在flash中并使用pragma定义位置。
在C ++中,标题可能如下所示:
这就是实现的样子:
要在闪存中写入该页面,您需要一个具有相同大小的闪存页面的缓冲区(在RAM或闪存中),因为您必须在再次写入之前擦除页面,因此单个值的更改是不可能。 根据您使用它的准确程度,您可能需要将结构声明为volatile。特别是如果直接访问表(而不是像这种情况下的指针),就会发生这种情况。 有些编译器以这种方式优化代码,它们将常量从表中直接带入代码中。结果是,如果更改表中的值,则不会在代码中考虑该值。 IAR编译器遇到了一些麻烦(在当前版本中已修复)处理一个,static volatile const所以我切换到使用指针。 |
|
|
|
如果要更改值,则需要某种闪存算法。
写入flash总是包括: 备份页面内容 使用更改的值更新备份 删除页面 写页面 为安全起见:将书面页面与备份进行比较 高级注意事项:在某些情况下,你可以利用它可以将零写入一个位置,因此可以将0x7F更改为0x3F,但不能反过来。在这种情况下,不需要进行页面擦除。有些控制器可能不支持这一点。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32串口接受中断使用C++STL中的queue导致所有中断失效
3507 浏览 1 评论
2717 浏览 0 评论
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1289 浏览 0 评论
3571 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
3375 浏览 4 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-2 17:52 , Processed in 0.821494 second(s), Total 88, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号