问题标签 [arduino-due]

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 投票
2 回答
3699 浏览

gcc - SysTick->LOAD 与 SysTick->CALIB

我目前正在将我的DCF77 库(您可以在 GitHub 上找到源代码)从 Arduino(基于 AVR)移植到 Arduino Due(ARM Cortex M3)。

该库需要精确的 1ms 时序。一个明显的候选者是使用 systicks。方便的是,Arduino Due 已经为 1 kHz 的 systicks 设置好了。

但是,我的(AVR)DCF77 库一旦锁定到 DCF77 就能够调整时序。这是通过像这样操作计时器重新加载值来完成的

我想把它移植到 ARM 处理器上。在 ARM 信息中心,我找到了以下文档。

配置 SysTick

...

要配置 SysTick,您需要使用 SysTick 事件之间所需的间隔加载 SysTick Reload Value 寄存器。定时器中断或 COUNTFLAG 位(在 SysTick 控制和状态寄存器中)在从 1 到 0 的转换时被激活,因此它每 n+1 个时钟周期激活一次。如果需要 100 的周期,则应将 99 写入 SysTick 重载值寄存器。SysTick 重载值寄存器支持 1 到 0x00FFFFFF 之间的值。

如果您想使用 SysTick 以定时间隔(例如 1 毫秒)生成事件,您可以使用 SysTick 校准值寄存器来缩放您的重载寄存器值。SysTick 校准值寄存器是一个只读寄存器,在 TENMS 字段(位 0 到 23)中包含 10ms 周期内的脉冲数。该寄存器还有一个 SKEW 位 (30),用于指示由于时钟频率的微小变化,TENMS 部分中的 10ms 校准不完全是 10ms。第 31 位用于指示是否提供参考时钟。

...

不幸的是,我没有找到任何关于 SysTick->LOAD 和 SysTick->CALIB 是如何连接的。也就是说:如果我想限制或加速 systicks,我是否需要操纵 LOAD 或 CALIB 值?我需要将哪些值放入这些寄存器中?

搜索互联网并没有带来任何更好的提示。也许我在错误的地方搜索。这些问题有更详细的参考吗?或者甚至是一些很好的例子?

0 投票
1 回答
2517 浏览

c - 用于阅读的原子块与 ARM SysTicks

我目前正在将我的DCF77 库(您可以在 GitHub 上找到源代码)从 Arduino(基于 AVR)移植到 Arduino Due(ARM Cortex M3)。我是 ARM 平台的绝对初学者。

使用基于 AVR 的 Arduino,我可以使用avr-libc来获取原子块。基本上这会阻塞阻塞期间的所有中断,并在以后再次允许中断。对于 AVR,这很好。现在对于 ARM Cortex,事情开始变得复杂起来。

首先:对于图书馆的当前用途,这种方法也可以。所以我的第一个问题是:是否有类似于 ARM 的 avr-libc 的“ATOMIC”宏?显然其他人已经在这个方向上想到了一些东西。由于我使用的是 gcc,因此我可以增强这些宏,使其几乎与 avr-libv ATOMIC 宏一样工作。我已经找到了一些CMSIS 文档,但这似乎只提供了“enable_irq”宏而不是“restore_irq”宏。

问题 1:是否有任何图书馆(用于 gcc)已经这样做了?

因为 ARM 有不同的优先级中断,我也可以用不同的方式建立原子性。在我的情况下,“原子”块必须只确保它们不会被 systick 中断打断。所以实际上我不需要阻止一切来使我的块“足够原子”。进一步搜索,我在开发人员信息中心找到了一篇 ARM 同步原语文章。尤其是无锁编程的提示。根据这篇文章,这是一个先进的概念,并且有很多关于它的出版物。在网上搜索我只发现了这个概念的一般解释,例如here。我认为无锁实现会非常酷,但此时我对 ARM 没有足够的信心从头开始实现它。

问题 2:有人对我在 ARM Cortex M3 上无锁读取内存块有一些提示吗?

