- UART通信の基礎
- ハードウェア要件とセットアップ
- Nuvoton N76E003UART通信の回路図
- NuvotonN76E003マイクロコントローラーのUARTピン
- NuvotonN76E003マイクロコントローラーのUARTレジスタ
- N76E003のUART動作モード
- UART通信用のNuvotonN76E003のプログラミング
UARTはUniversalAsynchronous Receiver / Transmissionの略で、あらゆるマイクロコントローラーユニットで役立つハードウェア機能です。マイクロコントローラは、データを受信して処理し、他のデバイスに送信する必要があります。マイクロコントローラで使用できる通信プロトコルにはさまざまな種類がありますが、SPIやI2Cなどの他の通信プロトコルの中でUARTが最も使用されています。誰かがデータをシリアルに送受信する必要がある場合、UARTは常に最も単純で一般的なオプションです。UARTの利点は、デバイス間でデータを送信するために2本のワイヤしか必要としないことです。Nuvotonマイクロコントローラーチュートリアルを続けて、この記事では、N76E003マイクロコントローラーを使用してシリアル通信を実行する方法を学習します。
UART通信の基礎
UARTとは何かがわかっているので、UARTに関連するパラメータを知ることが重要です。
2つのUARTデバイスが同じ周波数でデータを送受信します。受信UARTデバイスがスタートビットを検出すると、ボーレートと呼ばれる特定の周波数で着信ビットの読み取りを開始します。ボーレートはUART通信にとって重要なものであり、データ転送の速度をビット/秒(bps)で測定するために使用されます。送信と受信のこのボーレート速度は、同じボーレートである必要があります。送信UARTと受信UARTのボーレート速度の差は、ビットのタイミングが大きく外れる前に約10%しかありません。最も一般的なボーレート速度は4800、9600、115200 bpsなどです。以前は、以下にリストされている他の多くのマイクロコントローラーでもUART通信を使用していました。
- ATmega8とArduinoUno間のUART通信
- 2つのATmega8マイクロコントローラー間のUART通信
- PICマイクロコントローラーを使用したUART通信
- STM8SマイクロコントローラーでのUART通信
N76E003には、UART0とUART1の2つのUARTがあります。このチュートリアルでは、N76E003マイクロコントローラユニットでUARTペリフェラルを使用します。時間を無駄にすることなく、このアプリケーションに必要なハードウェアのセットアップの種類を評価しましょう。
ハードウェア要件とセットアップ
このプロジェクトに必要な主要コンポーネントは、USBからUARTまたはTTLへのコンバーターモジュールであり、PCまたはラップトップとマイクロコントローラーモジュールの間に必要なインターフェイスを作成します。このプロジェクトでは、以下に示すCP2102ベースのUSB toUARTモジュールを使用します。
言うまでもなく、上記のコンポーネント以外に、N76E003マイクロコントローラーベースの開発ボードとNu-Linkプログラマーが必要です。プログラマーを電源として使用しない場合は、追加の5V電源ユニットが必要になる場合があります。
Nuvoton N76E003UART通信の回路図
以下の開発ボードの回路図に示されているように、マイクロコントローラユニットの2番目と3番目のピンはそれぞれUART0TxとRxとして使用されます。左端には、プログラミングインターフェイスの接続が示されています。
NuvotonN76E003マイクロコントローラーのUARTピン
N76E003には20個のピンがあり、そのうち4個のピンをUART通信に使用できます。以下の画像は、赤い四角のボックス(Rx)と青い四角のボックス(Tx)で強調表示されたUARTピンを示しています。
UART0の場合、ピン2と3はUART通信に使用され、UART1の場合、ピン8とピン18は通信に使用されます。
NuvotonN76E003マイクロコントローラーのUARTレジスタ
N76E003には、自動アドレス認識とフレーミングエラー検出を備えた2つの拡張全二重UART( UART0とUART1)があります。これらの2つのUARTは、2つの異なるUARTに分類されたレジスタを使用して制御されます。UART操作用にN76E003で使用可能なRXピンとTXピンの2つのペアがあります。したがって、最初のステップは、操作に必要なUARTポートを選択することです。
このチュートリアルでは、UART0を使用するため、構成はUART0についてのみ表示されます。UART1の構成は同じですが、レジスタは異なります。
1つのUART(この場合はUART0)を選択した後、RXおよびTX通信に使用する必要のあるI / Oピンを入力および出力として構成する必要があります。UART0のRXピンは、ポート0.7であるマイクロコントローラーのピン3です。これはシリアルポートの受信ピンであるため、ポート0.7を入力として設定する必要があります。一方、マイクロコントローラの2番目のピンであるポート0.6は、送信ピンまたは出力ピンです。準双方向モードとして設定する必要があります。これらは、PxM1およびPxM2レジスタを使用して選択できます。これらの2つのレジスタは、xがポート番号を表すI / Oモードを設定します(たとえば、ポートP1.0の場合、レジスタはP1M1とP1M2になり、P3.0の場合はP3M1とP3M2になります)。下の画像で見られます-
N76E003のUART動作モード
次に、次のステップはUART操作のモードを決定することです。2つのUARTは4つのモードで動作できます。モードは-
ご覧のとおり、SM0とSM1(SCONレジスタの7番目と6番目のビット)はUART動作のモードを選択します。モード0は同期操作であり、他の3つのモードは非同期操作です。ただし、ボーレートジェネレータとフレームビットは、シリアルポートモードごとに異なります。アプリケーションの要件に応じて、どのモードでも選択できます。これは、UART1でも同じです。このチュートリアルでは、タイマー3のオーバーフロー率を32または16で割った10ビット演算を使用します。
ここで、情報を取得し、UART0のSCONレジスタ(UART1の場合はSCON_1)を構成します。
6番目と7番目のビットは、前述のようにUARTモードを設定します。ビット5は、オプションを有効にするためにマルチプロセッサ通信モードを設定するために使用されます。ただし、このプロセスは、選択されているUARTモードによって異なります。これら以外に、受信を有効にするためにRENビットが1に設定され、カスタムUART0送信機能の代わりに printf 機能を使用するためにTIフラグが1に設定されます。
次の重要なレジスタは、電力制御レジスタ(PCON)(UART1のタイマー3ビット7および6)レジスタです。タイマーを初めて使用する場合は、Nuvoton N76E003タイマーのチュートリアルを確認して、N76E003マイクロコントローラーでタイマーを使用する方法を理解してください。
UART0モード1でダブルボーレートを選択するには、SMODビットが重要です。ここで、タイマー3を使用しているため、タイマー3制御レジスタT3CONを構成する必要があります。ただし、ビット7と6は、UART1のダブルデータレート設定用に予約されています。
そしてタイマー3プリスケーラー値-
5番目のビットBRCKは、タイマー3をUART1のボーレートクロックソースとして設定します。ここで、N76E003のデータシートには、目的のボーレートを計算するための式と、タイマー3(16ビット)のHighおよびLowレジスタのサンプルセット値が記載されています。
16MHzクロックソースのサンプル値-
したがって、ボーレートは上記の式を使用してタイマー3レジスタで設定する必要があります。この場合、式4になります。その後、TR3レジスタを1に設定してタイマー3を開始すると、UART0初期化タイマー3が終了します。以下のレジスタを使用してUART0データを送受信するには-
SBUFレジスタは自動的に受信および送信用に設定されます。UARTからデータを受信するには、RIフラグが1に設定されてSBUFレジスタが読み取られ、データがUART0に送信されるのを待ち、データをSBUFに送信し、TIフラグが1になってデータ送信が成功したことを確認します。
UART通信用のNuvotonN76E003のプログラミング
コーディング部分は単純で、このチュートリアルで使用される完全なコードはこのページの下部にあります。コードの説明は次のとおりです。UART0は、メイン関数のステートメントを使用して9600ボーレートで初期化されます-
InitialUART0_Timer3(9600);
上記の関数は common.c ファイルで定義されており、モード1でボーレートソースとしてタイマー3を使用し、ボーレートを 9600で UART0を構成しています。関数の定義は次のとおりです。
void InitialUART0_Timer3(UINT32 u32Baudrate)// timer3をボーレートジェネレーターとして使用 { P06_Quasi_Mode; // UARTピンを送信用の準モードとして設定 P07_Input_Mode; // 受信SCON = 0x50の 入力モードとしてUARTピンを設定します 。 // UART0 Mode1、REN = 1、TI = 1 set_SMOD; // UART0ダブルレートイネーブル T3CON&= 0xF8; // T3PS2 = 0、T3PS1 = 0、T3PS0 = 0( Prescale = 1) set_BRCK; // UART0ボーレートクロックソース= Timer3 #ifdef FOSC_160000 RH3 = HIBYTE(65536-(1000000 / u32Baudrate)-1); / * 16 MHz * / RL3 = LOBYTE(65536-(1000000 / u32Baudrate)-1); / * 16 MHz * / #endif #ifdef FOSC_166000 RH3 = HIBYTE(65536-(1037500 / u32Baudrate)); /*16.6 MHz * / RL3 = LOBYTE(65536-(1037500 / u32Baudrate)); /*16.6 MHz * / #endif set_TR3; //トリガーTimer3set_TI ; // printf関数の場合、TI = 1を設定する必要があります }
宣言は前に説明したように段階的に行われ、レジスタはそれに応じて構成されます。ただし、N76E003のBSPライブラリには、P07_Input_Modeの代わりとなるバグがあり ます。 P07_Quasi_Mode があり ます 。このため、UART受信機能は動作しません。
ボーレートも、入力されたボーレートに従って、データシートに記載されている式を使用して構成されます。現在、main関数または whileループ では、printf関数が使用されています。 printf 関数を使用するには、TIを1に設定する必要があります。これ以外に、 whileループ では、スイッチケースが使用され、受信したUARTデータに従って値が出力されます。
while(1) { printf( "\ r \ n1を押すか2を押すか、3を押すか4を押す"); oper = Receive_Data_From_UART0(); switch(oper){ case '1': printf( "\ r \ n1 is Pressed"); ブレーク; ケース「2」: printf( "\ r \ n2が押されました"); ブレーク; ケース「3」: printf( "\ r \ n3が押されました"); ブレーク; ケース「4」: printf( "\ r \ n4が押されました"); ブレーク; デフォルト: printf( "\ r \ n間違ったキーが押されました"); } Timer0_Delay1ms(300); } }
さて、UART0の場合、 Receive_Data_From_UART0();を 受け取り ます。 関数が使用されます。また、 common.c ライブラリでも定義されて い ます。
UINT8 Receive_Data_From_UART0(void) { UINT8 c; while(!RI); c = SBUF; RI = 0; 戻り値(c); }
RIフラグが1を取得するのを待ち、変数cを使用して受信データを返します。
コードと出力のフラッシュ
コードは0の警告と0のエラーを返し、Keilによるデフォルトのフラッシュ方法を使用してフラッシュしました。コードをコンパイルしてアップロードする方法がわからない場合は、nuvoton入門の記事を確認してください。以下の行は、コードが正常にアップロードされたことを確認します。
再構築が開始されました:プロジェクト:printf_UART0 再構築ターゲット 'GPIO' コンパイルPUTCHAR.C… コンパイルPrint_UART0.C… コンパイルDelay.c… コンパイルCommon.c… アセンブルSTARTUP.A51… リンク… プログラムサイズ:data = 54.2 xdata = 0 code = 2341 "。\ Output \ Printf_UART1"… "。\ Output \ Printf_UART1" からhexファイルを作成 -0エラー、0警告。 ビルド時間の経過:00:00:02 ロード "G:\\ n76E003 \\ software \\ N76E003_BSP_Keil_C51_V1.0.6 \\ Sample_Code \\ UART0_Printf \\ Output \\ Printf_UART1" フラッシュ消去が完了しました。 フラッシュ書き込み完了:2341バイトがプログラムされています。 フラッシュ検証完了:2341バイトが検証されました。 フラッシュロードは15:48:08に終了しました
開発ボードは、USB toUARTモジュールを使用してプログラマーとラップトップを介して電源に接続されます。UARTデータを表示または送信するには、シリアルモニターソフトウェアが必要です。私はこのプロセスにテラタームを使用しています。
下の画像でわかるように、nuvotonコントローラーから送信された文字列を表示してシリアルモニターソフトウェアに表示することができました。また、シリアルモニターから値を読み取ることができました。
このチュートリアルの完全なデモンストレーションについては、以下にリンクされているビデオをチェックしてください。あなたが記事を楽しんで、何か役に立つことを学んだことを願っています。ご不明な点がございましたら、下のコメントセクションに残すか、フォーラムを使用して他の技術的な質問を投稿してください。