Atmel SAM3X双组切换无法正常工作

时间:2017-11-02 14:54:57

标签: arm atmel atsam3x

我目前正在使用具有双存储2 x 256KB闪存的Atmel SAM3X8 ARM微控制器。我尝试实现固件更新功能,将新固件放入当前未使用的闪存库中,完成后使用闪存重映射交换存储区以运行新固件。

数据表声明这样做我需要设置GPNVM2位,然后MCU会重新映射内存,因此Flash 1现在为0x80000,Flash 0为0xC0000。这也将导致MCU从Flash 1开始执行代码。

引用数据表:

  

GPNVM2仅用于交换Flash 0和Flash 1.如果GPNVM2是ENABLE,则Flash 1映射到   地址0x0008_0000(Flash 1和Flash 0连续)。如果GPNVM2处于DISABLE状态,则Flash 0将映射到   地址0x0008_0000(Flash 0和Flash 1连续)。

     

[...]

     

GPNVM2可以选择是否使用Flash 0或Flash 1进行引导。   设置GPNVM的第2位选择从Flash 1启动,清除它选择从Flash 0启动。

但是当我使用 flash_set_gpnvm(2)(ASF SAM Flash Service API)通过SAM-BA或我自己的固件设置GPNVM2时,它仍将从Flash 0中的程序启动,并且新程序仍将驻留在Flash 1的偏移量0xC0000。已经通过 flash_is_gpnvm_set(2)

验证了GPNVM2的状态

将固件本身闪存到Flash1银行可以完美运行,已经通过使用SAM-BA转储整个闪存进行了验证。

Atmel有一个关于问题的勘误表,闪存重映射仅适用于小于64KB的部分。我的代码少于(40KB),所以这不应该是一个问题。

我没有找到任何其他人有这个问题,也没有任何例子如何使用它,所以也许有人可以告诉我,我在这里做错了什么,或者还有什么要检查。

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题(请参阅此处:Atmel SAM3X8E dual bank switching for booting different behaviour)。

经过一些研究后,我发现了一个应用笔记(链接:http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42141-SAM-AT02333-Safe-and-Secure-Bootloader-Implementation-for-SAM3-4_Application-Note.pdf),它以更清晰的方式解释了SAM3X的启动行为。问题是数据表有点误导(至少我也很困惑)。 SAM3X无法重新映射Flash库。引导行为有点不同(请参阅链接中的图片,它是从应用说明中删除的,第33/34页): Booting behaviour SAM3X

图3-9显示了SAM3X在启动时的行为。 GPNVM位1和2仅确定将哪个存储器部分(ROM / Flash0 / Flash1)镜像到引导存储器(位于0x00000000)。 不会更改Flash库的映射。因此,Flash0仍然映射到0x00080000,Flash1映射到0x000C0000)。

正如应用笔记所述,其他一些Atmel微控制器能够真正重新映射闪存存储区(例如SAM3SD8和SAM4SD32 / 16)。这些处理器会改变闪存库的位置,如图3-10所示。

为了能够更新固件,因此需要实现某种类型的引导加载程序。我自己实现了一个,即使不使用GPNVM位也可以更新我的固件。我还在Microchip上打开了一张支持票,以澄清启动行为。当我收到答复时,我希望能告诉你更多。

编辑:

以下是Microchip支持部门的答案:

  

在SAM3X中设置GPNVM2位只会使CPU“跳转到”或从闪存库1开始,即0xC0000。   不会发生实际的内存地址交换。

     

要使用闪存库1,您需要更改链接器文件(flash.ld)以反映闪存起始地址0xC0000。

     

对于闪存银行0应用程序,更改:   rom(rx):ORIGIN = 0x00080000,LENGTH = 0x00080000 / * Flash,512K /   至:   rom(rx):ORIGIN = 0x00080000,LENGTH = 0x00040000 / Flash,256K * /

     

对于闪存银行1应用程序,更改:   rom(rx):ORIGIN = 0x00080000,LENGTH = 0x00080000 / * Flash,512K /   至:   rom(rx):ORIGIN = 0x000C0000,LENGTH = 0x00040000 / Flash,256K * /

     

如果不这样做,flash 1应用程序中的重置处理程序将指向flash 0应用程序中的地址。   因此,虽然代码将在flash 1中开始执行(如果设置了GPNVM2),它将跳回到flash 0应用程序。   说明64kb限制的勘误表可以忽略不计。

因此,应用说明是正确的,并且不会对mmory映射进行实际更改。

干杯 卢卡斯