概要(動機)
LTEモジュールとの通信と、FCとの通信を同時に行いたい。UARTが2本必要。
だが、Portenta単体ではUARTは1本しか出ていない。(ように見えた)
SoftwareSerialも使えない。(使えたとしても使いたくない)
増やすにはBreakoutボードを追加購入する必要がある。(と思った)
Breakoutはそこそこお高い。それに デカい 。
こんなん積みたくない。なんとかならないか。
ワンチップマイコンには、大抵IOピンを入れ替える機能があるはず。
これでなんとかならないか。
最悪レジスタいじってでもなんとかしてやりたい。
GPIO registers(Reference manual、RM0433、11.4 GPIO registers)を見る限り、行けるんじゃね?
結論
レジスタ云々全く必要なかった。
「このピンをこの機能で使いたい」という目線でクラスライブラリが用意されている。それが実際にUART6かどうかはユーザーは気にする必要はない。
ライブラリの設計者天才。感心した。
結果、以下のコードでPC6(D5)をTX、PC7(D4)をRXとする、HardwareSerialが使用できる。(UART6の形跡がないが、実際にはUART6のリソースが使用される)
arduino::UART AdditionalUartWithoutBreakout(PC_6, PC_7, NC, NC);
雑感
辿り着くのに苦労させられた...経験重ねてるのがあだになり、余計なこと考えすぎたのかも知れません。
もちろん、PC6とPC7が、I/OマルチプレクサによってUART6のTX/RXに割り当て可能であるということを読み解く力は必要なわけですが。
全部が全部好きなピンに割り当てられるわけではない。
探し方によってはあっさり見つかったのかもしれませんが。
未だに見つけられていませんが。
一助になれば幸いです。
コードおよび結果
送信だけだが、921600bpsで特に問題は見当たらない。
arduino::UART AdditionalUartWithoutBreakout(PC_6, PC_7, NC, NC);
void setup() {
// put your setup code here, to run once:
AdditionalUartWithoutBreakout.begin(921600);
}
void loop() {
// put your main code here, to run repeatedly:
AdditionalUartWithoutBreakout.println("Hello new HardwareSerial!");
delay(1000);
}