WeChatパブリックアカウント:Xiaofanスタディは
、一般的な学習、質問、提案について懸念しています。パブリックアカウントにメッセージを残してください!!!
プログラマーとして、プログラミングの最初の学習では、最も基本的なエントリーレベルの例「Hello World」の1つは避けられません。それでは、MCUを学習するときの最も基本的なエントリーの例は何ですか?つまり、「LEDライトの照明」は、クラシックなマーキープログラムを通じて、全員がSTM32F4の旅を開始できるようにします。この調査を通じて、STM32F4のIOポートを出力メソッドとして理解できます。 。
STM32F4開発ボード上の2つのLEDをコードで制御します。DS0とDS1が交互に点滅して、マーキーと同様の効果を実現します。
ハードウェア接続
GPIO作業方法
-
4つの入力モード:
入力フローティング
入力プルアップ
入力プルダウン
アナログ入力 -
4つの出力モード:
オープンドレイン出力(プルアップまたはプルダウン付き)
オープンドレイン多重化機能(プルアップまたは
プルダウン付き)プッシュプル出力(プルアップまたは
プルダウン付き)プッシュプル多重化機能(プルアップまたはプルダウン付き) ) -
4種類の最大出力速度:
-2MHZ
-25MHz
-50MHz
-100MHz
ソフトウェア設計
led.c
#include " led.h " ///////////////////////////////////////////// ////////////////////////////////////// / // 初期出力ポートPF10とPF9。とこれら2つのポートがクロックイネーブルにする // IO初期化LED 空隙 LED_Init(ボイド) { ; GPIO_InitTypeDef GPIO_InitStructure RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF、イネーブル); // クロックGPIOF有効 // GPIOF9、設定F10初期 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10と、// LED0とLED1はIOポートに対応します GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // 一般的な出力モード GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;// プッシュプル出力 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // 100MHzの GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // プル GPIO_Init(GPIOF、&GPIO_InitStructure); //はGPIO初期化 GPIO_SetBits(GPIOF、GPIO_Pin_9 | GPIO_Pin_10); // GPIOF9、提供F10高、消灯 }
このコードには、関数void LED_Init(void)が含まれていますこの関数の機能は、PF9およびPF10をプッシュプル出力として構成することです。STM32ペリフェラルを構成するときは、ペリフェラルのクロックを常に有効にする必要があることに注意してください。GPIOはAHB1バスにマウントされたペリフェラルであり、ファームウェアライブラリのAHB1バスにマウントされたペリフェラルクロックは、関数RCC_AHB1PeriphClockCmd()によって有効になります。
クロックを設定した後、LED_InitはGPIO_Init関数を呼び出してPF9およびPF10の初期構成を完了し、次に関数GPIO_SetBitsを呼び出してLED0およびLED1出力1(LEDオフ)を制御します。この時点で、2つのLEDの初期化が完了しています。これで、これら2つのIOポートの初期化が完了しました。
led.h
#ifndef __LED_H #define __LED_H #include " sys.h " ////////////////////////////////////// //////////////////////////////////////////// / ///// ////////////////////////////////////////////////// ////////////////////////// / // LEDポート定義 の#define LED0 PFout(9) // のDS0 の#define LEDL PFout(10) / / DSL のボイド LED_Init(無効); // 初期化 の#endif
ここでは、ビットバンド操作を使用して、IOポートの1ビットを操作します。
main関数に次のコードを記述します。
#include " sys.h " #include " delay.h " #include " usart.h " #include " led.h " // マーキー実験ライブラリ関数バージョン int main(void ) { delay_init(168); // 初期化遅延関数 LED_Init(); // LEDポート を初期化しながらwhile(1 ) { LED0 = 0 ; // LED0が LED1を点灯する= 1 ; // LED1オフ delay_ms(500 ); LED0 = 1 ; // LED0オフ LED1 = 0 ; // LED1オン delay_ms(500 ); } }
コードには#include "led.h"という文が含まれているため、main()関数でLED0、LED1、LED_Initなどを呼び出すことができます。ここでは、ファームウェアライブラリで、システムがsystem_stm32f4xx.cの関数SystemInit()を呼び出して、システムクロックの開始時にシステムクロックを初期化し、クロックの初期化が完了した後にmain()関数を呼び出すことを繰り返す必要があります。したがって、main()関数内でSystemInit()関数を呼び出す必要はもうありません。もちろん、クロックシステムをリセットする必要がある場合は、独自のクロック設定コードを記述できますSystemInit()は、クロックシステムをデフォルトの状態に初期化するだけです。main()関数は非常に単純です。最初にdelay_init()を呼び出して遅延を初期化し、次にLED_Init()を呼び出してGPIOF.9およびGPIOF.10を出力として初期化します。最後に、LED0とLED1は500ms間隔で無限ループで交互に点滅します。
次に押す
プロジェクトをコンパイルする
エラーや警告がないことがわかります。コンパイル情報から、コードがFLASHサイズ5672バイト(5248 + 424)を占め、使用されているSRAMサイズが1880バイト(1832 + 48)であることがわかります。ここでは、コンパイル結果のいくつかのデータの意味を説明します。コード:プログラムが使用するFLASHのサイズ(FLASH)を示します。RO-data:読み取り専用データ。プログラム定義の定数(FLASH)を表します。RW-data:Read Write-data、つまり初期化された変数(SRAM)を意味しますZI-data:Zero Init-data、つまり初期化されていない変数(SRAM)これを使用して、現在のフラッシュとSRAMのサイズは大きいため、プログラムのサイズは.hexファイルのサイズではなく、コンパイルされたコードとROデータの合計であることに注意することが重要です。
確認をダウンロード
ダウンロード後、LED0とLED1は周期的に点滅します