STM 32 C ubeMX+HALライブラリデバッグシリアルポートについてのまとめ
2762 ワード
CubeMXバージョンは5.3.0チップがSTM 32 H 750ファームウェアバージョンSTM 32 CUBE FW_H7 V1.5.0
主に調整に時間がかかったので、貴重だと思って覚えておきます.2つの部分に分けられ、1つはシリアルポート印刷であり、1つはシリアルポート中断受信である.シリアルポート印刷は、標準ライブラリの書き方と同様に、言うまでもなく、呼び出された送信インタフェースがHAL_であるUART_Transmit. ここで注意が必要なのはHAL_UART_Transmitインタフェース呼び出し時、いや、HALライブラリであるべき通信外付けインタフェースの多くは呼び出し時にwhileループで外付け操作OK(HAL_OK)を待つべきであり、HAL_を使用するUART_GetStateは、UARTハンドルの状態がHALに戻るまで待機します.UART_STATE_READY.もちろんもっと良い処理方法はwhileの中でタイムアウトカウントをして、タイムアウトはerror_を実行しますhandle処理してbreakします.ここで注意したいのは、シリアルポートの初期化の際には、できるだけ前に置いて実行し、周辺機器の初期化は個人ユーザーの初期化操作よりも優先しなければならない.そうしないと、周辺機器が使用できなくなる.
シリアルポート中断受信ネット上では多くのことを話していますが、正点原子を含むルーチンも問題ありません.ただ、私のこの実現する要求は違います.送信頻度が速く、中断受信はいつでも現れる可能性があります.だから、ネット上の方法は私が試したことがありません.表現は3種類あります:1つはトリガが中断するたびに、直接ハングアップして、debugはプログラムカードがwhileサイクルHAL_で死んでいることを発見しますUART_GetStateがHAL_に等しくないUART_STATE_READY. 二つ目はwhileサイクル待ちを加えず、中断して中に入るだけで、まだ走っているが、二度と中断しないことだ.三つ目は私が調整した時にシリアル受信が中断されて閉鎖されたと思って、stm 32 xxx_it.cファイルのシリアルポート総中断HAL_UART_IRQHandler関数の後に文_を付けました.HAL_UART_ENABLE_IT(&huart8, UART_IT_RXNE); プログラムが停止しないで総中断に入ることになります.実はこれらのUARTから導出されたマクロ操作は、HALライブラリのインタフェースに統合されており、標準ライブラリのように自分で書く必要はありません.例えばHAL_UART_Receive_ITというインタフェースでは、初期化時に一度実行することが知られています.割り込み受信バッファの位置とサイズを定義するために使用されます.受信割り込みをオンにし、2層をカプセル化した受信割り込みコールバック関数HAL_も含まれています.UART_RxCpltCallback. HAL_といえばUART_RxCpltCallback、もう一つ補足するのはこの関数を書いて別の場所でもう一つ同じ名前を取ればいいので、コンパイルは持っていません_Weakの関数は準です.HALライブラリの内容を変更してCubeMXを使用してコードを生成すると、変更箇所が消えてしまいますので、プラス/user code begin、end/を追加しても無駄です.
デバグの後、実はプログラムがHALで死んだことに気づいた.UART_Receive_ITの中の_HAL_LOCK(huart)の手には、このマクロが多くのシリアル操作の中にあり、他の周辺機器にも似たようなロックがあることが分かった.いくつかの重要な操作ではロックされ、操作が完了してから解除されます.もちろん、シリアル送受信の操作も含まれています.そこで、こちらのシリアルポートはデータを更新するために絶えず送信する必要がありますが、受信割り込みはいつでも発生する可能性があります.受信割り込みが送信鍵がかかった後、ロックが解除される前に発生すれば、受信割り込みはデータを受信できません.そして_HAL_LOCK(huart)は、鍵がかかっていることを検出した後、HALステータスビットBUSYに戻り、私が書いたwhileサイクルが詰まった場合を検出します.これで一和二の現象が通じる.ネット上で言う中断オーバーフローについては、遭遇しなかった.もし出会ったらHAL_UART_CLEAR_IT(&huart 8,UART_CLEAR_OREF)はフラグビットをクリアする.
また、シリアルポート印刷は割り込み処理関数に表示されないようにしてください.また、印刷の頻度が速すぎるとHAL_になります.UART_TransmitはHAL_を返すことができませんOK.
ここでの解決策は
主に調整に時間がかかったので、貴重だと思って覚えておきます.2つの部分に分けられ、1つはシリアルポート印刷であり、1つはシリアルポート中断受信である.シリアルポート印刷は、標準ライブラリの書き方と同様に、言うまでもなく、呼び出された送信インタフェースがHAL_であるUART_Transmit. ここで注意が必要なのはHAL_UART_Transmitインタフェース呼び出し時、いや、HALライブラリであるべき通信外付けインタフェースの多くは呼び出し時にwhileループで外付け操作OK(HAL_OK)を待つべきであり、HAL_を使用するUART_GetStateは、UARTハンドルの状態がHALに戻るまで待機します.UART_STATE_READY.もちろんもっと良い処理方法はwhileの中でタイムアウトカウントをして、タイムアウトはerror_を実行しますhandle処理してbreakします.ここで注意したいのは、シリアルポートの初期化の際には、できるだけ前に置いて実行し、周辺機器の初期化は個人ユーザーの初期化操作よりも優先しなければならない.そうしないと、周辺機器が使用できなくなる.
シリアルポート中断受信ネット上では多くのことを話していますが、正点原子を含むルーチンも問題ありません.ただ、私のこの実現する要求は違います.送信頻度が速く、中断受信はいつでも現れる可能性があります.だから、ネット上の方法は私が試したことがありません.表現は3種類あります:1つはトリガが中断するたびに、直接ハングアップして、debugはプログラムカードがwhileサイクルHAL_で死んでいることを発見しますUART_GetStateがHAL_に等しくないUART_STATE_READY. 二つ目はwhileサイクル待ちを加えず、中断して中に入るだけで、まだ走っているが、二度と中断しないことだ.三つ目は私が調整した時にシリアル受信が中断されて閉鎖されたと思って、stm 32 xxx_it.cファイルのシリアルポート総中断HAL_UART_IRQHandler関数の後に文_を付けました.HAL_UART_ENABLE_IT(&huart8, UART_IT_RXNE); プログラムが停止しないで総中断に入ることになります.実はこれらのUARTから導出されたマクロ操作は、HALライブラリのインタフェースに統合されており、標準ライブラリのように自分で書く必要はありません.例えばHAL_UART_Receive_ITというインタフェースでは、初期化時に一度実行することが知られています.割り込み受信バッファの位置とサイズを定義するために使用されます.受信割り込みをオンにし、2層をカプセル化した受信割り込みコールバック関数HAL_も含まれています.UART_RxCpltCallback. HAL_といえばUART_RxCpltCallback、もう一つ補足するのはこの関数を書いて別の場所でもう一つ同じ名前を取ればいいので、コンパイルは持っていません_Weakの関数は準です.HALライブラリの内容を変更してCubeMXを使用してコードを生成すると、変更箇所が消えてしまいますので、プラス/user code begin、end/を追加しても無駄です.
デバグの後、実はプログラムがHALで死んだことに気づいた.UART_Receive_ITの中の_HAL_LOCK(huart)の手には、このマクロが多くのシリアル操作の中にあり、他の周辺機器にも似たようなロックがあることが分かった.いくつかの重要な操作ではロックされ、操作が完了してから解除されます.もちろん、シリアル送受信の操作も含まれています.そこで、こちらのシリアルポートはデータを更新するために絶えず送信する必要がありますが、受信割り込みはいつでも発生する可能性があります.受信割り込みが送信鍵がかかった後、ロックが解除される前に発生すれば、受信割り込みはデータを受信できません.そして_HAL_LOCK(huart)は、鍵がかかっていることを検出した後、HALステータスビットBUSYに戻り、私が書いたwhileサイクルが詰まった場合を検出します.これで一和二の現象が通じる.ネット上で言う中断オーバーフローについては、遭遇しなかった.もし出会ったらHAL_UART_CLEAR_IT(&huart 8,UART_CLEAR_OREF)はフラグビットをクリアする.
また、シリアルポート印刷は割り込み処理関数に表示されないようにしてください.また、印刷の頻度が速すぎるとHAL_になります.UART_TransmitはHAL_を返すことができませんOK.
ここでの解決策は
/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART8)
{
uint32_t timeout = 0;
uint32_t maxDelay = 0x1FFFF;
while(HAL_UART_Receive_IT(&huart8, Screen.R_Data, 1) != HAL_OK)
{
if(HAL_UART_Receive_IT(&huart8, Screen.R_Data, 1) == HAL_BUSY)
{
timeout++;//
if(timeout > maxDelay)
{
__HAL_UNLOCK(huart);//
}
}
else
{
timeout++;//
if(timeout > maxDelay)
{
printf("
ScreenReceiveError!
");
break;
}
}
}
}
}