问题标签 [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.
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 值?我需要将哪些值放入这些寄存器中?
搜索互联网并没有带来任何更好的提示。也许我在错误的地方搜索。这些问题有更详细的参考吗?或者甚至是一些很好的例子?
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 仍然是开放的。
android - 是否可以使用 nrf24l01 在 arduino 和 android 手机之间轻松交换信息?
我需要将信息从 arduino 发送到 android 手机,让一些应用程序主动监听来自 arduino 的无线电通信。使用 nrf24l01 可能吗?
最好的情况是直接通信,即使没有任何类型的握手。Arduino 发送一个 android 期望接收的数字序列,当它听到这个序列时,应用程序会提醒我。
c - 数字引脚 3 Arduino Due (C) 上的 PWM 控制
我正在尝试使用 Arduinos 自己的电机护罩控制我的 Arduino Due 板上的风扇,但遇到了问题。我想向我的风扇发送一个 PWM 信号,问题来了,引脚 3 的通道少..
我能找到什么没有数字引脚 3 的通道?
该代码有效,我已经用其他引脚对其进行了测试,当我在万用表上测量它时,我得到了请求的值。
在 Due 的数据表中没有关于它的任何内容。在电机屏蔽网页上,我发现引脚 3 是可以使用的,并且在 Arduino Uno 上它工作得很好。
还有一种使用数字引脚 11 的方法,但这里也一样,没有通道。
有没有人有这样的解决方案或回答方式?
c++ - Win API串口初始化后需要等待
我有以下问题。我有一个应该与计算机通信的串行端口设备。事实上它是 Arduino Due 板,但我不认为它是相关的。
我使用 CreateFile 打开端口,然后使用 GetCommState()&SetCommState() 和 GetCommTimeouts()&SetCommTimeouts() 设置参数。
端口已正确打开 - 没有问题。但是此时我想检查设备是否已连接。所以我发送了一个特定的消息。该设备应该以某种方式响应,以便我知道它已连接。
现在解决问题:只有在创建端口之后(在发送握手请求之前)放置 Sleep(1000) 才有效。看起来 WinAPI 需要一些时间才能开始使用该端口。因为睡眠解决方案通常不可用,我需要找到一些替代方案......
它不起作用我的意思是 ReadFile 超时。即使超时设置为 5 秒,它也会超时 - 请注意,睡眠间隔仅为一秒。所以看起来握手请求甚至没有发送。如果我将超时设置为 1 秒并将睡眠间隔设置为一秒,它就可以工作。如果我将超时设置为 5 秒但没有睡眠它不起作用。看到问题了吗?
我将尝试一些 NetworkMonitor,但我有点确定问题不在于设备......
c - 这是Arduino模中的错误还是我?
我使用模运算符为我的 Arduino Due(运行 1.6.1)创建了以下简单草图:
输出如下所示:
我的期望是余数会一次又一次地从 0 增加到 3。相反,它会在 0 次四次和 4 次四次之间交替。
我完全接受我做错了什么的想法,但我无法弄清楚它是什么。
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 位寄存器中?
header - 为什么我的头包含文件导致构建失败?
我正在尝试将 spi.h 文件包含在我的 Arduino Due 项目中。我想使用 Atmel Studio 6.2,因为它为我提供了更大的灵活性,而且坦率地说,它是一个比 Arduino 工具更好的 IDE。我可以使用从与 Arduino 通信的批处理文件调用的 bossa.exe 编程实用程序成功地对电路板进行编程。这是批处理文件的基本调用:
现在的问题是,如果代码如下所示,Atmel 工作室可以很好地对电路板进行编程:
但是我这样做的那一刻:
构建失败...
但是当我查看解决方案资源管理器时,我可以看到 sam.h 文件:
那么这里发生了什么?
(编辑:我忘了在屏幕截图中显示 sam.h 文件,但相信我,它位于名为“Dependencies”的文件夹中)
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 应用程序,它的工作如下是详细信息
请求向我提供解决此问题的建议或帮助
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”编译首选项
他们的代码中有一个奇怪的实现无法编译,我改变了这个:
对此: