STM32、PY32、その他のマイクロコントローラーの GPIO の 8 つの入出力モードの詳細な説明

STM32、PY32、その他のマイクロコントローラーの GPIO の 8 つの入出力モードの詳細な説明

GPIOの8つの入出力モード

GPIO (汎用入力/出力) は、STM32 マイクロコントローラーで一般的に使用されるペリフェラルの 1 つで、外部回路の接続と制御に使用されます。 GPIO ピンは、入力 (センサーの信号入力) または出力 (外部デバイスを駆動するコントローラー) として使用できます。 STM32 マイクロコントローラーには、フローティング入力、プルアップ入力、プルダウン入力、アナログ入力、プッシュプル出力、オープンドレイン出力、多重化プッシュプル出力、多重化オープンドレイン出力という 8 つの一般的な入出力 (GPIO) モードがあります。

入力モード

入力フローティング (GPIO_Mode_IN_FLOATING)

入力フローティング: フローティングとは、ロジック デバイスとピンがハイ レベルまたはロー レベルに接続されていないことを意味します。ロジックデバイスの内部構造により、入力ピンがフローティングのままの場合、ピンがハイレベルに接続されているのと等価になります。一般的な実使用においては、ピンをフローティングにすることは干渉を受けやすいため推奨しません。フローティングとは平たく言えば空中に浮いているという意味で、デフォルトではこのポートはどこにも接続されておらず、ハイインピーダンス状態になっているということになります。この設定はデータ送信時によく使用されます。フローティングの最大の特徴は電圧の不確実性です。それは 0V、VCC、または (ほとんどの場合) 2 つの値の間の値である可能性があります。通常、ADC 入力にはフローティングが使用され、結果に対するプルアップ抵抗とプルダウン抵抗の影響を軽減できます。

特徴: ピンはハイ インピーダンス状態で、外部回路に接続されていないため、外部信号レベルを測定します。
アプリケーションシナリオ: キー入力、センサー入力などの外部信号の受信状態。

1
2
3
4
5
// 初始化浮空输入模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;          // 浮空输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL;              // 不设置上拉或下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

入力プルアップ (GPIO_Mode_IPU)

プルアップ モードに入る: プルアップとは、ポイントを Vcc などに高く引き上げることを意味します。プルアップとは、不確かな信号を抵抗を通してハイレベルにクランプすることです。抵抗は電流制限器としても機能します。弱と強の違いはプルアップ抵抗の抵抗値だけであり、厳密な区別はありません。
特長: プルアップ抵抗を内蔵しており、端子のデフォルトレベルはハイレベルです。
アプリケーションシナリオ: ボタンが押されたなど、外部信号が低レベルになったときを検出します。

1
2
3
4
5
// 初始化上拉输入模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;          // 上拉输入模式
GPIO_InitStruct.Pull = GPIO_PULLUP;              // 上拉输入
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

入力プルダウン (GPIO_Mode_IPD)

入力プルダウン: 電圧を GND に引き下げることを意味します。プルアップの原理と同じ
特長: プルダウン抵抗を内蔵しており、端子のデフォルトレベルはLowレベルです。
アプリケーションシナリオ: ボタンが離されたときなど、外部信号がハイレベルになったときを検出します。

1
2
3
4
5
// 初始化下拉输入模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;          // 下拉输入模式
GPIO_InitStruct.Pull = GPIO_PULLDOWN;            // 下拉输入
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

アナログ入力 (GPIO_Mode_AIN)

アナログ入力: アナログ入力とは、従来の入力を指します。デジタル入力は、PCM デジタル信号、つまり 0,1 のバイナリ デジタル信号の入力です。デジタル/アナログ変換を通じてアナログ信号に変換され、プリアンプを通じてパワーアンプに入力されます。パワーアンプはアナログのままです。
特徴: 連続的に変化するアナログ信号を受信するために使用され、通常は ADC (アナログ - デジタル コンバーター) と組み合わせて使用​​されます。
アプリケーションシナリオ: センサー信号やオーディオ入力などのアナログ信号の変化を測定します。

1
2
3
4
5
// 初始化模拟输入模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;         // 模拟输入模式
GPIO_InitStruct.Pull = GPIO_NOPULL;              // 不设置上拉或下拉
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

出力モード

オープンドレイン出力 (GPIO_Mode_Out_OD)

オープンドレイン出力:出力端子はトランジスタのコレクタに相当します。ハイレベル状態を得るにはプルアップ抵抗が必要です。電流駆動に適しています。電流を吸収する能力は比較的強いです(通常20mA以内)。

