- STM8S103F3P6でのシリアル通信
- STM8S103F3P6のシリアル通信ピン
- STM8Sシリアル通信の回路図
- シリアル通信用のSTVDの設定
- シリアル通信用のSTM8Sのプログラミング
- シリアルモニターからのLEDの制御
- STM8Sシリアルライブラリの詳細
新しいマイクロコントローラのプログラミングは、新しいレジスタ処理方法と、どのビットが正確に何を行うかがわからないため、多くの場合、より長い時間がかかります。言うまでもなく、デバッグについても同じことが言えます。これが、プログラマーがコードでブレークポイントを頻繁に使用し、デバッガーを使用してステップスルーする理由です。ただし、デバッガーを使用するには、追加のハードウェア(ほとんどの場合高価)と追加の時間が必要になる場合があります。 Arduinoのファンである私たち全員が同意できることのひとつは、コードのデバッグと理解にシリアル印刷ステートメントを使用することで、作業が大幅に楽になることです。 cosmic CコンパイラとSPLライブラリを使用してSTM8で同じものを複製できるのは何ですか?まあ、それは非常に可能であり、それはまさに私たちのチュートリアルシリーズのこの3番目のチュートリアルでやろうとしていることです。ここで完全に新しい場合は、STM8S(チュートリアル1)およびSTM8S GPIOコントロール(チュートリアル2)の使用開始も確認してください。また、クイックスターターのためにArduinoでSTM8Sをプログラミングする可能性についても検討しました。言われていることはすべて、チュートリアルに入りましょう。
STM8S103F3P6でのシリアル通信
STM8S103F3P6のデータシートから、8ビットコントローラーがさまざまなモードでUART通信をサポートしていることがわかります。コントローラには、同期UART通信用のクロック出力ピンもあり、SmarCard、IrDA、およびLINもサポートできます。ただし、このチュートリアルでは、複雑さを避けるために、そのいずれも調査しません。簡単なUARTの読み取りと書き込みの方法を学びます。
チュートリアルには、 stm8s103 serial.h というヘッダーファイルも用意されています。このファイルを使用して、シリアル開始、シリアル読み取り、シリアル印刷などの簡単なUARTコマンドを実行できます。基本的に、char、int、stringをシリアルモニターに出力できます。また、シリアルモニターからcharを読み取ります。このチュートリアルの最後に、シリアルモニターからLEDを制御し、LEDのステータスに関するフィードバックを取得できるようになります。上記のヘッダーファイルはSPLライブラリに依存するため、入門チュートリアルに従っていることを確認してください。
STM8S103F3P6のシリアル通信ピン
ハードウェア側から始めましょう。以下に示すSTM8S103F3P6マイクロコントローラーのピン配列をざっと見てみると、ピン1、2、および3がUART通信に使用されることがわかります。
3つのうち、ピン1は同期UART通信中にのみ使用されるUARTクロックピンであるため、ここでは必要ありません。ピン2はUARTトランスミッタピンで、ピン3はUARTレシーバピンです。これらのピンは、アナログピンまたは通常のGPIOピンとしても使用できることに注意してください。
STM8Sシリアル通信の回路図
ここでの回路図は非常に単純です。プログラミング用にST-LINK2を接続し、シリアルデータを読み取るためにUSBからTTLへのコンバーターを接続する必要があります。STM8Sコントローラーは3.3Vロジックレベルで動作するため、USBからTTLへのコンバーターも3.3Vロジックをサポートしていることを確認してください。完全な回路図を以下に示します。
STリンクを1つのUSBポートに接続し、USBからTTLへのコンバーターをラップトップの別のUSBポートに接続して、データのプログラミングと監視の両方を同時に行えるようにする必要があります。 UART接続は簡単です。STM8SマイクロコントローラーのグランドとRx / TxピンをUSB-TTLコンバーターのTx / Rxピンに接続するだけです。ここでは、ST-LinkのVccピンでコントローラーに電力を供給し、TTLコンバーターのvssピンを開いたままにしました。これは、逆の方法でも実行できます。市場には多くの種類のUSBからTTLへのコンバーターがあります。3.3Vロジック信号で動作できることを確認し、Tx、Rx、およびGNDピンを簡単に探して上記の接続を行ってください。私のハードウェアのセットアップを以下に示します。
シリアル通信の方法を作るために、 STM8S_Serial.h ヘッダーファイルを提供し ました 。このヘッダーファイルを使用すると、シリアル通信用の単純なArduinoのような機能を実行できます。
このプロジェクトに必要なすべてのファイルは、STM8S103F3_SPLGithubページにあります。この特定のヘッダーファイルのみが必要な場合は、以下のリンクからダウンロードできます。
STM8S_Serial.hをダウンロード
シリアル通信用のSTVDの設定
シリアル通信を操作するために、前に説明した STM8S_Serial.h ヘッダーファイル関数を使用して多くを使用します。ただし、ライブラリには他の依存関係があり、多くのSPLUARTおよびClock関連のヘッダーとCファイルがあります。したがって、この時点から、コンパイルエラーを回避するために、すべてのヘッダーファイルとCファイルをプロジェクトに含めることをお勧めします。私のSTVDの作業環境はこんな感じです。
最初のチュートリアルで行ったように、すべてのSPLソースファイルとインクルードファイルがインクルードされていることを確認してください。また、 stm8s103_serial.h ヘッダーファイルが追加されていることを確認してください。このヘッダーのCファイルはありません。
シリアル通信用のSTM8Sのプログラミング
STVDプロジェクトのセットアップの準備ができたら、 main.c ファイルにコードを書き始めることができます。このチュートリアルの完全なコードは、このページの下部にあります。説明は以下の通りです。
最初のステップは、必要なヘッダーファイルをインクルードすることです。ここでは、ダウンロードしたメインヘッダーファイル(stm8s)と stm8s_103_serial ヘッダーファイルを追加しました。
//必要なヘッダー#include "STM8S.h" #include "stm8s103_serial.h" //https://github.com/CircuitDigest/STM8S103F3_SPL/blob/master/stm8s103%20Libraries/stm8s103_Serial.h
次に、デザインマクロを使用して入力ピンと出力ピンを指定します。ここでは、ポートBのピン5に接続されているオンボードLEDのみを制御するため、 test_LED という名前を 付け ます。
#define test_LED GPIOB、GPIO_PIN_5 //テストLEDはPB5に接続されています
main関数の内部に移り、ピンを出力として定義します。基本的なGPIO機能に慣れていない場合は、STM8SGPIOチュートリアルに戻ってください。
//ピンデファニション// PB5をプッシュプル出力ピンとして宣言GPIO_Init(test_LED、GPIO_MODE_OUT_PP_LOW_SLOW);
次に、シリアル通信ポートを9600ボーレートで初期化します。初めての人にとって、9600は通信中にデータビットが転送される速度です。ここで9600を設定する場合は、監視ソフトウェアでも同じように設定する必要があります。次に、「Enter command」という文字列を出力して、次の行に進みます。
Serial_begin(9600); // 9600ボーレートでシリアル通信を開始しますSerial_print_string( "Enter command"); //文字列を出力しますSerial_newline(); //次の行に移動します
無限のwhileループに 移り 、 Serial_available 関数を使用して、着信シリアルデータがあるかどうかを確認します。はいの場合、それを読み取ってchという変数に保存し、 Serial_print を使用して同じものを 出力し ます。次に、受信した値が0の場合、LEDをオフにし、1の場合、LEDをオンにします。
if(Serial_available()){Serial_print_string( "あなたが押しました:"); ch = Serial_read_char(); Serial_print_char(ch); Serial_newline(); if(ch == '0')GPIO_WriteHigh(test_LED); // LEDオフif(ch == '1')GPIO_WriteLow(test_LED); // LEDオン}
これで、このチュートリアルのプログラミングは完了です。このページの下部にあるコードをアップロードするだけで、シリアルモニターからLEDを制御できるようになります。
シリアルモニターからのLEDの制御
コードをアップロードすると、9600ボーレートで任意のシリアルモニターを開くことができます。使いやすさのためにArduinoシリアルモニター自体を使用しました。リセットボタンを押すと、「コマンドを入力してください」というメッセージが表示されます。次に、1を入力してEnterキーを押すと、オンボードLEDがオンになり、0の場合も同様に、オフになります。
完全な作業は、このページの下部にリンクされているビデオで見つけることができます。ご不明な点がございましたら、コメント欄にご記入ください。フォーラムを使用して、他の技術的な質問を投稿することもできます。
STM8Sシリアルライブラリの詳細
STM8S103F3_Serial ヘッダーファイル内で実際に何が起こっているのかを知りたいという好奇心旺盛な人のために…。
このヘッダーファイルは初心者レベルのプログラミングには適していますが、別のバージョンのSTM8Sコントローラーを使用している場合、またはいくつかの高度なオプションを探している場合は、このヘッダーを少し調整するか、SPLライブラリを直接操作することをお勧めします。このヘッダーファイルは、UART1ヘッダーファイルと同じように作成しました。ヘッダーファイルの説明は次のとおりです。
シリアルモニターから文字を読み取る
この機能は、シリアルモニターからマイクロコントローラーに送信された1文字を読み取るのに役立ちます。
char Serial_read_char(void){while(UART1_GetFlagStatus(UART1_FLAG_RXE)== RESET); UART1_ClearFlag(UART1_FLAG_RXNE); return(UART1_ReceiveData8()); }
RXEフラグが設定されて受信が完了するまで待ってから、フラグをクリアして受信を確認します。最後に、この関数の結果として、受信した8ビットデータを送信します。
シリアルモニターへの文字の印刷
この機能は、マイクロコントローラからシリアルモニタに1文字を送信します。
void Serial_print_char(char value){UART1_SendData8(value); while(UART1_GetFlagStatus(UART1_FLAG_TXE)== RESET); //送信を待つ}
この関数は、単に8ビット値を書き込み、 UART1_FLAG_TXE をSETにチェックすることにより、送信が完了するまで待機します。
シリアル通信の初期化
この関数は、必要なボーレートでシリアル通信を初期化します。
void Serial_begin(uint32_t baud_rate){GPIO_Init(GPIOD、GPIO_PIN_5、GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOD、GPIO_PIN_6、GPIO_MODE_IN_PU_NO_IT); UART1_DeInit(); // UARTペリフェラルを非初期化しますUART1_Init(baud_rate、UART1_WORDLENGTH_8D、UART1_STOPBITS_1、UART1_PARITY_NO、UART1_SYNCMODE_CLOCK_DISABLE、UART1_MODE_TXRX_ENABLE); //(BaudRate、Wordlegth、StopBits、Parity、SyncMode、Mode)UART1_Cmd(ENABLE); }
ボーレートとは別に、データビット数、ストップビット数、パリティなど、シリアル通信用に設定する必要のある他のパラメータがあります。最も一般的なもの(Arduinoと同様)は8ビットデータです。ストップビットが1つあり、パリティがないため、これがデフォルト設定になります。必要に応じて変更できます。
整数をシリアルモニターに印刷する
ほとんどの場合、デバッグまたは監視にシリアルモニターを使用している場合は、int型の変数をシリアルモニターに出力することをお勧めします。この関数はまさにそれを行います
void Serial_print_int(int number)// int値をシリアルモニターに出力する機能{charcount = 0; char Digit = ""; while(number!= 0)// intをchar配列に分割{digit = number%10; count ++; 数=数/ 10; } while(count!= 0)//文字配列を正しい方向に出力{UART1_SendData8(digit + 0x30); while(UART1_GetFlagStatus(UART1_FLAG_TXE)== RESET); //カウントの送信を待つ-; }}
整数値を受け取り、最初のwhileループで文字配列に変換し、次に2番目のwhileループで、printchar関数と同様に各文字を送信します。
改行を印刷する
これは、新しい行を印刷するための簡単な関数です。そのための16進値は「0x0a」です。8ビットの送信コマンドを使用して送信しています。
void Serial_newline(void){UART1_SendData8(0x0a); while(UART1_GetFlagStatus(UART1_FLAG_TXE)== RESET); //送信を待つ}
文字列をシリアルモニターに印刷する
もう1つの便利な機能は、シリアルモニターに実際に文字列を印刷することです。
void Serial_print_string(char string){。char i = 0; while(string!= 0x00){UART1_SendData8(string); while(UART1_GetFlagStatus(UART1_FLAG_TXE)== RESET); i ++; }}
この場合も、この関数は文字列をchar配列に変換し、各文字を送信します。私たちが知っているように、すべての文字列の終わりはnullになります。したがって、null 0x00に到達するまで、文字をトラバースして送信し続ける必要があります。
シリアルデータが読み取れるかどうかの確認
この関数は、読み取る準備ができているバッファにシリアルデータがあるかどうかをチェックします。
bool Serial_available(){if(UART1_GetFlagStatus(UART1_FLAG_RXNE)== TRUE)はTRUEを返します。それ以外の場合はFALSEを返します。}
フラグ UART1_FLAG_RXNEを チェックし、trueの場合はtrueを返し、そうでない場合はfalseを返します。