はじめに
Arduino Pro mini 互換ボードで作っていたプログラムが CPU 処理能力、メモリ容量の両方が足りなくなったので Adafruit Trinket M0 に乗り換えた。
Arduino では SoftwareSerial を使っていたのだが Adafruit Trinket M0 では H/W Serial が使えるということだったので、いろいろ探したのだがピッタリのものが見つからない。 Arduino Zero のは何とか見つかり、STM32 を使った Adafruit 向けの情報も見つかったのだがなかなかうまくいかず...。
ということで苦労して動くようにしたのでメモ。
サンプルソース
github にあるので、お急ぎの方はこちらを。
パラメータの定義とオブジェクトの宣言
#define PIN_SERIAL2_RX (2ul) // PA09
#define PAD_SERIAL2_RX (SERCOM_RX_PAD_1)
#define PIN_SERIAL2_TX (0ul) // PA08
#define PAD_SERIAL2_TX (UART_TX_PAD_0)
Uart Serial2( &sercom2, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX ) ;
割り当てたのは Pin 0, 2。なぜか RX が入力なので要注意。他のピンへの割り当ても可能だが、かなり難解。どうしてもという場合はこちらを参考に。
ポートをシリアルポートに割り当て
Serial2.begin(115200);
pinPeripheral(0, PIO_SERCOM_ALT);
pinPeripheral(2, PIO_SERCOM_ALT);
pinPeripheral() で、物理的なピンをSERCOM(CPU 内部のシリアル関連を制御するモジュール)に割り当てる。
割り込みハンドラの追加
void SERCOM2_Handler() {
Serial2.IrqHandler();
}
割り込み側ハンドラはユーザー側のコードで定義が必須。SerialEvent() は、使わない場合は定義しなくてもよいが、Adafruit M0 系にシリアルを追加する場合は割り込みハンドラの定義が必須。これがなくともコンパイラはエラーを吐かないが、プログラムが動かない。
終わりに
コードにすると10行ほどだが、ここまでたどり着くのに半日かかってしまった...。