问题标签 [atsam3x]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
7611 浏览

arm - Arduino Due 中的定时器

我是 arduino 的新手(事实上是编程)。我正在考虑将 arduino 用于我的学术项目。在浏览它的数据表(来自 Atmel 的 SAM3X8E 数据表)时,我遇到了计时器,据说都是 32 位计数器。他们计数到 0xFFFF,然后再次进入 0x0000。我有点困惑。它们不应该一直计数到 0xFFFFFFFF(在归零之前),因为它们是 32 位计数器。我认为 16 位计数器是一个计数到 0xFFFF 的计数器。可能我的要求很愚蠢,但请对此有所了解。

提前致谢..

37.6 功能描述,37.6.2 32 位计数器,页号:数据表中的 873

0 投票
1 回答
9385 浏览

exception-handling - Atmel Studio Dummy_Handler

有时我会遇到意外中断,我的代码会挂在Dummy_Handler()Atmel exceptions.cStudio Framework (ASF) 中。我正在使用 Arduino Due 的 ATSAM3X8E 微控制器。

任何想法如何确定它是哪个中断

当然,我可以用唯一的虚拟处理程序替换这个单一的处理程序,每个异常都有一个。(大约有 50 个。)例如更改同一个 exceptions.c 文件中的每一行:

对此

等等......或者尝试推断我的代码如何产生哪个中断。但谁有这样的时间?

0 投票
2 回答
2182 浏览

io - UART 中断禁用 Sam3X8E/Arduino Due 上的 I/O

我开始使用 Arduino Due 进行一些需要 UART 的项目工作,并且对 UART 中断和 I/O 之间的交互感到困惑。

我的第一段代码是一个设置 UART 的小程序,通过在收到 TXBE 中断时加载发送缓冲区来连续发送数据。我将 UART 输出连接到示波器,并将另一个 I/O 引脚设置为通用输出,该输出将翻转状态,因此用于在重新加载发送缓冲区时触发示波器。问题是我看到了 UART 数据,它看起来不错,但 I/O 没有翻转。此时我的loop()例程是空的,所以我设置了另一个输出端口,并将loop()其状态切换为健全性检查。除了UART,仍然没有输出。

这是我最终得到的代码:

范围输出可以在http://www.iwanczuk.com/temp/scope1.png查看(这里没有足够的声誉来发布图像!)。

在盯着事情看了一会儿并且没有得到任何见解之后,我通过注释掉该行来禁用 TXBUFE 中断,REG_UART_IER = 0x0800L; // enable TXBUFE interrupt然后可以看到 PortD1 的切换,但显然没有 UART 输出(参见http://www.iwanczuk.com/temp/scope2.png)。似乎两者是相互排斥的,如果这是真的,那将是愚蠢的。我确定我错过了一些东西,但我看不到或找不到它是什么。

我已经阅读了 SAM3X8E 数据表,看看是否有什么明显的我遗漏了,如果有我看不到它。我也做了我认为相关的网络搜索,但没有找到解决方案。我还尝试对端口 A 和端口 D 上的两个输出使用通用输出,并在两个 Arduino Due 板上进行了尝试,两者的结果相似。

有人知道我可能做错了什么吗?提前致谢。

0 投票
3 回答
1089 浏览

c - 为什么此功能不能正确打开和关闭 LED?

我正在使用 Atmel SAM3x8E 微控制器,并在按下按钮时尝试进行简单的 LED 切换。我正在使用上拉配置按钮来触发中断程序。

这是中断的初始化:

然后这是中断程序:

然而,当我运行它时,我无法让 LED 切换。它只是打开并保持打开状态。pio_toggle_pin_group 调用的函数如下:

关于为什么我的 LED 没有按照我想要的方式切换的任何想法?我已经参考了Atmel ASF 文档,但我仍然无法弄清楚这一点。

0 投票
2 回答
1043 浏览

c - 无法使用 printf 命令构建 atmel studio 6.2 项目

