STM32のUSART(UART)割り込みフラグをクリアしますか?


8

STM32F105を使用して、UARTを使用するLinx GPSチップと通信しています。

割り込みを使用しない場合(RXフラグをポーリングするだけの場合)、問題なく動作します。しかし、割り込みを使用しようとすると、予期しない結果が発生します。

たとえば、を使用してRXNE(「RX not empty」)割り込みのみを有効にする場合USART_ITConfig(USARTx, USART_IT_RXNE)、コードはこの1つの特定のイベントのISRにのみベクターする必要があります。ただし、割り込みはオーバーラン状態でもトリガーされます。

フラグをクリアする限り、メソッドはフラグに依存しているようです。オーバーランフラグ(USART_IT_ORE)をクリアするには、ユーザーマニュアルに、最初にUSARTx_SRレジスタを読み取ってからレジスタを読み取るべきと説明USARTx_DRされています。これは機能します。フラグはクリアされます。

USART_ClearITPendingBit()関数もありますが、フラグの小さなサブセットしか受け入れません。

選択的に有効にできる8つの異なる割り込みソースと、10の異なるフラグがあります。 これらのフラグをすべて管理する方法の概要はどこにありますか?

回答:


16

一般的には、特にで有効にした割り込みフラグを処理するだけで済みますUSART_ITConfig()

ただし、RXNE割り込み(USART_ITConfig(USARTx, USART_IT_RXNE))を有効にすると、オーバーラン割り込み有効になります!したがって、これらの両方を処理する必要があります。

intmap

USARTフラグは紛らわしい場合があります。個別のステータスフラグと割り込みフラグがあり、それらは同様の名前を共有します。例:USART_IT_RXNEおよびUSART_FLAG_RXNE

さらに、これらのフラグをクリアするさまざまな方法があります。たとえば、USART_ClearITPendingBit()関数は4つの(10のうちの)可能なフラグに対してのみ機能します。

割り込みフラグとその使用方法の概要を以下に示します。これらはSTM32F105に固有のものですが、代表的なものです。


USART_IT_TXE-「送信データレジスタが空です」

  • 呼び出すと自動的にクリアされます USART_SendData()

USART_IT_RXNE-「受信データレジスタが空ではありません」

  • 呼び出すと自動的にクリアされます USART_ReceiveData(USARTx)

  • 呼び出すことで手動でクリアできます USART_ClearITPendingBit(USARTx, USART_IT_RXNE)


USART_IT_TC-「送信完了」

  • 以下によって自動的にクリアされます。

    • USART_GetITStatus(USARTx, USART_IT_TC) に続く
    • USART_SendData()
  • を呼び出すことで手動でクリアすることもできます USART_ClearITPendingBit(USARTx, USART_IT_TC)


USART_IT_CTS- "CTS変更"

  • 呼び出しによりクリア USART_ClearITPendingBit(USARTx, USART_IT_CTS)

USART_IT_LBD-「LINブレークが検出されました」

  • 呼び出しによりクリア USART_ClearITPendingBit(USARTx, USART_IT_LBD)

USART_IT_PE-「パリティエラー」

  • クリア:
    • USART_GetITStatus(USARTx, USART_IT_PE) に続く
    • USART_ReceiveData(USARTx)

USART_IT_NE-「ノイズエラー」

  • クリア:
    • USART_GetITStatus(USARTx, USART_IT_NE) に続く
    • USART_ReceiveData(USARTx)

USART_IT_ORE-「オーバーランエラー」

  • クリア:
    • USART_GetITStatus(USARTx, USART_IT_ORE) に続く
    • USART_ReceiveData(USARTx)()

USART_IT_IDLE-「アイドルラインが検出されました」

  • クリア:
    • USART_GetITStatus(USARTx, USART_IT_IDLE) に続く
    • USART_ReceiveData(USARTx)()

ええ、私は自分の質問に答えました:)このようなリストを以前に見つけていたら、かなりの時間を節約できたでしょう。誰かのお役に立てば幸いです。
ビットマック

2
この答えは金です​​。これらの各割り込みをクリアする方法の非常に明確なリファレンス。
jjmilburn 2016

2

この問題に関する私の経験を少し追加したいので、私は指示に従います:

USART_IT_ORE-「オーバーランエラー」

クリアしたもの:USART_GetITStatus(USARTx、USART_IT_ORE)に続いてUSART_ReceiveData(USARTx)()

動作していないようですが、代わりに次のコマンドで動作します:

USART_GetFlagStatus(USARTx、USART_IT_ORE)に続いてUSART_ReceiveData(USARTx)

関数を見ると:

USART_GetFlagStatus()およびUSART_ReceiveData()

Bitsmackが正確に以前に書いたものを見つけるでしょう...「最初にUSARTx_SRレジスタを読み取ってから、USARTx_DRレジスタを読み取ってください。」

うまくいけば、あなたのために動作し、この問題で多くの時間を節約できます。=)


情報ありがとうございます!USART_GetFlat()を認識しません。どこから来たのか教えてもらえますか?
ビットマック2018年

コマンドを誤って入力してしまい、申し訳ありません。USART_GetFlagStatus()の後にUSART_ReceiveData()を入力する必要があります。元の投稿が修正されました。Bitsmackに感謝します。
LostInCoding 2018年

優れたありがとう!関数名が変更されたようです。標準ペリフェラルライブラリまたはいずれかのSTMCube HALを使用していますか?マイクロコントローラのどのファミリですか?
ビットマック2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.