どこに需要あるかは分からないけど備忘録です。
個人的には Arduino 互換ボードの中では高性能で公式ドキュメントも充実してるので、1枚あれば色々と遊べるオススメボードです。
Espressif ESP は宗教上の理由で NG
Feather M4 Express
Arduino M0 等でお馴染み SAMD21 の兄貴分である SAMD51 を搭載した Adafruit 社製 Arduino 互換ボードです。
"Feather" シリーズとしてエコシステムを構築しており、同フォームファクタで Mega328P や SAMD21 を搭載したボードのほか、拡張基板やアクセサリなども多数展開されています。
SAMD51
Cortex-M4F を搭載した Microchip 社製 MCU です。
SAMD21 の上位互換的な存在なので、SAMD 向けライブラリならほぼ使えます。
なお Adafruit 社の Cortex-M4F 搭載ボードは、float型が存在すると自動的に FPU が適用されるとの事です。
ハードウェアスペックをざっくりおさらい。
高性能なので、何をするにも困る事は無いと思います。
| AT SAMD21 G18 | AT SAMD51 J19 | |
|---|---|---|
| Architecture | ARM Cortex-M0+ |
ARM Cortex-M4F |
| Frequency | 48 MHz | 120 MHz |
| RAM | 32 KB | 192 KB |
| Flash ROM | 256 KB | 512 KB |
| I/O | USB, Serial, I2C, SPI, I2S etc... |
USB, Serial, I2C, SPI, I2S, QSPI etc... |
| ADC | 12 bit 350 kSPS x1 (16 bit HW over sampling) |
12 bit 1000 kSPS x2 (16 bit HW over sampling) |
| DAC | 10 bit 350 kSPS x1 |
12 bit 1000 kSPS x2 |
| Accelerator | FPU, SHA256, AES, RSA |
使ってみる
割込タイマ
マイコンって大体、割込タイマとか DMA とか、レジスタ操作が絡んでくる辺りから訳が分からなくなるんですよね...
今回は、Adafruit 公式から割込タイマのライブラリが公開されていたので、物は試しで使ってみます。
インストール
ArduinoIDE の "ライブラリ管理" で、Adafruit ZeroTimerをインストールしておきます。
ライブラリ仕様
クロックソースはDFLL48Mが使われているようです。
これは内蔵の発振逓倍回路で生成される CPU クロック源です。
折角ボード上に32.768 kHzのXOSC32K水晶が載っているので使いたいところですが、指定方法がよく分からなかったので課題としておきます。
【訂正】
CPU クロック源はFDPLL200Mでした。
全てのクロックソースは32.768 kHzのXOSC32K水晶からGCLKxで逓倍され、DFLL48MやFDPLL200Mに分配されます。
DFLL48Mは1系統のみで48 MHzを出力するクロックソースです。
FDPLL200Mは2系統あり48 MHz ~ 200 MHzまで任意に出力可能なクロックソースです。
32.768kHz, 8MHz, or 48MHz External Crystal for D51 - avrfreaks
TCは3系統が使えます。
TC3TC4TC5
プリスケーラは以下から選択可能です。
1 (TC_CLOCK_PRESCALER_DIV1)2 (TC_CLOCK_PRESCALER_DIV2)4 (TC_CLOCK_PRESCALER_DIV4)8 (TC_CLOCK_PRESCALER_DIV8)16 (TC_CLOCK_PRESCALER_DIV16)64 (TC_CLOCK_PRESCALER_DIV64)256 (TC_CLOCK_PRESCALER_DIV256)1024 (TC_CLOCK_PRESCALER_DIV1024)
カウンタサイズは以下の3つから選択可能です。
8 bit (TC_COUNTER_SIZE_8BIT)16 bit (TC_COUNTER_SIZE_16BIT)32 bit (TC_COUNTER_SIZE_32BIT)
タイマチャネルは以下2つから選択可能です
0 (TC_CALLBACK_CC_CHANNEL0)1 (TC_CALLBACK_CC_CHANNEL1)
32 bitカウンタが使えるので、コンパレータと組み合わせて微調整が出来ます。
が、32 bitは試したところ上手く動かなかったので検証中です。
【追記】
32 bitカウンタは偶数タイマでしか使えないとの記載がありました。
つまり、このライブラリだとTC4でのみ使えるという事になります。
コード
# include "Adafruit_ZeroTimer.h"
// Timerインスタンスを作成
Adafruit_ZeroTimer tc3 = Adafruit_ZeroTimer(3);
// Adafruit_ZeroTimer tc4 = Adafruit_ZeroTimer(4);
// Adafruit_ZeroTimer tc5 = Adafruit_ZeroTimer(5);
// これが無いと動かなかったのでおまじない
void TC3_Handler(){
Adafruit_ZeroTimer::timerHandler(3);
}
// void TC4_Handler(){
// Adafruit_ZeroTimer::timerHandler(4);
// }
// void TC5_Handler(){
// Adafruit_ZeroTimer::timerHandler(5);
// }
// 割込コールバック
void tc3Callback(){
Serial.print(".");
}
void setup(){
Serial.begin(115200);
while(!Serial);
// タイマ設定
// プリスケーラ: 2
// カウンタ: 16bit
// 波形生成: PWM (あまり気にしないでOK)
tc3.configure(TC_CLOCK_PRESCALER_DIV2, TC_COUNTER_SIZE_16BIT, TC_WAVE_GENERATION_NORMAL_PWM);
// コンパレータ設定
// チャネル: 0
// コンペア値: 0xFFFF
tc3.setCompare(0, 0xFFFF);
// コールバック設定
// チャネル: 0
// コールバック関数: tc3Callback
tc3.setCallback(true, TC_CALLBACK_CC_CHANNEL0, tc3Callback);
// 割込ループ開始
tc3.enable(true);
}
void loop(){}
// 割込周期T
// 48000000 (Hz)
// 2 (PreScaler)
// 65536 (16bit)
// 48000000 / 2 / 65536 = 366.21 (Hz)
// 1 / 366.21 = 0.00273 (s)
シリアル接続すると.が無限に出力されると思います。
オーバークロックと最適化
コンピュータオタクのサガ、速さは正義。
つい最近のツールチェインアップデートで、SAMD51 のオーバークロック関連が解禁されたので、早速試してみます。
要件
- Adafruit SAMD Boards v1.4.0 ~
インストール
ArduinoIDE の "ボードマネージャ" で、Adafruit SAMD Boardsを最新にしておきます。
設定
Cache
キャッシュを有効化する事で、通常 FlashROM からより高速なアクセスが可能となります。
デフォルトで有効化されているので、そのままで問題ありません。
-
Enable(Default) Disable
CPU Speed
CPU のオーバークロック設定です。
試したところ200 MHzでも発熱や異常終了はありませんでした。
-
120 MHz(Default) 150 MHz180 MHz200 MHz
Optimize
コンパイラの最適化設定です。
Fastestまではバイナリ互換性がありますがHere be dragonsでは互換性が損なわれ、実行エラーを招く可能性がある、との事です。
-
Small (-Os)(Default) Fast (-O2)Faster (-O3)Fastest (-Ofast)Here be dragons (-Ofast -funroll-loops)
Max SPI
SPI バスのオーバークロック設定です。
結構デリケートなので50 MHzにすると大半の機器が動かなくなるとの事です。
デフォルトの24 MHzが推奨されています。
24 MHz(Default)50 MHzCPU Speed / 2
2019/07/25追記
Max SPI の項目はいつの間にか削除されていました。
Max QSPI
QSPI バスのオーバークロック設定です。
と言っても、接続されているのはボード上の SPI Flash だけなのですが。
-
50 MHz(Default) CPU Speed / 2
ToDo...
I2S と DMA ライブラリの検証をしているので、動くようになったら記事にまとめようと思います。

