STM32G0B1のピン処理に関する覚書

STM32G0B1KEを使った基板を作っています。ピンの処理に関しては注意が必要なため、自分用の覚書として記しておきます。一部はNucleo-G0B1REで検証しています。

未使用ピンはアナログ入力にしておく

これはデータシートによる推奨設定です。未使用ピンに関するデータシートの記述は以下の通り

To avoid current consumption related to floating pins, they must either be configured in analog mode, or forced internally to a definite digital value. This can be done either by using pull-up/down resistors or by configuring the pins in output mode.

DS13560 Rev 2 Datasheet

CubeIDEのDevice Configuration ToolのProject Managerにはコード生成時に未使用ピンをアナログ入力にする項目があります。ここをチェックすると、全部のピンに一発で設定が可能です。

Project Manager

上記設定によりmain.cの中のMX_GPIO_Init()関数の中に以下のようにコードが生成され、未使用ピンがアナログ入力状態になります。

生成されたコード。アナログ入力状態になっている。

SWDピンはSWD機能に固定しておく

SWCLKとSWDIOはDevice Configuration Toolで明示的にSWDとして機能を割り当てておきます。

機能の割り当て

これを怠って未設定にしておくと、MX_GPIO_Init()関数が呼ばれる際に先の未使用ピンの設定によってアナログ入力となり、以降の行でSWDデバッグが出来なくなります。

SWDピンをプルアップしない回路のプログラム

STM32G0B1KEのリファレンス・マニュアルは、SWDピンを回路でプルアップしない場合にプログラムによって明示的に内部プルアップ・プルダウンすることを推奨しています。

Once the SW I/O is released by the user software, the GPIO controller takes control of these pins. The reset states of the GPIO control registers put the I/Os in the equivalent states:
• SWDIO: input pull-up
• SWCLK: input pull-down
Having embedded pull-up and pull-down resistors removes the need to add external resistors.

RM0444 Rev 5. Reference manual

しかしながらプログラムによって内部でプルアップ・プルダウンしてしまうと、その行以降ではデバッグができません。

これに対する完全な解決策はありません。妥協点としては以下のような関数を用意し、main()の中から呼ぶという方法があります。

static void ProtectSWD(void)
{
#ifndef DEBUG
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /*Configure GPIO pin : PA13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pin : PA14 */
  GPIO_InitStruct.Pin = GPIO_PIN_14;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLDOWN;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
#endif
}

こうしておけば、Releaseビルドの場合にSWD信号線を静電破壊から守ることが出来ます。また、Debugビルドの際にはSWDポートから制限なくデバッグできます。

なお、このコードはマイコンのシリコン・ダイに依存するため、このコードを自分のプログラムにそのまま貼り付けても動作しません。このコードはSTM32G0B1RE用です。

デバッグポートにnRSTを出しておく

上述のようにSWDポートは「ついうっかり」デバッグ不能状態にしてしまいがちです。また、回路保護のために内部プルアップ、プルダウンを行う場合もSWDポートは使えません。

そこでnRST信号をデバッグ・ポートに出しておきます。SWD対応のデバッガはリセット信号を持っています。そしてSTM32G0B1KEはリセット直後はSWDポートがデバッグ可能になっています。

nRST信号さえ出しておけば、SWDを間違ってデバッグ不能にしてしまうプログラムも上書きが可能になります。

nRST信号にはキャパシタを入れておく

データシートによれば、nRSTにはプルアップ抵抗が内蔵されています。しかし、同じくデータシートは0.1uFで高周波の飛び込みをバイパスするように推奨しています。

こうしておけば、横を大出力の違法CB無線機を積んだトラックが走っても大丈夫ですね(古い)。

nRSTの多重化は心配しなくても良い

STM32G0B1のnRST信号はGPIOなどのペリフェラルと多重化されており、プログラムによってこれらの機能に切り替えることが出来ます。

しかしながら、これらを「うっかり」間違って変更するリスクは心配しなくても構いません。CubeIDEのDevice Configuration ToolはSWD同様nRST信号もGPIOなどに設定できます。しかしながら、生成されたコードを実行してもそのままではnRSTピンをGPIOなどのペリフェラルに使うことはできません。

nRSTピンの機能を設定するにはSTM32G0B1内蔵FlashメモリのOption Byte領域に然るべき値を書き込まなければなりません。そしてこのOption Byteへの書き込みをするにはパスフレーズ書き込みを含む複数ステップの手続きを間違いなく進める必要があります。

「うっかり」でこの手続きをやってしまう可能性はゼロに近く、我々アマチュアプログラマが心配する必要はありません。

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください