首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定Arduino的板卡类型

确定Arduino的板卡类型
EN

Stack Overflow用户
提问于 2012-12-13 12:45:20
回答 3查看 10.7K关注 0票数 12

如何在编译时确定Arduino的电路板类型(例如Uno和Nano)?不要与确定处理器类型相混淆。正如我所看到的例子,例如#if defined(__AVR_ATmega32U4__) ...

类似地,我想要一种方法来确定Arduino的所有口味都使用相同的ATmega328处理器。

IDE已识别主板。那么是否有可能从某个预编译器中访问它#IF

Nano和Uno有不同的中断。因此,了解编译时的线路板类型可以自动为公共库分配管脚。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-29 20:38:22

正如您所提到的,您可以在开发环境中检查电路板目标,以便编译器可以识别电路板。不幸的是,IDE不会直接告诉编译器这个信息。只有处理器类型和频率是向下传递的。

您可以看到IDE对编译程序所做的工作。在preferences菜单中,打开verbose output for compilation。编译一个草图,你会看到类似这样的东西:

C:\Apps\arduino-1.0-windows\arduino-1.0\hardware\tools\avr\bin\avr-g++ -IC:\Apps\arduino-1.0-windows\arduino-1.0\hardware\arduino\cores\arduino -IC:\Apps\arduino-1.0-windows\arduino-1.0\hardware\arduino\variants\standard -c -g -Os -Wall -fno-exceptions -ffunction sections -fdata-sections -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=100 Users C:\Users\Jim\AppData\Local\Temp\build4664216036291565363.tmp\Blink.cpp -oC:\Users\Jim\AppData\Local\Temp\build4664216036291565363.tmp\Blink.cpp.o

-D是Arduino环境将定义传递给预处理器的方式,您可以看到只有CPU速度和arduino版本是以这种方式传递的。

IO引脚的定义方式不同: IDE包含一个文件夹,其中包含特定于电路板的头文件。

此-I参数在编译器的搜索路径中包含一个文件夹:

-IC:\Apps\arduino-1.0-windows\arduino-1.0\hardware\arduino\variants\standard

该文件夹中有一个适用于您选择的电路板的pins_arduino.h文件。如果您选择不同的电路板,您将看到此参数发生变化。

如果你愿意修改你的IDE配置,你可以得到你想要的。

所以要得到你想要的,你只需要得到一个#define指令。下面是如何

步骤1.创建你自己的电路板类型。要创建新的线路板类型,请参阅位于此文件夹中的boards.txt文件:

...\arduino-1.0\hardware\arduino

下面的代码行定义了include文件夹(在本例中是标准文件夹):

代码语言:javascript
复制
uno.build.variant=standard

复制整个块,更改名称和文件夹

代码语言:javascript
复制
myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard

通过此更改,当您选择此电路板目标时,myunoboard文件夹将放置在编译器路径上。

步骤2.使你的头部包含你的定义。

在文件夹中

...\arduino-1.0\hardware\arduino\variants\myunoboard

将文件设为pins_arduino.h.在该文件中

代码语言:javascript
复制
#include "..\standard\pins_arduino.h"
#define BOARD MY_UNO
// and/or this form
#define __BOARD_MY_UNO

步骤3.对更多的电路板重复上述步骤。

这将提供为不同的板级目标构建代码的能力。

话虽如此,我并不真的推荐这种方法。如果您开始考虑创建跨多个目标运行的代码,那么现在可能是时候离开Arduino IDE了。如果您使用的是Eclipse之类的环境,那么您有一个项目,其中包含任意数量的构建配置。每个构建配置可以为电路板目标指定不同的预处理器定义。

票数 4
EN

Stack Overflow用户

发布于 2012-12-13 15:26:30

我不认为arduino IDE中内置了这样的东西,但您可以随时编写自己的makefile,并自己定义这样的东西。

http://pragprog.com/magazines/2011-04/advanced-arduino-hacking

如果您向下滚动到hello world示例,您将看到一个示例makefile,其中定义了一个BOARD make变量,并且只有一点额外的makefile智能,您可以像这样调用make:

代码语言:javascript
复制
make BOARD=UNO

代码语言:javascript
复制
make BOARD=NANO

为不同的电路板做草图。

票数 3
EN

Stack Overflow用户

发布于 2015-12-12 13:09:59

进行板嗅探的一种简单方法是使用诸如ArduinoManager之类的库。有了这个,你就可以很容易地获得板名和功能https://github.com/backupbrain/ArduinoBoardManager

它使用上面描述的技术来揭示几乎每个Arduino板的大量信息,因此它非常适合制作可能部署在许多不同环境中的项目。

只需下载并包含在您的Arduino项目中。

代码语言:javascript
复制
#include "ArduinoBoardManager.h"

ArduinoBoardManager arduino = ArduinoBoardManager(); // required if you want to know the board name and specific features

void setup() {
  Serial.begin(9600);

  Serial.print("Board is compatible with Arduino ");
  Serial.println(arduino.BOARD_NAME);

  Serial.println("Speed/SRAM/Flash: ");
  Serial.print(ArduinoBoardManager::MAX_MHZ);
  Serial.println(ArduinoBoardManager::SRAM_SIZE);
  Serial.println(ArduinoBoardManager::FLASH_SIZE);

  // Board features (multiple serial ports on Mega, for example)
  if (arduino.featureExists(ArduinoBoardManager::FEATURE_MULTIPLE_SERIAL)) {
    Serial.println("Your board supports multiple serial connections");
  }

}

void loop() {
}

Arduino Uno上的结果输出为:

代码语言:javascript
复制
Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

在我的博客中详细描述了将这个库(包括示例代码)转换为determine an Arduino board model and version的过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13853109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档