12

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

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

IDE 知道板。那么是否可以从一些预编译器#IF 访问它

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

4

3 回答 3

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. 制作您自己的板型。要创建新的板类型,请参见位于此文件夹中的 board.txt 文件:

...\arduino-1.0\硬件\arduino

像这样的行定义了包含文件夹(在这种情况下是标准的):

uno.build.variant=standard

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

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

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

第 2 步。让您的标题包含您的定义。

在文件夹中

...\arduino-1.0\hardware\arduino\variants\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 之类的环境,那么您将拥有一个项目,其中包含任意数量的构建配置。每个构建配置都可以为板目标指定不同的预处理器定义。

于 2012-12-29T12:38:21.940 回答
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

为不同的板构建草图。

于 2012-12-13T07:26:29.817 回答
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

制作这个库(包括示例代码)以确定 Arduino 板模型和版本 的过程在我的博客中有详细描述。

于 2015-12-12T05:09:58.550 回答