如何在编译时确定Arduino的电路板类型(例如Uno和Nano)?不要与确定处理器类型相混淆。正如我所看到的例子,例如#if defined(__AVR_ATmega32U4__) ...
类似地,我想要一种方法来确定Arduino的所有口味都使用相同的ATmega328处理器。
IDE已识别主板。那么是否有可能从某个预编译器中访问它#IF
Nano和Uno有不同的中断。因此,了解编译时的线路板类型可以自动为公共库分配管脚。
发布于 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文件夹(在本例中是标准文件夹):
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-13 15:26:30
我不认为arduino IDE中内置了这样的东西,但您可以随时编写自己的makefile,并自己定义这样的东西。
http://pragprog.com/magazines/2011-04/advanced-arduino-hacking
如果您向下滚动到hello world示例,您将看到一个示例makefile,其中定义了一个BOARD make变量,并且只有一点额外的makefile智能,您可以像这样调用make:
make BOARD=UNO或
make BOARD=NANO为不同的电路板做草图。
发布于 2015-12-12 13:09:59
进行板嗅探的一种简单方法是使用诸如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的过程。
https://stackoverflow.com/questions/13853109
复制相似问题