A、USART紹介
ユニバーサル同期非同期送受信機(USART)は、業界標準のNRZ外部機器非同期シリアルデータ形式の間で全二重データ交換を使用する柔軟な方法を提供します。USARTは、選択肢の広い範囲を提供して発電機フラクショナルボーボーレート。
非常に豊富な資源のSTM32の束、かなり強力な機能。STM32F103ZET6はLIN(ローカルインターネット)、スマート・カード・プロトコルとのIrDA(赤外線データ協会)SIR ENDEC仕様、およびモデムをサポートし、フラクショナルボーレートジェネレータ、片方向通信と半二重同期は、単線通信を支えてきた、5つのシリアルポートを提供します(CTS / RTS)動作。それはまた、マルチプロセッサ通信を可能にします。マルチモード構成を使用してバッファDMAは、高速データ通信を実現することができます。
二、USART機能の概要
3本のピンは、他のデバイスとインターフェースで接続されています。受信データ入力(RX)と送信データ出力(TX):任意USART双方向通信は、少なくとも二つの脚部を必要とします。
RX:シリアルデータ入力を受け取ります。データを回復するための技術をオーバーサンプリングすることにより、データとノイズとを区別します。
TX:送信データ出力。送信機が無効になっている場合、出力端子は、I / Oポートの構成に復元されます。送信機が活性化され、データが送信されない場合、TXピンが高いです。そして、インラインスマートカードモードでは、このI / Oポートは、送受信するデータの両方に使用されます。
シリアル・ペリフェラルは、主に3つの部分、すなわち、ボーレート制御部、及び送信から構成され、制御データ記憶部転送部を受け取ります。
1、ボーレートコントロール
ボーレート、すなわちボーレートを変更することができるクロックを制御することによって表されるB / S(BPS)で、毎秒送信されるビットの数。ボーレートを設定する場合、我々は、登録シリアルクロックの分周値USARTDIVを変更するボーレートの書き込みパラメータをUSART_BRR。USART_BRRレジスタは2つの部分、すなわちDIV_Mantissa(USARTDIV整数部)とDIVFractionから成る(USARTDIV小数)部分、最終的には、のように計算されます。
USARTDIV = DIV_Mantissa +(DIVFraction / 16)。
2、ボーレートの画分を生成します
整数および分数USARTDIVレジスタの受信機と送信機のボーレート値は、同一に設定されるべきです。
Tx / Rxボーレート= FCK /(16 * USARTDIV)
FCKここで、周辺クロック(USART2,3,4,5ためPCLK1、USART1ためPCLK2)にUSARTDIVは、符号なしの固定小数点数です。USART_BRRに設定されたこの12ビットのレジスタ値。
注:USART_BRRを書き込んだ後、ボーレートは、ボーレートカウンタレジスタが新しい値に置き換えられます。このように、ボーレートは、通信中にレジスタの値を変更しないでください。
それはAPB2バス、そのクロックソースfPCLK2上に搭載されているので、ためUSART1の周波数を分周シリアルクロックソースUSARTDIV周辺機器であり、APB1 USART2,3に搭載され、クロック・ソースでしたfPCLK1は、分周器を介してUSARTDIVシリアル・クロック・ソースは、送信機クロックと受信機クロックを出力し、受信の制御の送信タイミングを制御します。
図3に示すように、送受信制御
CR1、CR2、CR3、SR、すなわち3つのUSART制御レジスタ(制御レジスタ)とステータスレジスタ(ステータスレジスタ):送信機と受信機制御部、レジスタのかなりの数の周り。さらにUSART割り込みを制御することを含む、等パリティビット、ストップビット、等の各種制御パラメータ、制御の送受信に書き込むことによって、レジスタとステータスレジスタはいつでも照会することができるからシリアル状態が得られます。具体的な制御とステータスチェック、我々が達成するためのライブラリ関数を使用している、これは、これらのレジスタのビットの詳細な分析ではありません。
記憶手段4、転送データ
我々のトランシーバコントローラのコンフィギュレーションレジスタによれば、データ転送部を格納するシフトレジスタを制御します。
我々は送信データにメモリ(変数)からデータを書き込む(次の章でのデータ伝送モード、)データ、またはコアDMAペリフェラルを送信する必要がある場合には、送信制御部は、自動的にタイムリーなデータからTDRを登録TDRは、送信シフトレジスタにロードされ、シリアル回線Txを介して、データをビットごとに送信され、その後、データをシフトレジスタにTDRから転送され、送信レジスタが空TDR TXEイベント、シフトデータで生成する場合送り出されたすべてのレジスタは、これらのイベントは、ステータス・レジスタを確認することができ、データの完了イベントのTCを送信する必要があります。
受信データは、受信ラインRXにシリアルシフトレジスタからのビットによって逆のプロセス、データ入力ビットであり、その後、自動的にデータレジスタに転送メモリまたはDMAコア命令(変数)への最終的な読み出しで、RDRを受信中。
第三に、シリアルポートの設定
IO機能を多重化するために、我々は最初のGPIOモードは、多重化機能に対応するモードに設定ボーレートを含むシリアルポートの初期化パラメータを設定し、ストップビットされるべきである機能を多重化可能GPIOクロックとクロックをイネーブルパラメータ等。シリアルポートを設定した後に有効になります。あなたは、シリアルポートの割り込みを開くと同時に、当然のことながら、NVICを初期化するためには、割り込み優先レベルを設定し、最後に割り込みサービスルーチンを記述すること。
シリアル一般的な手順のセットには、次の手順のようにまとめることができます。
1)シリアルクロックはGPIOクロックイネーブル、イネーブル
2)シリアルリセット
3)GPIOポートモード
4)シリアルポートパラメータを初期化します
5)割り込みを許可し、NVICを初期化(中断有効な場合にのみ、この手順が必要)
6)、シリアルポートを有効にします
7)割り込みハンドラを書きます
直接シリアルポートの基本構成に関連するいくつかのファームウェアライブラリ関数。これらの機能は、主にstm32f10x_usart.hとstm32f10x_usart.cファイルの定義。
1、シリアルクロックイネーブル。
シリアルインタフェースは、イネーブル機能、以下周辺APB2に装着されている:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1)。
2、リセットポート。
ときに例外は、リセットによって提供周辺に周辺のリセットを発生し、次いで、再作業の目的を許可周辺機器を再構成します。一般的に、システムが構成する周辺機器を始めているとき、周辺リセットの最初の操作を実行します。リセットは関数USART_DeInit()で行われます:
無効USART_DeInit(USART_TypeDef * USARTx); //リセットポート
例えば、ポート1、方法リセットする:
USART_DeInit(USART1); //リセットポートを1
図3に示すように、シリアルポートの初期化パラメータ。
USART_Initシリアルポート初期化関数は、()、によって達成される
空隙USART_Init(USART_TypeDef * USARTx、USART_InitTypeDef USART_InitStruct *)。
この関数の最初のエントリのパラメータが指定されたシリアル番号を初期化され、USART1を選択します。第2のパラメータはUSART_InitTypeDef入口構造体ポインタタイプ、シリアルポートのパラメータを設定するには、この構造体のポインタのメンバ変数です。一般的な実装形式:
1 USART_InitStructure.USART_BaudRateが結合。=; //は、一般的に9600に設定し、 2 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8ビットのワード長のデータフォーマット 3 USART_InitStructure.USART_StopBits = USART_StopBits_1; //ストップビット 4 USART_InitStructure.USART_Parity = USART_Parity_Noを; / /なしパリティビット 5 USART_InitStructure.USART_HardwareFlowControl。 6 = USART_HardwareFlowControl_None; //ハードウェアフロー制御なし。 7 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //トランシーバモード 8 USART_Init(USART1、&USART_InitStructureに) ; //は、 シリアルポートを初期化します
ボーレート、ワード長、ストップビット、パリティビット、ハードウェアフロー制御モード(送受信):上記から、フォーマット初期化初期化パラメータを設定する必要が見ることができます。私たちは、これらのパラメータを設定することができます。
図4に示すように、データ送受信。
STM32の送受信は、ダブルレジスタであるUSART_DRを、データレジスタを介して達成TDR及びRDRが含まれます。このレジスタにデータを書き込むと、シリアルポートは自動的にデータを受信したときに、送信されます、また、レジスタ内に存在します。
関数ライブラリ関数STM32送信データレジスタ操作がUSART_DRです:
無効USART_SendData(USART_TypeDef * USARTx、データuint16_t)は、
USART_DR機能を通じてシリアルレジスタにデータを書き込みます。
USART_DRレジスタは受信したシリアルデータの操作を読み取るSTM32ライブラリ関数の関数である:
uint16_t USART_ReceiveData(USART_TypeDef * USARTx);
シリアル受信したデータは、この方法を介して読み出すことができます。
5、ポートの状態。
シリアルステータスは、ステータス・レジスタUSART_SRを通読することができます。USART_SR皆の説明図1:
レジスタ・ビットの図1 USART_SR説明
2つのビット、5位と6位のRXNEとTCを見てください。
このビットがそのデータを受信し、かつ読み出すことができる示唆し、1に設定されているRxNE(リードデータレジスタ空ではありません)。私たちがしなければならない。この時間はUSART_DRを読み取るために、できるだけ早くで、このビットはUSART_DRを読むことによってクリアすることができ、あなたも、このビットへの直接の除去を0を書き込むことができます。
TC送信を表すデータがUSART_DRを完了したときにビットがセットされている(送信終了)。あなたは、割り込みビットを設定した場合、それは割り込みを生成します。1)USART_SRを読んで、書き込みUSART_DR:このビットは、2つの方法がありますが、クリアされます。2)直接書き込み0。
内部の私たちのファームウェアライブラリ関数では、読み出されたシリアルステータス機能は以下のとおりです。
FlagStatus USART_GetFlagStatus(USART_FLAG uint16_t USART_TypeDef * USARTx、);
2番目のエントリは、この機能に重要なパラメータであり、このようなRxNE(リードデータレジスタ空ではない)、およびTC(送信終了)以上説明したようにその状態のシリアルインタフェースを表示することが示されています。例えば、リードレジスタは(RXNE)が空でないかどうかのライブラリ機能を操作する方法を判断します
USART_GetFlagStatus(USART1、USART_FLAG_RXNEを)。
送信(TエンドC)するか否かを決定するために、ライブラリ機能を動作させる方法があります。
USART_GetFlagStatus(USART1、USART_FLAG_TC)。
マクロ定義によって定義されるこれらMDK識別番号:
1の#define USART_IT_PE((uint16_t)0x0028) 2の#define USART_IT_TXE((uint16_t)0x0727) 3の#define USART_IT_TC((uint16_t)0x0626) 4の#define USART_IT_RXNE((uint16_t)0x0525) 5の#define USART_IT_IDLE((uint16_t)0x0424) 6の#define USART_IT_LBD((uint16_t)0x0846) 7の#define USART_IT_CTS((uint16_t)0x096A) 8の#define USART_IT_ERR((uint16_t)0x0060) 9の#define USART_IT_ORE((uint16_t)0x0360) 10の#define USART_IT_NE((uint16_t)0x0260) 11の#define USART_IT_FE((uint16_t)0x0160)
6、シリアルポートが有効になっています。
シリアルポートが有効である()関数は、メソッドが使用され、これは容易に理解される、USART_Cmdによって達成されます。
USART_Cmd(USART1、ENABLE); //シリアルを有効にします
図7は、シリアルポートの割り込み応答を開きます。
時には、シリアルポート割り込みを開くために必要なときに、あなたはまた、シリアルポートの割り込みを有効にする必要があり、割り込みは、シリアルポートの関数である:
(USART_IT、uint16_t USART_TypeDef * USARTx、無効USART_ITConfig
FunctionalState NewStateに)
この関数の2番目のエントリパラメータが標識されている有効化割り込みが許可されているシリアルタイプ、シリアルポートの割り込みは多くの種類がありますので。例えば、割り込み、その後、割り込みがオンされるメソッドを生成するために受信したデータを(RxNEは、データが空でないリードレジスタ):
USART_ITConfig(USART1、USART_IT_RXNE、イネーブル); //割り込みをイネーブル、割り込みデータが受信されます
送信データの終了時に割り込みを生成する(TC、送信が完了している)、この方法は:
USART_ITConfig(USART1、USART_IT_TC、ENABLE)。
8は、対応する割り込みステータスを取得します。割り込みが発生したときに我々は、割り込みを有効にすると、それは、ステータス・レジスタのフラグを設定します。私たちはしばしば、割り込みハンドラ、割り込みが割り込み機能を使用するかを決定することである:
(USART_IT uint16_t USART_TypeDef * USARTx、)ITStatus USART_GetITStatus。
割り込みが発生した場合たとえば、完全な割り込みを送信するためにシリアルポートを有効にするために、そして、あなたは終わりにする方法割り込みシリアル送信完了があるかどうかを判断するために、割り込みハンドラ内で、この関数を呼び出すことができます。
USART_GetITStatus(USART1、USART_IT_TC)。
戻り値は、命令は、完全なシリアルポート割り込みが発生している、SETです。
四、uart_init()関数
次のように紹介uart_init機能は、どのコードです:
//初期化GPIO及びシリアルポート1 1 2 @結合:ボー 。3ボイドuart_init(U32に結合) 。4 { 5 GPIO_InitTypeDef GPIO_InitStructure; 6 USART_InitTypeDef USART_InitStructure; 7 NVIC_InitTypeDef NVIC_InitStructure; 8①//シリアルクロックイネーブル、クロックは、GPIOを有効にしますクロックイネーブル多重 9 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | 10 RCC_APB2Periph_GPIOA、ENABLE); // USART1、GPIOAクロックをイネーブル 11 //②リセットポート 12 USART_DeInit(USART1); //リセットポート1。 13である③GPIOポートモード// 14 = GPIO_Pin_9 GPIO_InitStructure.GPIO_Pin; // ISART1_TX PA.9 15 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 16 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //プッシュプル出力多重 17 GPIO_Init(GPIOA、&GPIO_InitStructure) ; // 初期化GPIOA.9 27 = USART_HardwareFlowControl_None; //ないハードウェアフロー制御 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 18であり; // USART1_RX PA.10 19 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //フローティング入力 20 GPIO_Init(GPIOA、&GPIO_InitStructureは) ; // 初期化GPIOA.10 21である④//初期化シリアルポートパラメータ 22 USART_InitStructure.USART_BaudRate =結合; //設定ボーレート 23 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //ワード長が8ビットである 24 USART_InitStructure.USART_StopBits = USART_StopBits_1;ストップビット// 25 USART_InitStructure.USART_Parity = USART_Parity_No; //パリティなし 26 USART_InitStructure.USART_HardwareFlowControl 28 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //モードトランシーバ 29 USART_Init(USART1、&USART_InitStructure) ; //は、 シリアルポートを初期化します 30の#if EN_USART1_RX //もし使用可能な受信器 31 //⑤初期化NVIC 32 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 33 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; //先取り優先順位3 34 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子の優先順位3 35 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQが通路イネーブル 36 NVIC_Init(&NVIC_InitStructureを); //割り込み優先レベルを初期化する 37 //⑤割り込みイネーブル (USART1、USART_IT_RXNE ENABLE 38 USART_ITConfig ); // 割り込みをイネーブル #endifの39 40 / /⑥シリアルイネーブル 41 USART_Cmd(USART1、イネーブル); // シリアルポートイネーブル 42を}
我々の以前に記載さと一致プロセスのシリアルポートを初期化コードから見ることができます。私たちは、シーケンスをマーク番号①〜⑥を使用します。
①シリアルクロックイネーブル、GPIOクロックイネーブル
②シリアルリセット
③GPIOポートモード
④ポートの初期化パラメータを
NVICに⑤初期化し、割り込みが有効に
シリアルを有効⑥
第五に、
図1に示すように、全二重シリアルポートを設定する1
TX(PA9)ピンはプッシュプル出力多重化として設定します。
入力またはプルなどの入力端子をフローティングRX(PA10)。
モード設定表1は、以下を参照してください。
表1モードGPIOポート構成テーブル
2、あなたは(デフォルト設定は1である)EN_USART1_RX 1 usart.h設定しなければならない割り込み受信、シリアルポートを使用する場合は注意してください。この機能は有効割り込みの設定、およびシリアルポート1 NVIC割り込みを開きます。ここでシリアルポート1割り込みグループ2において、最も低い優先順位グループ2は、内部に設定されています。
その後、割り込みサービスルーチンを記述する必要があります。USART1_IRQHandler 1のシリアル割り込みサービスルーチン。
以下の2つの文では3、フォーカスルックミアン()関数:
USART_SendData(USART1、USART_RX_BUF [T] ); // 送信データのシリアルポートには、1。
しばらく(USART_GetFlagStatus(USART1、USART_FLAG_TC)= SET!)。
最初の文は、実際には、シリアルポートにバイトを送信することです。第二文、我々はデータが完成送信されたかどうかを検出することが、後にシリアルポートに我々のデータを送信します。USART_FLAG_TCデータ伝送は、マクロ定義の識別子を完了する。