我目前正在使用 Arduino Due 板,该板嵌入了 Atmel SAM3X8E 处理器。我使用 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 的这些设置对我的应用程序进行编程。仅当选中“覆盖向量表偏移寄存器 (exception_table)”复选框并且使用“开始调试”对器件进行编程时,才有可能实现这一点。如果设备使用“启动而不调试”进行编程,则它根本不会启动,要启动它(请记住应用程序已闪存到 Bank1,如果重新映射成功,Bank1 应位于地址 0x0008_0000,其中最初 Bank0 映射到)我必须手动更改 GPNVM 位(使用“工具”->“设备编程”工具)以“从 Bank0 启动”。然后就成功了。
所描述的行为告诉我,我一定错过了对某些寄存器的操作。显然“覆盖向量表偏移寄存器(exception_table)”很重要,因此我还将“向量偏移表寄存器(VTOR)”设置为Flash1的起始地址,但这也没有帮助。我感觉我缺少一些必须调用/操作的函数或寄存器。
要重新编程处理器,通常需要运行某种引导加载程序,我希望避免使用存储体切换机制。有人对使用 ASF 功能进行组切换或在 SAM3X 上进行组切换有任何经验吗?
先感谢您!
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)