2025年4月13日日曜日

STM32 USARTその後、速度テストなど

予想がつかない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再起動


ま、こんなもんですかね.

かしこ

2 件のコメント:

  1. ハングアップからのリカバリはCとかのライブラリではあてにならないので、レジスタ直叩きで初期化したりステータス見たりしないといけないかもしれませんね。このあたりをやるとかなり周辺IOの挙動に詳しくなれますが、めちゃくちゃ時間を吸い取られます・・。

    返信削除
    返信
    1. .hファイルにあるマクロ定義がレジスタ直読みstatusとかだったりするのはなんだかな~

      エヴァンゲリオンには
      「再起動」
      「まさかっ、暴走」
      などの用語がありました

      シンクロ率400%

      削除