Atmel SAM3X 双组切换不起作用

2023-12-08

我目前正在使用 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(使用前将#替换为@)

Atmel SAM3X 双组切换不起作用 的相关文章

随机推荐

  • Erlang VM (BEAM) 是如何构建列表的?

    当我在 Erlang 中创建列表时 例如在 Erlang shell 中 1 gt 1 2 据我了解 在虚拟机中 该列表将表示为单链表 Erlang 运行时如何创建这个结构 例如 它的构造是这样的 在内存中创建一个结构来保存终止列表的列表
  • 具有相同 GroupId 的多个 Kafka 监听器都接收消息

    我在 Spring Boot 应用程序中配置了一个 kafka 监听器 如下所示 KafkaListener topicPartitions TopicPartition topic data all partitions 0 1 2 gr
  • 如何从多个线程安全地写入套接字?

    我正在使用 asio 非升压 创建一个 TCP 服务器 虽然我的代码可以工作 但它没有正确完成 因为我正在调用asio async write来自多个线程 我think我应该使用股线 但我读得越多 我就越迷失 include
  • 如何将包含科学记数法的字符串转换为正确的 Javascript 数字格式

    我有一个字符串e g 4 874915326E7 将其转换为 JavaScript 数字格式的最佳方法是什么 整数或浮点数 如果我尝试 parseInt E最后被忽略 Edit 这个答案似乎引起了一些混乱 最初的问题是问如何将字符串形式的科
  • 判断Oracle null == null

    我希望在可为空的列上搜索数据库表 有时我要搜索的值本身就是 NULL 因为 Null 等于什么都没有 甚至是 NULL 所以说 where MYCOLUMN SEARCHVALUE 将失败 现在我必须求助于 where MYCOLUMN S
  • 如何创建充当链接的 TextView

    我有一个Textview地点 例如 加利福尼亚州山景城 我想要实现的是创建这个文本以充当链接 颜色 下划线 可聚焦性等 此链接不需要指向任何地方 周围视图已附加 onClick 侦听器 该侦听器会触发谷歌地图意图 像这样的东西应该有效 Te
  • 如何使用部署在 Kubernetes 上的 Flink 运行 Beam Python 管道?

    有谁知道当 Flink 在 Kubernetes 中作为 Pod 运行时如何使用 Flink 运行 Beam Python 管道 我已经成功地使用 Portable runner 和指向在 Docker 容器中运行的本地 Flink 服务器
  • 在android中为ListView中的每一行制作动态布局

    我有一个 xml 文件 其中包含 ListView 每一行的基本布局 这是一个真实的布局 里面有 TextView 我想更改 ListView 每一行的此布局的属性 例如每行的不同布局宽度和高度 我想动态设置宽度和高度的值 有什么办法可以做
  • Cloud Run 在 121 秒后崩溃

    我正在使用 PubSub 主题和订阅触发器触发长时间运行的抓取 Cloud Run 函数 每次我运行它时 它都会在 121 8 秒后崩溃 但我不明白为什么 POST 503 556B 121 8s APIs Google https dev
  • Android 中的 NETWORK_ERR:XmlHttpRequest 异常 101

    我正在为 android 手机开发一个移动应用程序 每当我运行它时 我都会收到以下错误 network err xmlhttprequest 异常 101 有人可以澄清一下吗 我使用的是安卓4 2版本 下面的代码是mainActivity
  • 使用 PIL 和 SKIMAGE 打开 PGM 文件时出错

    我有以下图像文件 Image 我使用 PIL 和 Skimage 打开它 但出现以下错误 首先使用 PIL 尝试使用和不使用 trucate 选项 代码 from PIL import Image ImageFile ImageFile L
  • 将 8 位整数转换为 dd/mm/yyyy [重复]

    这个问题在这里已经有答案了 所以我在我的 PHP 脚本中有这个函数 它应该将日期作为 8 位整数 例如01042012并将其转换为01 04 2012用于显示 目前我正在尝试使用 phpdate 函数如下 int 01042012 date
  • 以编程方式动态生成 Azure Function 的访问代码

    我有几个 Azure 函数 用 c 编写 我已将其 URL 提供给不同的团队来调用 调用 我注意到后缀的访问代码始终相同 因此存在安全风险 有没有一种方法可以让我们以编程方式动态生成 Azure 函数的访问代码并将其附加到函数的 URL 中
  • 自定义圆形进度条,图像位于中心[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 对于我的 Android 应用程序 我想将图像放入circular progress bar 预期设计 http hpics li cd6acba 关于如何做到这一点有什么想法吗
  • 调用存储在 std 映射中的成员函数指针

    我将映射存储在一个类中 该类以字符串作为键 以指向成员函数的指针作为值 我在调用正确的函数时遇到问题 抛出函数指针 这是代码 include
  • 无法安装弹性表

    我安装时遇到问题Flextable 这似乎是因为gdtools包裹 看起来像gdtools依赖 dylib 文件 有任何想法吗 gt install packages flextable There is a binary version
  • Python:如何引用实例名称? [复制]

    这个问题在这里已经有答案了 我使用以下代码收集实例 class Hand instances def init self Hand instances append self self value 5 def do something se
  • 在 EC2 实例上运行 jupyter 笔记本

    我在我的 AWS 账户上设置了一个 cloud 9 实例 我使用诗歌作为我的包管理器并安装了 jupyter 笔记本 当我运行命令时poetry run jupyter notebook它像平常一样运行 但是当我按下链接时 他们说无法访问该
  • 为什么不能在带有背景的锚元素上设置行高? [复制]

    这个问题在这里已经有答案了 我刚刚意识到带有背景的锚标记只会继承它们的行高 并且您只能通过将锚设置为显示来直接设置它 inline block 为什么是这样 http jsfiddle net moefinley 3H3y5 ul li a
  • Atmel SAM3X 双组切换不起作用

    我目前正在使用 Atmel SAM3X8 ARM 微控制器 该微控制器具有双组 2 x 256KB 闪存 我正在尝试实现固件更新功能 将新固件放入当前未使用的闪存库中 完成后使用闪存重新映射交换库以运行新固件 数据表指出 为此我需要设置 G