組み込みプロセッサで最初に値を設定してからGPIOの方向を設定する必要があるのはなぜですか?


16

ファームウェアエンジニアとしてフルタイムの仕事をしています。最近、GPIO構成を確認し、必要に応じて設定を変更するタスクを与えられました。間違って設定されたピンがいくつか見つかったので、当然のことながらそれらを再設定しましたが、間違った順序で行ったと言われました。私が話していることは次のとおりです。

変更前:
GPIO1.direction = INPUT;

後:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

ただし、コードのレビュー中に、初期化の順序を次のように変更する必要があると言われました。

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

つまり、最初に値を設定してから、ピンの方向を設定します。入力用と出力用に2つのレジスタを使用するため、これが最新のプロセッサ上で必要であると言われましたが、古いプロセッサは1つのレジスタしか使用しないため、操作の順序は重要ではありません。
(注:Modern = ARM Cortex M3以降、Old = Intel 8051)

私は職場でより良い説明を求めましたが、良い答えを得ることができませんでした。それが私がここで尋ねることにした理由です。

だからここに私の質問があります:

  1. 新しいプロセッサで初期化の順序が重要なのはなぜですか?
  2. 古いプロセッサで初期化の順序が重要でないのはなぜですか?
  3. 最新のプロセッサでは、2つのレジスタについて何を語っていますか?
  4. 古いプロセッサでどのレジスタについて話しているのですか?

誰かが図のようなものを提供できるなら、それはさらに良いでしょう。


1
「モダン」および「オールド」プロセッサーはあまりにも曖昧すぎて、有用な答えを出すことができません。アーキテクチャが異なれば、レジスタ設定も異なります。あなたが話しているものを知らずに、それらにインテリジェントにコメントする方法はありません。
ニックジョンソン

@ IgnacioVazquez-Abramsいや、そうでもない。部屋には非常に経験豊富なエンジニアがいて、私のやり方で行けば回線に不具合があると言いました。
フラッシュバーン

@NickJohnson近代= ARMのCortex M4と旧=インテル8051、上記
flashburn

@BrianDrummond LOL。非常に良い説明。しかし、古いプロセッサ、たとえば8051はどうでしょう。なぜこれが彼らにとって重要ではないのですか?
フラッシュバーン

2
Q4は、データシートリンクを使用すると簡単に回答できます。
pjc50

回答:


22

オリジナルの8051はいわゆる擬似双方向出力ポート(プルアップ付きのオープンドレイン)を使用していたため、実際にはポート方向の設定はありませんでした。

もちろん、現代の真の双方向出力ポートの場合は、出力用のポートピンを有効にする前に既知の値を設定しておくことをお勧めします。

ここで私の答えを見てくださいたとえば、。

編集:これは(比較的)最新のCMOS マイクロコントローラーのI / Oピン構造です:

ここに画像の説明を入力してください

TRIS(TRIState)は、他の多くのマイクロではDDR(データ方向レジスタ)と呼ばれます。この場合、TRISラッチ出力が高い場合、両方のトランジスタは「オフ」ですが、ポートは引き続き読み取ることができます。

これは、新しいMicrochip microのわずかに複雑なI / Oピン構造です。

ここに画像の説明を入力してください

繰り返しますが、TRISラッチは出力を無効にします。これには、read-modify-writeの問題を回避するのに役立つLATラッチが含まれています。PICシリーズでは、LATレジスタにのみ書き込む(およびPORTレジスタから読み取る)必要があります。

オリジナルの8051およびCMOS 8051クラシックI / Oポートピンの内部回路を以下に示します(このソースから)。

ここに画像の説明を入力してください

外部キャパシタンスを克服するために短時間オンにされるプルアップと並列のスピードアップトランジスタがあるという点で、少し余分な複雑さがあります。ご覧のとおり、TRIS / DDRコントロールはまったくありません。通常の動作で使用されるプルアップMOSFETは「弱」です。ピンに接続された外部出力が疑似双方向ポートラインをローにプルできるほど小さい(低Idss)。


説明してくれてありがとう。私はしばらくの間ハードウェアを扱っていないので、説明から説明を理解するのに苦労しています。画像を提供してもらえますか?ピン設定ハードウェアが最新のプロセッサでどのように見えるか、8051でどのように見えるかを考えてみてください。とても感謝しております。
フラッシュバーン

ハードウェアとはどういう意味ですか?チップの内部GPIO回路?
スペロペファニー

そのとおりです。ある種の図が本当に役立つでしょう。
フラッシュバーン

16

最初に方向を設定すると、現在の出力値が何であれ、ピンが短時間出力されるように構成されます。最初に値を設定した場合、これは起こりません。

したがって、推奨されている方法でこれを行うと、ピンの接続先に応じて、無害から壊滅的な範囲の出力のグリッチを回避できます。


ありがとう。では、古いプロセッサについてはどうでしょうか、なぜこれが重要ではないのでしょうか?古い= Intel 8051
フラッシュバーン

8051には詳しくありません。同僚が言ったことに基づいて、同じレジスタが方向と値の両方を構成する場合、コンパイラは2つの書き込みを1つに最適化するため、問題はありません。
ニックジョンソン

2
上記の理由から、古いプロセッサでもこの「新しい」方法で行うのはおそらくまだ良い習慣でしょう。異なる処理者は異なる要件を持ち、異なるベンダーは他のベンダーよりも良い提案を提供し、異なる企業/雇用者/チームはそのような詳細について異なるポリシーを持つかもしれません。
ビルト

2
実際...常にDIOが運命の周回レーザーに接続されていると仮定します;)
マイケル

4

デフォルトの方向が入力であると仮定すると(つまり、MCUが接続された回線に値を強制しないようにするため、High-Zが理にかなっています)、ポートをセットアップするこの順序は望ましいですが、必須ではありません。実際、アプリケーションで、起動時にポートの値がにならないように要求されている場合は必要です1。次に、値を設定してから0方向を変更します。この場合、方向と値の設定の間で発生する可能性のある瞬間的な「グリッチ」を回避し、そのピンでスパイクが発生する可能性があります。そして、新しいロジックだけでなく、このようなロジックを持つすべてのプロセッサに当てはまります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.