オープンドレイン回路には次の特徴があります。

  1. 外部回路の駆動能力を利用してIC内部の駆動を軽減します。 IC の内部 MOSFET がオンになると、駆動電流が外部 VCC から R プルアップ、MOSFET を通って GND に流れます。 IC 内部では非常に高いゲート駆動電流のみが必要です。

  2. 一般に、オープン ドレインは、異なるレベルのデバイスを接続し、レベルを一致させるために使用されます。オープン ドレイン ピンが外部プルアップ抵抗に接続されていない場合、ロー レベルしか出力できないためです。同時にハイレベルを出力する機能が必要な場合はプルアップ抵抗を接続する必要があります。プルアップ電源の電圧を変えることで送信レベルを変更できるのが利点です。例えば、プルアップ抵抗を付加することで、TTL/CMOSレベルの出力などが可能になります(プルアップ抵抗の抵抗値により、論理レベルの変換エッジの速度が決まります。抵抗値が大きいほど速度が遅くなり、消費電力も小さくなります。そのため、負荷抵抗の選択は、消費電力と速度の両方を考慮する必要があります)。

  3. オープンドレインは柔軟な出力方法を提供しますが、立ち上がりエッジの遅延という弱点もあります。立ち上がりエッジは外部プルアップ受動抵抗を介して負荷を充電するため、抵抗を小さく選択すると遅延は小さくなりますが、消費電力は大きくなります。逆に、遅延が大きい場合、消費電力は小さくなります。したがって、遅延が必要な場合は、立ち下がりエッジ出力を使用することをお勧めします。

  4. 複数のオープンドレイン出力ピンを 1 つのラインに接続できます。プルアップ抵抗を介して、デバイスを追加することなく「AND ロジック」関係が形成されます。これは、I2C や SMBus などのバスがバス占有ステータスを決定するための原則でもあります。補足:「行AND」とは何ですか?

ノード (ライン) 上で、プルアップ抵抗を電源 VCC または VDD と、n 個の NPN または NMOS トランジスタのコレクタ C またはドレイン D に接続します。これらのトランジスタのエミッタEまたはソースSは全て接地線に接続されている。 1 つのトランジスタが飽和している限り、このノード (ライン) はグランド レベルに引き下げられます。これらのトランジスタのベースが電流を注入する (NPN) か、ゲートがハイレベルを追加する (NMOS) ため、トランジスタは飽和します。したがって、これらのベースまたはゲートとこのノード (ライン) の関係は NOR 論理になります。このノードの後ろにインバータを追加すると、OR 論理になります。

実際、これは単純に次のように理解できます。すべてのピンが一緒に接続されると、外部プルアップ抵抗が接続されます。 1つのピンが論理0を出力している場合、それはグランドに接続されていることに相当し、それに並列に接続されている回路は「ワイヤでショートされているのと同じ」なので、外部回路の論理レベルは0になります。すべてがHighの場合にのみ、ANDの結果は論理1になります。

特徴: ローレベルのみを出力でき、ピンをハイにプルするには外部プルアップ抵抗が必要です。一定の運転能力を持っています。
アプリケーションシナリオ: I2C バスなどの外部デバイスに接続されている場合、他のデバイスと通信するために使用されます。

1
2
3
4
5
// 初始化开漏输出模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;     // 开漏输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   // GPIO速度设置为高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

オープンドレイン多重化機能(GPIO_Mode_AF_OD)

オープンドレイン多重化機能: GPIO ポートを 2 番目の機能として使用する (つまり、汎用 IO ポートとして使用しない) 場合の構成状況として理解できます。ポートは代替機能出力モード (プッシュプルまたはオープン ドレイン) に設定する必要があります。

特徴: オープンドレイン出力特性を備えており、GPIO ピンを特定のペリフェラルの機能として使用するために使用できます。
アプリケーションシナリオ: I2C バス通信ピン、障害信号出力などの周辺機器に接続された特殊機能ピン。

1
2
3
4
5
6
// 初始化复用开漏输出模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;          // 复用开漏输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;              // 不设置上拉或下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;    // GPIO速度设置为高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

プッシュプル出力 (GPIO_Mode_Out_PP)

プッシュプル出力: ハイレベルとローレベルを出力し、デジタルデバイスに接続できます。プッシュプル構造とは、一般に 2 つのトランジスタが相補信号によって制御され、一方のトランジスタがオンになるともう一方のトランジスタが常にオフになることを意味します。ハイレベルとローレベルは、IC の電源によって決まります。

プッシュプル回路は、同じパラメータを持つ 2 つのトランジスタまたは MOSFET です。それらはプッシュプル モードで回路内に存在します。それぞれが正と負の半サイクルの波形タスクを担当します。回路が動作しているとき、2つの対称的なパワースイッチ管のうちの1つだけが一度にオンになるため、伝導損失が小さく、効率が高くなります。出力は電流を負荷にシンクすることができます。プッシュプル出力段は、回路の負荷容量を増加させるだけでなく、スイッチング速度も増加させます。

特長:高レベル、低レベルの出力が可能で、確実な駆動能力を持っています。
アプリケーションシナリオ: LED ライトの制御、他の論理回路の駆動など、外部回路の駆動に使用されます。

1
2
3
4
5
6
// 初始化推挽输出模式的GPIO
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_0;               // GPIO引脚号
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     // 推挽输出模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;   // GPIO速度设置为高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);         // 初始化GPIOA

プッシュプル多重化機能(GPIO_Mode_AF_PP)

プッシュプル多重化機能:GPIOポートを第2機能として使用する場合(一般的なIOポートとして使用しない場合)の構成状況として把握できます。

特徴: プッシュプル出力特性を備えており、GPIO ピンを特定のペリフェラルの機能として使用するために使用できます。
アプリケーションシナリオ: UART シリアル通信ピン、PWM 出力などのペリフェラルの特殊機能ピンに接続します。

1
2
3
4
5
6
// 初始化复用推挽输出模式的GPIO
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;          // 复用推挽输出模式
GPIO_InitStruct.Pull = GPIO_NOPULL;              // 不设置上拉或下拉
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;    // GPIO速度设置为高速
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。