- ハードウェアの準備
- STM8S103FのGPIOピン配列を理解する
- STM8S103FGPIO選択のピン配置の説明とヒント
- SPLを使用したGPIO入力および出力用のSTM8Sのプログラミング
- プログラムのアップロードとテスト
マイクロコントローラの場合、LED点滅プログラムは「helloworld」プログラムと同等です。前のチュートリアルでは、STM8S103F3開発ボードの使用を開始する方法と、STM8SコントローラーをプログラムするためにIDEとコンパイラーをセットアップする方法を学びました。また、標準の周辺機器ライブラリの使用方法と、コードをコンパイルしてマイクロコントローラにアップロードする方法も学びました。すべての基本をカバーしたので、実際にコードを書き始めましょう。このチュートリアルでは、STM8Sコントローラーで一般的なGPIO機能を実行する方法を学習します。ボードにはすでにポートBのピン5に接続されたオンボードLEDがあります。このLEDを点滅させる方法と、外部LEDを追加してプッシュボタンで制御する方法を学習します。まったく新しい場合は、先に進む前に前のチュートリアルを読むことを強くお勧めします。
ハードウェアの準備
プログラムに飛び込む前に、ハードウェア接続の準備をしましょう。先に述べたように、ここでは2つのLEDを使用します。1つは連続的に点滅するオンボードLEDで、もう1つはプッシュボタンで切り替える外部LEDです。アイデアは、簡単なセットアップですべてのGPIO機能を学ぶことです。オンボードLEDはすでにPB5(PORTBのピン5)に接続されているので、下の図に示すように、LEDをPA3に接続し、プッシュボタンをPA2に接続しました。
しかし、制御対象で使用可能なすべての出力ピンのうち、出力にPA3を選択し、入力にPA2を選択したのはなぜですか?質問は有効であり、この記事の後半で説明します。このチュートリアルのハードウェア設定を以下に示します。ご覧のとおり、STリンクプログラマーをプログラミングピンに接続しました。プログラミングピンは、ボードをプログラムするだけでなく、電源としても機能します。
STM8S103FのGPIOピン配列を理解する
ここで質問に戻ります。なぜPA2が入力で、なぜPA3が出力でしょうか。それを理解するために、以下に示すマイクロコントローラーのピン配列を詳しく見てみましょう。
ピン配置図によると、マイクロコントローラーには4つのポートがあります。つまり、ポートA、B、C、およびDは、それぞれPA、PB、PC、およびPDで表されます。各GPIOピンは、他のいくつかの特別な機能も備えています。たとえば、PB5(ポートBのピン5)は、GPIOピンとしてだけでなく、I2C通信用のSDAピンおよびタイマー1出力ピンとしても機能します。したがって、このピンをLEDの接続などの単純なGPIOの目的で使用する場合、I2CとLEDを同時に使用することはできません。残念ながら、オンボードLEDがこのピンに接続されているため、ここではあまり選択肢がありません。また、このプログラムではI2Cを使用しないため、それほど問題にはなりません。
STM8S103FGPIO選択のピン配置の説明とヒント
正直なところ、PA1を入力ピンとして使用しても問題はなく、ピンとして機能します。しかし、新しいマイクロコントローラーでGPIOピンを選択するときに陥る可能性のあるいくつかの一般的なトラップを示す機会を提供するために、意図的にこれを取り上げました。トラップを回避する最善の方法は、STM8S103F3P6データシートに記載されているピンの詳細とピンの説明を読むことです。 STM8S103F3P6マイクロコントローラーの場合、データシートに記載されているピンの説明の詳細を以下の画像に示します。
マイクロコントローラの入力ピンはフローティングまたは弱いプルアップのいずれかであり、出力ピンはオープンドレインまたはプッシュプルのいずれかです。オープンドレインピンとプッシュプル出力ピンの違いについてはすでに説明しているため、詳細については説明しません。簡単に言うと、オープンドレイン出力ピンは出力を高くすることはできませんが、プッシュプル出力ピンは出力を高くすることも高くすることもできます。
上記の表とは別に、出力ピンは高速出力(10 Mhz)または低速出力(2 MHz)のいずれかであることがわかります。これによりGPIO速度が決まります。GPIOピンを高速と低速の間で非常に高速に切り替えたい場合は、高速出力を選択できます。
上の画像で説明したように、コントローラーの一部のGPIOピンはTrue Open Drain(T)とHigh Sink Current(HS)をサポートしています。オープンドレインと真のオープンドレインの大きな違いは、オープンドレインに接続された出力をマイクロコントローラの動作電圧(Vdd)より高く引き上げることはできないのに対し、真のオープンドレイン出力ピンはVddより高く引き上げることができることです。高いシンク能力を備えたピンは、より多くの電流をシンクできることを意味します。 GPIO HSピンのソースおよびシンク電流は20mAですが、電力線は最大100mAを消費できます。
上の画像をよく見ると、真のオープンドレインタイプ(T)であるPB4とPB5を除いて、ほとんどすべてのGPIOピンが高シンク電流(HS)タイプであることがわかります。つまり、これらのピンをハイにすることはできず、ピンをハイにしても3.3Vを供給することはできません。これが、オンボードLEDが3.3Vに接続され、GPIOピンから直接電力を供給するのではなく、PB5を介して接地されている理由です。
ピンの詳細な説明については、データシートの28ページを参照してください。上の画像で述べたように、PA1は自動的に弱いプルアップとして構成されるため、出力ピンとして使用することはお勧めしません。とにかくプッシュボタンと一緒に入力ピンとして使用できますが、プログラムからのプルアップを有効にするためだけにPA2を使用することにしました。これらは、はるかに複雑なプログラムを作成するときに役立ついくつかの基本的なことです。今のところ、多くのものが頭から跳ね返っても大丈夫です。他のチュートリアルでそのレイヤーに入ります。
SPLを使用したGPIO入力および出力用のSTM8Sのプログラミング
最初のチュートリアルで説明したように、ワークスペースと新しいプロジェクトを作成します。すべてのヘッダーファイルとソースファイルを追加することも、gpio、config、およびstm8sファイルのみを追加することもできます。 main.c ファイルを開き、プログラムの作成を開始します。
上の画像に示すように、ヘッダーファイルがインクルードされていることを確認してください。 main.c ファイルを開き、コードを開始します。完全なmain.cコードはこのページの下部にあり、そこからプロジェクトファイルをダウンロードすることもできます。コードの説明は次のとおりです。コーディング部分について混乱している場合は、SPLユーザーマニュアルまたはこのページの下部にリンクされているビデオを参照することもできます。
必要なポートの非初期化
プログラムは、必要なポートを非初期化することから始めます。前に説明したように、各GPIOピンには、通常の入力と出力のように機能する以外にも、他の多くの機能が関連付けられています。これらのピンが以前に他のアプリケーションで使用されていた場合は、使用する前に非初期化する必要があります。これは必須ではありませんが、良い習慣です。次の2行のコードは、ポートAとポートBを非初期化するために使用されます。構文 GPIO_DeInit(GPIOx)を 使用するだけ です。 xの代わりにポート名を指定します。
GPIO_DeInit(GPIOA); //ポートAを動作するように準備しますGPIO_DeInit(GPIOB); //ポートBが機能するように準備します
入力および出力GPIO宣言
次に、どのピンを入力として使用し、どのピンを出力として使用するかを宣言する必要があります。この場合、ピンPA2が入力として使用されます。また、このピンを内部プルアップで宣言するため、外部で使用する必要はありません。構文は GPIO_Init(GPIOx、GPIO_PIN_y、GPIO_PIN_MODE_z);です。 。ここで、xはポート名、yはピン番号、zはGPIOピンモードです。
// PA2を入力プルアップピンとして宣言GPIO_Init(GPIOA、GPIO_PIN_2、GPIO_MODE_IN_PU_IT);
次に、ピンPA3とPB5を出力として宣言する必要があります。ここでも多くのタイプの出力宣言が可能ですが、 「GPIO_MODE_OUT_PP_LOW_SLOW」 を使用し ます。 これは、低速のプッシュプルタイプの出力ピンとして宣言することを意味します。また、デフォルトでは、値は低くなります。構文は同じになります。
GPIO_Init(GPIOA、GPIO_PIN_3、GPIO_MODE_OUT_PP_LOW_SLOW); // PB5をプッシュプル出力ピンとして宣言GPIO_Init(GPIOB、GPIO_PIN_5、GPIO_MODE_OUT_PP_LOW_SLOW);
以下のSPLユーザーマニュアルのスナップショットには、考えられるすべてのGPIOモード(z)が記載されています。
無限のwhileループ
ピン宣言後、無限ループを作成する必要があります。このループ内でLEDが永久に点滅し続け、プッシュボタンのステータスを監視してLEDを切り替えます。無限ループは、 while(1) またはfor (;;)の いずれかで作成できます。ここで私は (1)の間に 使用 しました。
while(1){}
入力ピンの状態を確認する
入力ピンのステータスを確認する必要があります。そのための構文は GPIO_ReadInputPin(GPIOx、GPIO_PIN_y);です。 ここで、xはポート名、yはピン番号です。ピンが高い場合は「1」になり、ピンが低い場合は「0」になります。ピンがハイかローかをチェックするために、ifループの内側に使用しました。
if(GPIO_ReadInputPin(GPIOA、GPIO_PIN_2))//ボタンが押された場合
GPIOピンをハイまたはローにする
GPIOピンをHighまたはLowにするには、 GPIO_WriteHigh(GPIOx、GPIO_PIN_y);を 使用できます 。 および GPIO_WriteLow(GPIOx、GPIO_PIN_y); それぞれ。ここでは、ボタンが押された場合にオンになり、ボタンが押されていない場合にオフになるLEDを作成しました。
if(GPIO_ReadInputPin(GPIOA、GPIO_PIN_2))//ボタンが押された場合GPIO_WriteLow(GPIOA、GPIO_PIN_3); // LEDオンelseGPIO_WriteHigh(GPIOA、GPIO_PIN_3); // LEDオフ
GPIOピンの切り替え
GPIOピンを切り替えるには、 GPIO_WriteReverse(GPIOx、GPIO_PIN_y);を使用します。 この関数を呼び出すと、出力ピンのステータスが変更されます。ピンがハイの場合はローに変更され、ローの場合はハイに変更されます。この機能を使用して、PB5のオンボードLEDを点滅させています。
GPIO_WriteReverse(GPIOB、GPIO_PIN_5);
遅延機能
Arduinoとは異なり、cosmicコンパイラには事前定義された遅延関数がありません。したがって、自分で作成する必要があります。私の遅延関数を以下に示します。遅延の値は変数msで受信され、2つのforループを使用して実行を保持またはプログラムします。 _asm(“ nop”) と同様に、操作なしを表すアセンブリ命令です。これは、コントローラーが操作を実行せずにforループにループするため、遅延が発生することを意味します。
void delay(int ms)//関数定義{int i = 0; int j = 0; for(i = 0; i <= ms; i ++){for(j = 0; j <120; j ++)// Nop = Fosc / 4 _asm( "nop"); //操作を実行しない//アセンブリコード}}
プログラムのアップロードとテスト
プログラムの準備ができたので、アップロードしてテストできます。アップロードすると、ハードウェアは期待どおりに機能していました。オンボードの赤色LEDは500ミリ秒ごとに点滅し、外部の緑色のLEDはスイッチを押すたびに点灯しました。
完全な作業は、以下にリンクされているビデオで見つけることができます。このポイントに到達したら、スイッチとLEDを別のピンに接続し、コードを書き直して概念を理解することができます。遅延タイミングを試して、概念を明確に理解しているかどうかを確認することもできます。
ご不明な点がございましたら、下のコメントセクションにご記入ください。その他の技術的な質問については、フォーラムをご利用ください。フォローしていただきありがとうございます。次のチュートリアルでお会いしましょう。