我目前正在使用嵌入了Atmel SAM3X8E处理器的Arduino Due板。我正在使用Atmel Studio(版本7.0.1645)和提供的Atmel软件框架(版本3.28.1)对其进行编程。 在SAM上运行的程序的目的是获得重新编程功能。因此,程序从主机PC获取图像,在未使用的闪存库中逐块闪烁并验证图像。一切正常,但我遇到了与这篇文章(Atmel SAM3X dual bank switching not working)相同的问题。
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。只有选中“覆盖矢量表偏移寄存器(exception_table)”复选框并且使用“启动调试”对器件进行编程时,才有可能。如果设备使用“无需调试启动”进行编程,则根本无法启动,以使其启动(请记住应用程序闪存到Bank1,如果重映射成功,则Bank1应位于地址0x0008_0000,其中Bank0最初映射到我必须手动更改GPNVM位(使用“工具” - >“设备编程”工具)来“从bank0启动”。然后它奏效了。
所描述的行为告诉我,我一定错过了操纵一些寄存器。显然,“覆盖向量表偏移寄存器(exception_table)”非常重要,因此我还将“向量偏移表寄存器(VTOR)”设置为Flash1的起始地址,这也没有任何帮助。我感觉我缺少一些函数或注册我必须调用/操作。
要重新编程处理器,通常需要运行某种引导程序,我希望避免使用银行交换机制。有没有人对使用ASF功能的银行转换有任何经验,或者一般有关SAM3X银行转换的经验?
提前谢谢!