我目前正在使用 Atmel SAM3X8 ARM 微控制器,该微控制器具有双组 2 x 256KB 闪存。我正在尝试实现固件更新功能,将新固件放入当前未使用的闪存库中,完成后使用闪存重新映射交换库以运行新固件。
数据表指出,为此我需要设置 GPNVM2 位,然后 MCU 将重新映射内存,因此闪存 1 现在位于 0x80000,闪存 0 位于 0xC0000。这也会导致MCU从Flash 1开始执行代码。
引用数据表:
GPNVM2 仅用于交换闪存 0 和闪存 1。如果 GPNVM2 为 ENABLE,则闪存 1 映射在
地址0x0008_0000(Flash 1和Flash 0是连续的)。如果 GPNVM2 为 DISABLE,则 Flash 0 被映射到
地址0x0008_0000(Flash 0和Flash 1是连续的)。
[...]
GPNVM2 可以选择使用闪存 0 还是闪存 1 进行引导。
设置 GPNVM 位 2 选择从闪存 1 启动,清除它选择从闪存 0 启动。
但是当我通过 SAM-BA 或我自己的固件设置 GPNVM2 时flash_set_gpnvm(2)(ASF SAM Flash Service API),它仍然会从 Flash 0 中的程序启动,并且新程序仍驻留在 Flash 1 的偏移量 0xC0000 处。 GPNVM2 的状态已被验证flash_is_gpnvm_set(2)
将固件本身刷新到 Flash1 组可以完美地工作,这已经通过使用 SAM-BA 转储整个闪存来验证。
Atmel 有一个关于闪存重新映射仅适用于小于 64KB 的部分的勘误表。我的代码小于该值 (40KB),所以这不应该成为问题。
我没有发现任何其他人遇到这个问题,也没有任何如何使用它的示例,所以也许有人可以告诉我我在这里是否做错了什么,或者还有什么需要检查的。
我遇到了同样的问题(请参阅此处:Atmel SAM3X8E 双组切换用于启动不同的行为).
经过更多研究后,我找到了一份应用说明(链接:http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42141-SAM-AT02333-Safe-and-Secure-Bootloader-Implementation-for-SAM3-4_Application-Note.pdf)这更清楚地解释了 SAM3X 的启动行为。问题是数据表有点误导(至少我也很困惑)。 SAM3X 无法重新映射闪存组。启动行为有点不同(请参阅链接中的图片,它是从应用说明第 33/34 页中摘录的):引导行为 SAM3X
图 3-9 显示了 SAM3X 在启动时的行为。 GPNVM 位 1 和 2 只是确定哪个内存部分 (ROM/Flash0/Flash1) 被镜像到引导内存(位于 0x00000000)。闪存组的映射未更改。因此,Flash0 仍然映射到 0x00080000,Flash1 仍然映射到 0x000C0000)。
正如应用说明所述,其他一些 Atmel 微控制器能够真正重新映射闪存组(例如 SAM3SD8 和 SAM4SD32/16)。这些处理器改变了闪存组的位置,如图 3-10 所示。
因此,为了能够更新固件,有必要实现某种引导加载程序。我自己实现了一个,即使根本不使用 GPNVM 位也能够更新我的固件。我还在 Microchip 开了一张支持票来澄清启动行为。当我收到答复时,我希望能告诉你更多信息。
EDIT:
以下是 Microchip 支持人员的答复:
设置 SAM3X 中的 GPNVM2 位只会使 CPU“跳转”或从闪存组 1(即 0xC0000)启动。
不会发生实际的内存地址交换。
要使用闪存组 1,您需要更改链接器文件 (flash.ld) 以反映闪存起始地址 0xC0000。
对于闪存库 0 应用程序,更改:
ROM (rx) : 原点 = 0x00080000,长度 = 0x00080000 /* 闪存,512K/
到:
ROM(接收):原点 = 0x00080000,长度 = 0x00040000 /闪存,256K */
对于闪存库 1 应用程序,更改:
ROM (rx) : 原点 = 0x00080000,长度 = 0x00080000 /* 闪存,512K/
到:
ROM(接收):原点 = 0x000C0000,长度 = 0x00040000 /闪存,256K */
如果不这样做,闪存 1 应用程序中的复位处理程序将指向闪存 0 应用程序中的地址。
因此,虽然代码将在闪存 1 中开始执行(如果设置了 GPNVM2),但它会跳回到闪存 0 应用程序。
可以忽略指出 64kb 限制的勘误表。
因此,应用笔记是正确的,并且没有执行内存映射的实际更改。
干杯
卢卡斯
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)