1

我目前正在使用嵌入了 Atmel SAM3X8E 处理器的 Arduino Due 板。我正在使用 Atmel Studio(版本 7.0.1645)和提供的 Atmel 软件框架(版本 3.28.1)对其进行编程。在 SAM 上运行的程序的目的是获得重新编程功能。因此,程序从主机 PC 获取映像,将其逐块闪存到未使用的闪存库中并验证映像。一切正常,但我遇到了与这篇文章相同的问题(Atmel SAM3X 双银行切换不起作用)。

Atmel SAM3X8E 有两个 256 KB 闪存库,Flash0 和 Flash1。我的应用程序很容易安装在 Flash0 中,并将接收到的图像编程到 Flash1。我的想法是使用 SAM3X 的功能从另一个闪存库(默认为 Flash0)启动。SAM3X 的数据表在第 35 页指出,GPNVM 位不仅可用于选择引导存储器(ROM 或闪存),还可用于选择要从哪个库(Flash0 或 Flash1)引导。如果设置了 GPNVM2,则 µC 将从 Flash1 启动。这是通过重新映射内存布局来实现的。因此,如果设置了 GPNVM2,Flash1 将映射到地址 0x0008_0000(而 Flash1 和 Flash0 是连续的)。如果 GPNVM2 被清除,Flash0 映射到地址 0x0008_0000(现在 Flash0 和 Flash1 是连续的)。

我所做的是在重置处理器之前操作 GPNVM2 位,但它不起作用(内存未正确重新映射)。我也在玩 Atmel Studio 的选项。Atmel Studio 可以使用“项目选项”->“工具”->“程序设置”将应用程序编程到 Bank0 或 Bank1。我试图用这些设置将我的应用程序编程到 Bank1。只有勾选了“Override Vector Table Offset Register (exception_table)”复选框并且使用“Start Debugging”对器件进行了编程,才可能。如果使用“Start without Debugging”对设备进行编程,它根本不会启动,要让它启动(请记住应用程序已闪存到 Bank1,如果重新映射成功,Bank1 应该位于最初 Bank0 映射到的地址 0x0008_0000)我必须手动更改 GPNVM 位(使用“工具”->“设备编程”工具)以“从 bank0 启动”。然后它起作用了。

所描述的行为告诉我,我一定错过了操作一些寄存器。显然,“Override Vector Table Offset Register (exception_table)”很重要,因此我还将“Vector Offset Table Register (VTOR)”设置为 Flash1 的起始地址,但这也无济于事。我有一种感觉,我错过了一些我必须调用/操作的功能或注册。

要重新编程处理器,通常需要运行某种引导加载程序,我希望避免使用存储库切换机制。有没有人有关于使用 ASF 功能进行这种银行切换的经验,或者关于在 SAM3X 上进行银行切换的一般经验?

先感谢您!

4

0 回答 0