正如我已经说过的,我只需要保护较低优先级的线程免受 sysTicks 的影响。因此,另一种选择是暂时禁用 sysTicks。由于我正在实现对时序敏感的时钟算法,因此从长远来看,这一定不会降低整体 sysTick 频率。不过,引入一些小的抖动是可以的。在这个时候,我会觉得这个最有吸引力。

问题 3:有什么好的方法可以阻止 sysTick 中断而不丢失任何滴答声?

我还找到了semaphores 的 CMSIS 文档。然而,我有些不知所措。特别是我想知道我是否应该使用 CMSIS 以及如何在 Arduino Due 上执行此操作。

问题4:我最好的选择是什么?或者我应该在哪里继续阅读?

部分答案:在 Notlike 的提示下,我实现了

这个宏或多或少地做了我需要的。但是,我发现还有改进的余地,因为这会阻止所有中断,尽管仅阻止 systicks 就足够了。所以问题 3 仍然是开放的。

0 投票
1 回答
772 浏览

android - 是否可以使用 nrf24l01 在 arduino 和 android 手机之间轻松交换信息?

我需要将信息从 arduino 发送到 android 手机,让一些应用程序主动监听来自 arduino 的无线电通信。使用 nrf24l01 可能吗?

最好的情况是直接通信,即使没有任何类型的握手。Arduino 发送一个 android 期望接收的数字序列,当它听到这个序列时,应用程序会提醒我。

0 投票
0 回答
289 浏览

c - 数字引脚 3 Arduino Due (C) 上的 PWM 控制

我正在尝试使用 Arduinos 自己的电机护罩控制我的 Arduino Due 板上的风扇,但遇到了问题。我想向我的风扇发送一个 PWM 信号,问题来了,引脚 3 的通道少..

我能找到什么没有数字引脚 3 的通道?

该代码有效,我已经用其他引脚对其进行了测试,当我在万用表上测量它时,我得到了请求的值。

在 Due 的数据表中没有关于它的任何内容。在电机屏蔽网页上,我发现引脚 3 是可以使用的,并且在 Arduino Uno 上它工作得很好。

还有一种使用数字引脚 11 的方法,但这里也一样,没有通道。

有没有人有这样的解决方案或回答方式?

0 投票
1 回答
131 浏览

c++ - Win API串口初始化后需要等待

我有以下问题。我有一个应该与计算机通信的串行端口设备。事实上它是 Arduino Due 板,但我不认为它是相关的。

我使用 CreateFile 打开端口,然后使用 GetCommState()&SetCommState() 和 GetCommTimeouts()&SetCommTimeouts() 设置参数。

端口已正确打开 - 没有问题。但是此时我想检查设备是否已连接。所以我发送了一个特定的消息。该设备应该以某种方式响应,以便我知道它已连接。

现在解决问题:只有在创建端口之后(在发送握手请求之前)放置 Sleep(1000) 才有效。看起来 WinAPI 需要一些时间才能开始使用该端口。因为睡眠解决方案通常不可用,我需要找到一些替代方案......

它不起作用我的意思是 ReadFile 超时。即使超时设置为 5 秒,它也会超时 - 请注意,睡眠间隔仅为一秒。所以看起来握手请求甚至没有发送。如果我将超时设置为 1 秒并将睡眠间隔设置为一秒,它就可以工作。如果我将超时设置为 5 秒但没有睡眠它不起作用。看到问题了吗?

我将尝试一些 NetworkMonitor,但我有点确定问题不在于设备......

0 投票
1 回答
1188 浏览

c - 这是Arduino模中的错误还是我?

我使用模运算符为我的 Arduino Due(运行 1.6.1)创建了以下简单草图:

输出如下所示:

我的期望是余数会一次又一次地从 0 增加到 3。相反,它会在 0 次四次和 4 次四次之间交替。

我完全接受我做错了什么的想法,但我无法弄清楚它是什么。

