ゆっくりしていってね
問題:USART1 と USART3 の DMA 受信機能は、電源投入直後は動作せず、手動でリセットボタンを押して初めて正常に動作する。
分析:これは「DMA+アイドル割り込み」方式における典型的な「競合状態」の問題です。原因は以下の通りです。
解決策:DMA 受信を開始し、アイドル割り込みを有効にする前に、USART のアイドルフラグビットを強制的に 1 回クリアします。コードは以下の通りです。
問題分析:フラグをクリアするコードを追加しても、Init 関数内に配置すると効果は依然として理想的ではありません。その深い原因は以下の通りです。
main 関数内で、MX_USART1_UART_Init の実行が完了した後、プログラムは他のペリフェラルの初期化 (MX_I2C2_Init, MX_USART3_UART_Init など) を継続して実行します。解決策:
MX_..._Init() 関数から、ビジネス起動に関連するすべてのコード(HAL_UARTEx_ReceiveToIdle_DMA など)を削除し、純粋なハードウェアパラメータ設定のみを担当させます。main 関数の /* USER CODE BEGIN 2 */ 領域に統合して移動します。結果:すべてのハードウェアペリフェラルの設定が完了し、システムが安定状態に入った後に、UART DMA 受信などのアプリケーション層タスクを開始することを保証します。プログラムの動作は信頼性が高く、期待通りになります。

更新: 2 つのシリアルペリフェラルの初期化の前に HAL_Delay(500); 遅延関数を 1 行追加する必要があります。そうしないと、USART3 の DMA 受信も無効になる可能性があります。
MX_..._Init 関数には 1 つのことだけをさせます——CubeMX の設定に基づいてハードウェアレジスタを設定し、ハードウェアを「待機」状態にします。main 関数内で、すべてのハードウェア設定が完了したのを待ってから、ビジネスロジックの順序に従ってそれらを起動します(DMA の有効化、タイマー PWM の開始など)。2 番目の原則に従うことで、調査が困難な組み込みシステムの初期化問題の 90% 以上を回避でき、コードがプロフェッショナルで堅牢になるための必須の道となります。