予想がつかないUSARTさんの続きです.STM32でどのくらいの速度が出るかな?
実装の条件がいくつかあります.
・USART
・別CPU間の伝送 Master→Slave
・USART clockは1MHzと2MHzで速度テスト
・1000BYTEのブロック転送
・Masterはブロックモードで転送
HAL_USART_Transmit(, , 1000,);
HAL_Delay(1);
・SlaveはDMAで受信
HAL_USART_Receive_DMA(, , 1000);
速度テスト結果:
USART clock 1MHz 666kbps
USART clock 2MHz 1140kbps
まぁこんなもんでしょ.使えることをかくにん!
ーーーー
ところでもうひとつの課題があります.
↓こんな感じでhot swapみたいな運用ができなくちゃイヤなんです.
・CPU1とCPU2が別個体
・いつどちらかが電源断するか判らない
・いつどちらかが起動するかも判らない
・それでも正常に通信が復旧すること
・気絶中のデータロストは不問
やってみて判ったこと:
Masterは、起動したらデータ送信を勝手に再開するだけで、他には何もしないでいい.
hangupしてしまうような問題はSlaveにあります.
1)Slaveが再起動したとき →問題なし、受信継続できてる
2)SlaveがDMA受信中にMasterが電源断で消え失せたら →Slave DMAが発狂しちゃう
どうするか?
2-1)パリティなどで受信DMAの発狂を検出できる場合 →USARTを再起動すればOK
HAL_USART_DeInit();
MX_USART2_Init();
注意:HAL_USART_DMAStop()は発狂DMAを正常化する役には立たなかった
2-2)DMAが黙ってhangupする場合 →watchdog的に監視してUSART再起動
ま、こんなもんですかね.
かしこ
ハングアップからのリカバリはCとかのライブラリではあてにならないので、レジスタ直叩きで初期化したりステータス見たりしないといけないかもしれませんね。このあたりをやるとかなり周辺IOの挙動に詳しくなれますが、めちゃくちゃ時間を吸い取られます・・。
返信削除.hファイルにあるマクロ定義がレジスタ直読みstatusとかだったりするのはなんだかな~
削除エヴァンゲリオンには
「再起動」
「まさかっ、暴走」
などの用語がありました
シンクロ率400%