STM32F051のマニュアルを読むと、2つのピンで同じ代替機能を構成できるように見えます。たとえば、同時に複数のUSART1_TXピンを持つことができます。または、たとえば、2つのUSART_RXピンの問題の多いケースです。この場合、マニュアルには何も書かれていません。これは合法/安全ですか?これは役に立ちましたか?
STM32F051のマニュアルを読むと、2つのピンで同じ代替機能を構成できるように見えます。たとえば、同時に複数のUSART1_TXピンを持つことができます。または、たとえば、2つのUSART_RXピンの問題の多いケースです。この場合、マニュアルには何も書かれていません。これは合法/安全ですか?これは役に立ちましたか?
回答:
ピンごとのレジスタを使用してI / O機能を選択するプロセッサでは、競合することなく出力機能を複数のピンにルーティングできます。すべてのピンが同じ出力をエコーします。複数のピンを入力に接続した場合の影響は、多くの場合指定されていません。たとえば、UARTにI / Oピン3および4がUARTに接続されている場合、UARTがピン3および4を入力として取る「AND」ゲートに接続されているかのように動作するか、または接続されているように動作する可能性があります。 1つのピンに接続してもう1つのピンを無視するか、抵抗が中程度のトランジスタを介して両方のピンをUARTの入力バッファに接続するか、ピン3が高く、ピン4が低い場合、またはその逆の場合、余分な電流が流れる可能性があります。想像できることなら何でもします。私はしません
一部のマイクロチップパーツ(おそらくいくつかのSTMパーツも同様)で使用されるやや優れた設計アプローチは、各I / O関数にマルチプレクサーを含めて、どのピンから入力を受け入れるかを選択し、ピンにマルチプレクサーを含めてIを示すことです。データを出力する/ O関数。このような設計により、1つのピンが複数のI / O機能に給電できるようになると同時に、競合する構成によって生じるあいまいさを排除できます。
はい、それは便利です。STM32F407VGT6での実験結果:少なくともこれらのピンをAF入力として使用する場合、両方のAFピンを同時にAFとして使用できます。実験は、外部トリガーの立ち上がりエッジでTIM1をトリガーすることでした-信号「TIM1_ETR」。「TIM1_ETR」信号は、MCUパッケージのピンPE7および/またはPA12にマッピングできます。
実験:TIM1の両方のピンPE7とPA12をAF "TIM1_ETR"として初期化します。
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); // configure PE7 as AF
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // configure PA12 as AF
}
結果-TIM1は、PE7またはPA12のいずれかのピンの立ち上がりエッジによって開始されます。
これにより、ランタイムでAFピンをMUX(変更)する方法がわかります。
main
{
GPIO_InitTypeDef GPIO_InitStruct = { 0 };
// Deactivate PA12 input (set as regular input):
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// select PE7 as a trigger source,
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
// Arm the timer
arm_tim1();
/* Now timer will be started by rising edge only on PE7 */
// ... later one can select PA12 as trigger source. Deactivate PE7 (set as regular input):
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pin = GPIO_PIN_7;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
// Activate PA12
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pin = GPIO_PIN_12;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// Arm the timer
arm_tim1();
/* timer will be started by rising edge only on PA12 */
}
これは役立つ場合があり、タイマーのトリガーには2つの異なるソースが必要です。これにより、オフボードのMUX ICを節約できます。ポストの最初に示すように初期化されている場合、両方の入力を同時に使用できます。入力は一緒に接続されていません。つまり、PA12の信号はPE7に転送されず、その逆も同様です(GPIOが入力として設定されているため)。
コードは「STM32CubeF4 v5.3」+「ファームウェアパッケージV1.24.0 / 08-February-2019」によって生成されます。
基本的に、ピンはGPIOであり、UART_RXなどの代替機能に割り当てることができます。すべての代替機能には、デフォルトのピンと、機能を再マップできる代替ピンがあります。セクション9.1.5 のSTM32F103のリファレンスマニュアルを確認すると、次のように述べられています。
異なるデバイスパッケージの周辺I / O機能の数を最適化するために、いくつかの代替機能を他のいくつかのピンに再マッピングすることが可能です。これは、対応するレジスターをプログラミングすることにより、ソフトウェアによって実現されます(177ページのAFIOレジスターを参照)。その場合、代替機能は元の割り当てにマップされなくなります。