昨日から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だなぁ・・・
かしこ
murasaki
返信削除これがflush絡みの不具合とはなかなか分からないですね〜(>.<)
割り込みで1バイトづつ拾ってくるなら簡単でいいですけど、システム関数やDMAなどが絡むと泣きたくなりそうです。
自分だったら解決まで1週間コースかも。1日では絶対解決できない自信があります。
STM32でフラグクリアで治るトラブルって時々出ます
削除でも今回はDR falushだもんなfuckだな
それにしてもahirasakにはムカつきます
オレは「あひらさく」じゃねぇみたいな
murasaki
削除flush絡みだと後ろが欠けたりとかしそうですが、位置関係が入れ替わるのはオカルトチック。頭抱えますね。
どうせなら桜咲くくらいオシャレに文字化けしてほしい(ほしくない)。
SRAMちゅうてもシフトレジスタなんでしょう
削除なかなか凝った設計だ