0 投票
3 回答
726 浏览

c++ - 如何通过 uint_8 位变量在函数中传递 48 位 MAC 地址作为参数?

最近,我开始做一个与emac相关的项目,在实施方面遇到了一些疑问和障碍,于是决定在这里发布我的Q,向有经验的人寻求一些建议和建议。

目前,我正在将 EMAC-DM9161A 模块与我的 SAM3x - Taiji Uino 板连接以进行高速以太网通信。我正在使用 Palliser 开发的库,该库作为 elechouse/EMAC-Demo 上传到 Github。在源代码 - ethernet_phy.c 中,我遇到了这个函数来初始化 DM9161A PHY 组件,如下所示:

问题:参数 uint8_t uc_phy_addr 是一个 8 位寄存器,我想通过它传递一个 48 位 MAC 地址,例如 - 70-62-D8-28-C2-8E。我知道,我可以使用两个 32 位寄存器将 MAC 地址的前 32 位(即 70-62-D8-28)存储在一个 32 位寄存器中,其余 16 位 MAC 地址(即 C2-8E)存储在另一个 32 位寄存器中. 但是,我不能这样做,因为我需要使用上面的 ethernet_phy_init 函数,其中 unit8_t 用于传递 48 位 MAC 地址。所以,我想知道,如何做到这一点?

另一个问题:我执行了一些代码以通过一些试验方法理解并遇到一些疑问,这里是代码:

输出结果:

所以我的疑问是,为什么在我使用 8 位变量存储值 49 的任何地方,输出都以 ASCII 字符显示,但是当我使用普通的 32 位 int 变量存储 49 时,它显示的十进制值是 49。为什么这会发生吗?最后如何将 MAC 地址存储在 8 位寄存器中?

0 投票
2 回答
658 浏览

header - 为什么我的头包含文件导致构建失败?

我正在尝试将 spi.h 文件包含在我的 Arduino Due 项目中。我想使用 Atmel Studio 6.2,因为它为我提供了更大的灵活性,而且坦率地说,它是一个比 Arduino 工具更好的 IDE。我可以使用从与 Arduino 通信的批处理文件调用的 bossa.exe 编程实用程序成功地对电路板进行编程。这是批处理文件的基本调用:

现在的问题是,如果代码如下所示,Atmel 工作室可以很好地对电路板进行编程:

但是我这样做的那一刻:

构建失败...

但是当我查看解决方案资源管理器时,我可以看到 sam.h 文件:

在此处输入图像描述

那么这里发生了什么?

编辑:我忘了在屏幕截图中显示 sam.h 文件,但相信我,它位于名为“Dependencies”的文件夹中)

0 投票
1 回答
776 浏览

heroku - heroku 上基于 Django 的应用程序显示错误 HTTP/1.1 505 HTTP Version Not Supported

我需要将一些数据从 arduino 发送到基于休息的 Web 应用程序。

为了测试,我在 heroku 上创建了一个基于 django 的 Web 应用程序

现在,当我尝试使用 GSM AT 命令从 arduino 发送数据时,它显示以下错误

HTTP/1.1 505 HTTP Version Not Supported Connection: close Server: Cowboy

下面是我在arduino中的代码

我已经通过使用 python 请求通过我的 linux 系统发送测试了 web 应用程序,它的工作如下是详细信息

请求向我提供解决此问题的建议或帮助

0 投票
1 回答
349 浏览

c++ - 在 Arduino DUE 上编译 EKfilter C++ 库时遇到问题

更新:通过将 operator[] 实际替换为 this->operator[] 来修复最终错误。

更新 2: logic_error 已修复!_P 错误就是剩下的全部了!(仅显示在 DUE 中,而不是 UNO 或其他板...)

更新 3:将临时矩阵的名称更改为 _Pt 有效,可能是保留的宏?

新错误:

看起来我需要使用 -fexceptions ...

此报告将在“文件”>“首选项”中启用“在编译期间显示详细输出”的更多信息。

