2017-10-18 1 views
0

私は、STM32F4ディスカバリでGPIOピンのドライバを書く方法を学ぼうとしています。私は、チュートリアルを行っていたと私は、この行に出くわした:Cコードでのビット操作

static void hal_gpio_configure_pin_mode (GPIO_TypeDef *GPIOx, uint16_t pin_no, uint32_t mode) 
{ 
    GPIOx->MODER |= (mode << (2* pin_no)); 
} 

私は、組込みシステムに比較的新しいですとGPIOX->MODER |= (mode << (2* pin_no));が何をするか分かりません。また、modeが32ビットのときにpin_noが16ビットである理由は分かりません。私は< <が左シフトビット演算子であることを知っています。しかし、私はまだ完全な文脈を得ていません。

誰でもこのことを説明できますか?ラインGPIOx->MODER |= (mode << (2* pin_no));説明しようと

+0

'pin_no'と'モード 'は、同じ型を持つべき理由はありませんその値はaddやmultiplyなどの演算で発生するように一緒に使用されるのではなく、単なるインデックスであり、値をシフトする量( 'mode')を計算するために使用されます(' mode')。 shiftは単純に数値でなければなりません;シフトされるものと同じ型である必要はありません。したがって、 '+'や '* 'のような演算子ではオペランドを同じ型に変換する必要がありますが、 '演算子は、左右に異なる型を持つことがあります。 –

+1

moを見てくださいチップのドキュメントのgpioセクションに記載されています。これは、単にこのレジスタに2ビットを設定していることがわかります。 –

+0

Google:「ビット演算子の仕組み」または本を読む。 – Lundin

答えて

3

  • GPIOx構造
  • GPIOx->MODERへのポインタである
  • x |= yこの構成内側部材MODERにアクセスし、「実行を意味し、x = x | yの略語でありますxとyの論理和をとり、結果をxに返す
  • mode << (2* pin_no)は、変数の内容を左シフトすることを意味しますを2回pin_noビットだけ増やします。したがって

、ラインは「modeの左shiftet内容とビットごと-OR、それをGPIOx->MODERのコンテンツを取ることを意味します。

+2

私は、各ピンが2ビットでエンコードされ、4つの異なる値を持つ可能性が高いモードであることを追加します。そしてこの機能は、モードが最初に「00」に設定されていると仮定しています。 –

+1

リセット状態に応じてポストリセットが可能ですが、orringの前にマスクする必要があります。 –