我是 Atmel Studio 的新手。我使用 ATSAMV71Q21 设备创建了新的 GCC C Execute 项目。在 main.c 文件中添加了 printf 然后运行构建并得到一堆“未定义的引用(_write,_fsta 等)错误。我尝试了 Atmel 的“入门”示例,它运行良好。我该如何解决这个问题?下面是代码和错误消息。感谢您的帮助。

d:/atmel/atmel 工具链/arm gcc/native/4.8.1443/arm-gnu-toolchain/bin/../lib/gcc/arm-none-eabi/4.8.4/../../.. /../arm-none-eabi/lib/armv7e-m\libc.a(lib_a-sbrkr.o):在函数“_sbrk_r”中:D:\Atmel\samv71_softpack_1.4_for_astudio_6_2\studio\Atmel\samv71_Xplained_Ultra\examples\测试\测试\调试\sbrkr.c(1,1):错误:未定义的对“_sbrk”的引用

0 投票
0 回答
141 浏览

c - 为什么这个 SAM3X8E I2C 探针总是得到 NACK 或 ARBLST

这是代码,它应该可以工作,但不能。我总是得到仲裁丢失或不承认。我已经检查了其他所有内容,从设备已连接并正在使用其他代码等,等等。

0 投票
0 回答
362 浏览

debugging - 获取 sam3x8E 的堆栈指针和返回地址

我目前正在使用 arduino Due (Atmel SAM3X8E) 开发一个项目,该项目随机触发了看门狗重置。(有时它会在 10 分钟内重置,有时它会运行数小时然后点击看门狗重置)。我的看门狗超时设置得相当长(7 秒)

该项目现在已经变得相当大了,我没有调试器(也没有可用于 arduino 代码的调试器)

不幸的是,我不知道该程序可以存放在哪里。

你们会建议在这种情况下做什么?

====================更新01:======================

现在我将使用看门狗中断在触发看门狗时为我提供更多信息。我在互联网上进行了一些研究,并为设置编写了以下代码。但它不起作用......

我希望当我创建一个 while(1){} 时,看门狗会被触发,并且通过 WDT_handler() 我可以获得一些调试消息,稍后我可以放置更多有用的调试信息。但在真实情况下。我没有收到任何消息,所以我认为 WDT_handler 根本没有执行。

任何人都可以看看并帮助我找出问题所在吗?

看门狗设置:

我有一个看门狗处理程序

===========================更新02:==================== =

我发现问题出在哪里了!如果我想使用中断处理程序,我不应该使用 WDT_MR_WDRSTEN。它会立即重置处理器,这就是 WDT_handler 没有运行的原因。(我猜)

==========更新03:========================

我试图从 WDT_Handler 内的堆栈指针中捕获返回地址。使用以下代码:

是的,我得到了一些数字:0x20087F28。我通过使用 arm-none-eabi-objdump.exe 解码我的 .elf 文件来检查我的项目的反汇编。我找不到任何地址,它指向这个数字 0x20087F28

我在这里做错了吗?

0 投票
1 回答
770 浏览

arm - Atmel SAM3X 双组切换不起作用

我目前正在使用具有双组 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 启动。

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

将固件本身刷入 Flash1 库可以完美运行,这已通过使用 SAM-BA 转储整个闪存来验证。

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

我没有发现任何其他人遇到此问题,也没有任何示例如何使用它,所以也许有人可以告诉我我是否在这里做错了什么,或者还有什么要检查的。

0 投票
1 回答
639 浏览

arm - 读取闪存数据,ATSAM3

我正在通过 Arduino Due Board (ATSAM3X) 开发一个项目,我正在使用 Atmel Studio7 和 ASF。我想知道如何读取闪存块/区域,计算 CRC32 或简单的校验和存储器,数据表非常混乱,EEFC 模块描述了如何在闪存中写入或如何读取“唯一标识符”,但不是如何读取地址闪存范围。

如果有人有我可以阅读的示例代码或文档,我将不胜感激。

向大家致以最诚挚的问候。马可

0 投票
0 回答
679 浏览

arm - 用于启动不同行为的 Atmel SAM3X8E 双组切换

我目前正在使用嵌入了 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 上进行银行切换的一般经验?

先感谢您!