这里有很多,但我希望付出一切是我应该做的,以获得一个好的答案。

在 OSX 上为 arduino DUE 使用 Arduino 1.6.1。

使用这个库来获取 std 命名空间' https://github.com/maniacbug/StandardCplusplus/ '

这是我在编译时遇到问题的库:' http://kalman.sourceforge.net/index.php '

我已经将过滤器库移动到这种格式,以便能够在 arduino 中使用它,现在至少能够在没有找到头文件的情况下进行包含: 文件截图

如您所见,我必须将文件重命名为 .h 标头(不确定这有多么必要),并将文件夹重命名为与我的 .cpp 和 .h 相同的标题,当然还要编辑所有随附的文件以供参考文件不同:示例

现在是这个:

所以,现在,当我尝试编译时:

我得到了如下所示的这些错误。

第一个错误真的让我发疯了,因为这个 StandardCplusplus 库应该处理 std:: 命名空间,而且我表面上没有发现该代码库中的实现有任何错误。

据我所见,_P 之后的大部分内容都是一个问题,即第一个错误会阻止将 _P 变量转换为 kmatrix.h 中定义的矩阵。奇怪的是,这可能指向一个解决方案,当我为 Arduino UNO 编译时,这些错误不会出现。

最后一对错误老实说我只是不清楚它的含义。

在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:37:0 包含的文件中,来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33,来自 TestKalmanLibrary.ino: 2:

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:74:48:错误:“{”令牌之前的预期类名

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h:在构造函数中'Kalman::KalmanError::KalmanError(const string&)':/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ktypes.h: 82:9:错误:

“Kalman::KalmanError”类没有任何名为“logic_error”的字段

在 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/cctype:19:0 中包含的文件中,来自 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/istream:21,来自 /Users/insertnamehere /Documents/Arduino/libraries/StandardCplusplus-master/iostream:27,来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:35,来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter .h:33,来自 TestKalmanLibrary.ino:2:/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:在全球范围内:

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:807:20:

错误:数字常量之前的预期不合格 id

在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:817:0 包含的文件中,来自 TestKalmanLibrary.ino:2:/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h: 在成员函数'void Kalman::EKFilter::init(Kalman::EKFilter::Vector&, Kalman::EKFilter::Matrix&)':

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:196:8:错误:

在“16”中请求成员“交换”,它是非类类型“int”

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数'const Matrix& Kalman::EKFilter::calculateP() const'中:/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl。 h:435:10: 错误:在“16”中请求成员“resize”,它是非类类型“int”

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:439:15:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:443:17:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:17:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:444:35:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:447:19:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:17:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:450:27:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:在成员函数“virtual void Kalman::EKFilter::sizeUpdate()”中:/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h :572:26:错误:表达式不能用作函数

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:583:10: 错误:在“16”中请求成员“resize”,它是非类类型“int”

/Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter_impl.h:586:17:错误:表达式不能用作函数

在 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector.h:34:0 中包含的文件中,来自 /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/ekfilter.h:33,来自 TestKalmanLibrary.ino: 2: /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string: 在 'std::basic_string::size_type std::basic_string::find_first_not_of(const std::basic_string&, std::basic_string:: size_type) const [with Ch = char; Tr = std::char_traits; A = std::分配器;std::basic_string::size_type = unsigned int]': /Users/insertnamehere/Documents/Arduino/libraries/ekfilter/kvector_impl.h:66:42: 从这里需要 /Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-主/字符串:518:64:注意:从属基“std::vector >”中的声明

/Users/insertnamehere/Documents/Arduino/libraries/StandardCplusplus-master/string:518:64: 注意:使用 'this->operator[]' 代替 编译错误。

所以这里有很多要解决的问题,但这都是在我解决了库格式化方式的一些问题之后:

我必须将 -fpermissive 添加到“/boards.txt”编译首选项

他们的代码中有一个奇怪的实现无法编译,我改变了这个:

对此: