USARTの送信側に2つのレジスタがあり、1つはプログラムが認識できるUSART_DRレジスタ、もう1つはプログラムが認識できないシフトレジスタです。USARTデータ送信に対応する2つのフラグがあり、1つはTXE =送信データレジスタが空ですもう1つはTC =伝送の終了です。
USART_DRのデータがシフトレジスタに転送されると、TXEが設定されます。このとき、シフトレジスタはビット単位でTX信号ラインにデータを送信し始めますが、TDRが空になったため、プログラムは次の送信バイトを送信できます(操作USART_DR)は、シフトレジスタのすべてのビットの送信が終了するのを待たずにTDRに書き込まれます。すべてのビットが送信されると(ストップビットが送信された後)、ハードウェアがTCフラグを設定します。
一方、USARTが初期化されたばかりでデータが送信されていない場合は、送信データレジスタが空であるため、TXEフラグもあります。TXEIEとTCIEの意味は非常に単純です。TXEIEでは、TXEフラグが「1」のときに割り込みを生成でき、TCIEでは、TCフラグが「1」のときに割り込みを生成できます。
どのロゴをいつ使用するかについては、必要に応じて決定する必要があります。しかし、TXEを使用すると、プログラムがTDRレジスタに入力して、中断のないデータフローを確保できるようになります。TCは、プログラムに送信が終了する正確な時間を知らせることができます。これは、プログラムが外部データフローのタイミングを制御するのに役立ちます。
TXE-書き込みレジスタDRがクリアされました
RXNE-クリアするレジスタDRを読み取り、ソフトウェアで手動でクリアすることもできます
TC--読み取り/書き込みレジスタDRがクリアされるか、ソフトウェアで手動でクリアできます
まず、TCについてお話ししましょう。それが送信完了です。割り込みは、「送信後の割り込み」と呼ばれるバイトの送信後に入力されます。元のTIメソッド8051と同じように、送信後に割り込みが送信されますが、割り込みをトリガーするには、送信関数でバイトを送信する必要があります。送信機能は次のとおりです
/ *******
機能:文字列を送信する割り込みモード。TC の判定方法を使用します。つまり、送信後に割り込みビットを判定します。
入力:文字列の最初のアドレス
出力:いいえ
***
void USART_SendDataString(u8 * pData)
{
pDataByte = pData;
USART_ClearFlag(USART1、USART_FLAG_TC); //送信完了フラグをクリアしないと、最初のバイトのデータが失われる可能性があります
。netizensによって提供されます。USART_SendData(USART1、*(pDataByte ++) ); // ++でなければならず、そうでない場合、最初の文字tは2回送信されます
}
割り込みハンドラー関数は次のとおりです
/ ********
*関数名:USART1_IRQHandler
*説明:この関数はUSART1グローバル割り込み要求を処理します。
*入力:なし
*出力:なし
*戻り:なし
********* /
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1、USART_IT_TC)== SET)
{
if(* pDataByte == '\ 0')// TCはSRを読み取り、0をクリアするためにDRに書き込む必要があり、最後に送信されたら、 '\ 0に移動します'ifを使用して
USART_ClearFlag をオフにする(USART1、USART_FLAG_TC); //それ以外の場合、TCは常に設定されており、TCIEも開いているため、継続的に中断されます。それをクリアすると、TCIEをオフにする必要がありませ
ん
。USART_SendData(USART1、 * pDataByte ++);
}
}
ここでu8 * pDataByte;は
、割り込みハンドラーの外部ポインター変数です。文字列を送信した後、TC割り込みを閉じてTCIEを有効にする必要はありません。フラグビットTCをクリアするだけで、これを回避できます。 TC == SETにより、エントリの中断が繰り返し発生しました。
void USART_Config()
{
........................................
USART_ITConfig(USART1、USART_IT_TC、ENABLE); // Tramsimssion Complete、割り込みが生成されます。TC割り込みをここに配置する必要があります。そうしないと、最初のバイトが失われます
USART_Cmd(USART1、ENABLE); // USART1を有効にします
}
................................................................. ...................
TXEの審査について話しましょう。つまり、Tx DR空、送信レジスタは空です。TXEIEが有効な場合、Tx DRが空である限り、割り込みが生成されます。したがって、文字列を送信した後はオフにする必要があります。オフにしないと、エントリの中断が繰り返されます。これもTCとは異なります。
送信機能は次のとおりです
。/ *******
機能:割り込みモードで文字列を送信します。TC の判定方法を使用します。つまり、送信後に割り込みビットを判定します。
入力:文字列の最初のアドレス
出力:いいえ
****** /
void USART_SendDataString(u8 * pData)
{
pDataByte = pData;
USART_ITConfig(USART1、USART_IT_TXE、ENABLE); //送信レジスタが空である限り、常に割り込みが発生するため、データを送信しない場合は、送信割り込みをオフにします。送信開始時にのみ開かれます。
}
割り込みハンドラー関数は次のとおりです:
/ ********
*関数名:USART1_IRQHandler
*説明:この関数はUSART1グローバル割り込み要求を処理します
*入力:なし
*出力:なし
*戻り値:なし
******* * /
void USART1_IRQHandler(void)
{
if(USART_GetITStatus(USART1、USART_IT_TXE)== SET)
{
if(* pDataByte == '\ 0')//最後に送信されるバイトはNULL
USART_ITConfig(USART1、USART_IT_TXE、DISABLE); //送信されるためレジスタは空なので、文字列を送信した後はオフにする必要があります。そうでない場合は、空である限り、割り込みに入り
ます。それ以外は
USART_SendData(USART1、* pDataByte ++);
}
}
シリアルポート初期化関数では、TXE割り込みを開く必要はありません(送信機能で開く)