如何在编译时确定 Arduino 的板类型(例如 Uno 与 Nano)?不要与确定处理器类型混淆。如我所见,例如 #if defined(__AVR_ATmega32U4__) ...
同样,我想要一种方法来确定所有使用相同 ATmega328 处理器的 Arduino 口味。
IDE 知道板。那么是否可以从一些预编译器#IF 访问它
Nano 与 Uno 有不同的中断。因此,在编译时知道板子类型可以自动分配公共库的引脚。
如何在编译时确定 Arduino 的板类型(例如 Uno 与 Nano)?不要与确定处理器类型混淆。如我所见,例如 #if defined(__AVR_ATmega32U4__) ...
同样,我想要一种方法来确定所有使用相同 ATmega328 处理器的 Arduino 口味。
IDE 知道板。那么是否可以从一些预编译器#IF 访问它
Nano 与 Uno 有不同的中断。因此,在编译时知道板子类型可以自动分配公共库的引脚。
正如您所指出的,您在开发环境中检查了一个板目标,以便编译器可能知道该板。不幸的是,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 之类的环境,那么您将拥有一个项目,其中包含任意数量的构建配置。每个构建配置都可以为板目标指定不同的预处理器定义。
我认为 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
为不同的板构建草图。
进行电路板嗅探的一种简单方法是使用 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 板模型和版本 的过程在我的博客中有详细描述。