确定Arduino的板类型

时间:2012-12-13 04:45:20

标签: arduino precompiler

如何在编译时确定Arduino的板类型(例如Uno vs Nano)? 不要与确定处理器类型相混淆。我看到这样的例子,例如#if defined(__ AVR_ATmega32U4__)...

我想要一种方法,类似地,确定Arduino的风味之间使用相同的ATmega328处理器。

IDE知道董事会。因此可以从一些预编译器#IF

访问它

Nano与Uno有不同的中断。因此,在编译时知道板类型可以自动化公共库的引脚分配。

3 个答案:

答案 0 :(得分:4)

如您所述,您在开发环境中检查了一个电路板目标,以便编译器可能知道电路板。不幸的是,IDE没有直接告诉编译器这些信息。只传递处理器类型和频率。

您可以看到IDE对编译程序的作用。在首选项菜单中,打开详细输出以进行编译。编译草图,您将看到如下内容:

C:\ Apps \ arduino-1.0-windows \ arduino-1.0 \ hardware \ tools \ avr \ bin \ avr-g ++ -c -g -Os -Wall -fno-exceptions -ffunction-sections -fdata -sections -mmcu = atmega328p -DF_CPU = 16000000L -DARDUINO = 100 -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:\ 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 \硬件\ Arduino的

这样的行定义了include文件夹(在本例中为标准):

uno.build.variant=standard

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

myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard

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

步骤2.制作包含您的定义的标题。

在文件夹

... \ Arduino的1.0 \硬件\ Arduino的\变体\ myunoboard

制作文件 pins_arduino.h 。在那个文件中

#include "..\standard\pins_arduino.h"
#define BOARD MY_UNO
// and/or this form
#define __BOARD_MY_UNO

步骤3.重复更多电路板。

这将为不同的主板目标构建代码。

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

答案 1 :(得分:3)

我认为arduino IDE中没有内置这样的东西,但你总是可以编写自己的makefile并自己定义这样的东西。

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

如果向下滚动到hello world示例,您将看到一个示例makefile,其中定义了一个BOARD make变量,并且只需要一些额外的makefile smarts就可以调用make:

make BOARD=UNO

make BOARD=NANO

为不同的电路板构建草图。

答案 2 :(得分:0)

进行电路板嗅探的一种简单方法是使用ArduinoManager等库。有了这个,您可以非常轻松地获得电路板名称和功能https://github.com/backupbrain/ArduinoBoardManager

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

只需下载并加入您的Arduino项目。

#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的结果输出是:

Board is compatible with Arduino UNO

Speed/SRAM/Flash: 
16000000
2048
33554432

我的博客详细介绍了将此库(包括示例代码)设置为determine an Arduino board model and version的过程。