2025年10月20日月曜日

STM32 UART DMA/IT 受信BYTEシフト問題

昨日からSTM32H743のUART通信で困っていま~す.

条件:
TX: STM32H743のUART 2Mbps
RX: 別のSTM32H743のUART 2Mbps

2Mbpsが高速すぎる系のいわゆるbit化けではないです.

症状:
"hirasaka"を送信
受信したら、"ahirasak"になっている 右ズレ+先頭は不定

UARTはさんざ使ってきましたけど、こうゆう症状は初めてです.

受信buffer領域を別のtaskが食いつぶしているわけではなさそうなのはmapを見たりして確認したのと、食い潰しだとしても1つズレるのはあり得なくない?

送信は正常です.オシロで確認.

ーーーー
いろいろと試行錯誤.

1)bufferを4BYTE boundaryに配置する ←ダメ
__ALIGN_BEGIN  ~ __ALIGN_END は効かなかった

2)受信は関数によりけり
 HAL_UART_Receive_DMA() ←ダメ
 HAL_UART_Receive_IT()  ←ダメ
 HAL_UART_Receive()   ←正常

3)DMA転送をloopで動かすので、2回目以降のDMA起動時にUARTを初期化すると正常
 HAL_UART_DeInit();
 HAL_UART_Init();
 HAL_UART_Receive_DMA();

4)マクロで片っ端からフラグをクリアしてみたが、ダメ
 __HAL_UART_CLEAR_FLAG( ,
   UART_CLEAR_PEF | //     Parity Error Clear Flag
   UART_CLEAR_FEF | //         Framing Error Clear Flag
   UART_CLEAR_NEF | //         Noise detected Clear Flag
   UART_CLEAR_OREF | //        Overrun Error Clear Flag
   UART_CLEAR_IDLEF | //       IDLE line detected Clear Flag
   UART_CLEAR_TXFECF | //      TXFIFO empty clear Flag
   UART_CLEAR_TCF | //         Transmission Complete Clear Flag
   UART_CLEAR_RTOF | //        Receiver Timeout clear flag
   UART_CLEAR_LBDF | //        LIN Break Detection Clear Flag
   UART_CLEAR_CTSF | //        CTS Interrupt Clear Flag
   UART_CLEAR_CMF | //         Character Match Clear Flag
   UART_CLEAR_WUF    //  Wake Up from stop mode Clear Flag
 );
 HAL_UART_Receive_DMA();

5)マクロのDR flushが効いた ←正常
 __HAL_UART_FLUSH_DRREGISTER();
callback関数に飛んできても、data registerに何か残ってるみたいですね.


ほぼ1日ロスった.fuckだなぁ・・・

かしこ

4 件のコメント:

  1. murasaki
    これがflush絡みの不具合とはなかなか分からないですね〜(>.<)
    割り込みで1バイトづつ拾ってくるなら簡単でいいですけど、システム関数やDMAなどが絡むと泣きたくなりそうです。
    自分だったら解決まで1週間コースかも。1日では絶対解決できない自信があります。

    返信削除
    返信
    1. STM32でフラグクリアで治るトラブルって時々出ます
      でも今回はDR falushだもんなfuckだな

      それにしてもahirasakにはムカつきます
      オレは「あひらさく」じゃねぇみたいな

      削除
    2. murasaki
      flush絡みだと後ろが欠けたりとかしそうですが、位置関係が入れ替わるのはオカルトチック。頭抱えますね。
      どうせなら桜咲くくらいオシャレに文字化けしてほしい(ほしくない)。

      削除
    3. SRAMちゅうてもシフトレジスタなんでしょう
      なかなか凝った設計だ

      削除