在編譯時如何確定Arduino的板類型(例如Uno vs Nano)? 不要與確定處理器類型混淆。正如我看到的例子,例如#if defined(__ AVR_ATmega32U4__)...確定Arduino的板類型
我想用一種方法來確定Arduino所有使用ATmega328相同處理器的風格。
IDE知道董事會。那麼是否有可能從一些預編譯器訪問它#IF
Nano與Uno有不同的中斷。因此,在編譯時瞭解板類型可以自動執行公共庫的引腳分配。
在編譯時如何確定Arduino的板類型(例如Uno vs Nano)? 不要與確定處理器類型混淆。正如我看到的例子,例如#if defined(__ AVR_ATmega32U4__)...確定Arduino的板類型
我想用一種方法來確定Arduino所有使用ATmega328相同處理器的風格。
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窗口\ Arduino的1.0 \硬件\ Arduino的\變體\標準
在該文件夾中是一個pins_arduino.h文件,它適用於您選擇的電路板。 如果您選擇其他電路板,您將看到此參數更改。
如果你願意修改你的IDE配置,你可以得到你要求的。
所以要得到你想要的,你只需要得到一個#define指令。 所以這裏是如何去做
第1步。做你自己的板子類型。爲了使新的板型,看到此文件夾中的文件boards.txt:
... \ Arduino的1.0 \五金\ Arduino的
類似的行定義這種情況下,包括文件夾(標準):
uno.build.variant=standard
複製整個塊,更改名稱和文件夾
myuno.name=My Arduino Uno
...
myuno.build.variant=myunoboard
隨着這一變化,當您選擇這款主板的目標,該myunoboard文件夾將被放置在補償iler路徑。
第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等環境,則可以使用任意數量的構建配置構建一個項目。每個構建配置可以爲板子目標指定不同的預處理器定義。
我不認爲有這樣的東西內置到arduino IDE,但你可以隨時編寫自己的makefile並自己定義這樣的事情。
http://pragprog.com/magazines/2011-04/advanced-arduino-hacking
如果向下滾動到Hello World示例,你會看到一個例子生成文件,用牌局提出變量定義,並一點點額外的makefile文件的智慧,你可以調用做出這樣的:
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的烏諾產生的輸出是:
Board is compatible with Arduino UNO
Speed/SRAM/Flash:
16000000
2048
33554432
用於製備該文庫(包括例如代碼)determine an Arduino board model and version的處理的詳細內容在我的博客說明。
我剛剛嘗試過。它主要用於INO文件。但是,它似乎是庫文件,無法看到變體/ pin_arduino.h中定義的定義。因爲我需要在自定義庫的.h中出現差異。 – mpflaga
看來我可能是錯的。看起來像我不能使用另一個庫的文件名的#define。所以它現在似乎工作。 – mpflaga
以上是現在IDE 1.5的情況,請參閱https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification以及參數uno.build.board = AVR_UNO,該提供用於設置編譯時變量ARDUINO_ {build.board}以允許在#ifdefs之間使用條件代碼 – mpflaga