STM32 HAL GPIO-INPUT

GPIO_INPUT



前回のGPIOのデジタルアウトプットをやったのと同じ要領で、File-Newからはじめて、PC13をGPIOのアウトプットに設定する所まで同じようにする。LEDと名前を変えるのが面倒なので、PC13のままにしたが、お好きなように。

ファイル名はGPIO_INPUTとしておいた。

PB12をINPUTに設定する。

OUTプットに設定するのと同じく、PB12のピンを左クリックして、

GPIO_INPUTを選択する。


画面左側のCategoriesの所でGPIOを選択する。
するとアサインされているピンPB12とPC13の状態が表示されている。
PC12の所で、GPIO Pull-up/Pull-downの選択をPull-upにする。
保存し自動でコードを吐き出させる。

PULL-UPとPULL-DOWN


 ここで Pull-up/Pull-downの説明。上のスイッチ回路のように、MPU(マイコン)に直接電源をスイッチを介してつなげる事を考える。スイッチがONの時、マイコンのPINもHIGHになる。そのためMPUで電圧を読むと、HIGHと検出される。一方でオフにした時、この時マイコンのピンはGNDでも電源電圧でもない状態になる。これを”浮いている状態”と呼ぶ。まあこのように配線してもHIGHではないので、大抵動いたりするが、高い周波数で触れるような信号配線が隣にあるとこの浮いている端子はその影響を受けて、本来OFFでゼロになってほしいのに誤動作して、HIHGと読まれる事が起こってしまう。スイッチぐらいなら直接続してもまあ動くが、SPI、I2Cなどの通信を行うと周波数がそれなりなので、ちゃんと通信ができない等が発生するのでPull-up抵抗の設置は必須となる。


この誤動作をなくすために、Pull-up抵抗を介してスイッチを接続する。OFFの時は、マイコン内部の電圧検出の抵抗(これはかなり大きい)はピンを介してHIGHになり、スイッチがONになると、ピンはGNDに接続されGNDと同電位なる。

ここでは、説明のためにマイコンの外にPull-up抵抗を設置しているが、実際のマイコンではマイコンの内部でPull-up抵抗を準備するか?しないのか?というのが選択する事ができる。それが、GPIO Pull-up/Pull-downの選択をしている意味である。

Pull-upがあれば、Pull-downもあり、上の図でスイッチと抵抗の位置が逆になっている状態でスイッチがONになった時に、HIHGになるようにも設定できる。

ブレッドボードによるテスト回路の作製

まず、用意したブレッドボードにBlue Pill(STM32F103)をぶっさしておく。
ジャンパーワイヤを使って、GNDと3.3Vをそれぞれ配線する。


次いで、スイッチを用意する。

今回は、上のマイクロスイッチを使った。手元にあるものならなんでもよい。
NC( Normally colose:スイッチを押さない時に閉)、NO(Normally open:押さない時に開)とC(common)。



スイッチのC端子をB12のピンと接続して、NO端子をブレッドボードのGNDと接続(むろんブレッドボードのGNDはマイコンのGNDに接続されている)NCの端子は使わない。
スイッチを押されていない時は、B12ピンは、GNDと分離されていて、押すと接続されB12がGNDに落ちる回路になる


コードの記載

ここではスイッチを押している間はLEDがついてスイッチをOFFにしたら消えるようにしてみる。
メインループのユーザコード部分を以下のように編集する。
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
  if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)==1){
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
  }
  else{
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
  }

    /* USER CODE BEGIN 3 */
  }
編集ができたら、BOOTのジャンパーピンを差し替えてリセットを押してから、書き込みを行ってみる。
押している時だけ点灯する事が確認できただろうか?

コード解説

ここではif文を使っているが、C言語と処理は同じ。条件一致はは”=”ではなくて”==”

HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12);

第一引数は、ピンの群を指定して、第二引数はピン番号を指定している。これでB12の状態を得る。返り値としては、HIGHレベルなら1(押さない時にHIGH),LOWレベルなら0を返してくる(押した時にLOW)。

マイコンボード上のPC13に接続されたLEDは、Vcc-LED-抵抗-PC13の順に接続されている。そのためHIGHレベルの時、マイコン内部のピン設定がPush-pullになっているとVccと同電位のためLEDには電流が流れず消灯する。そのため、PD12はスイッチは押されない時はHIGHなので、PD12ピンがHIGHならば、PC13もHIGHで消灯。それ以外ならPC13をLOWにしてLEDを抵抗を介してGNDに接続し電流を流す事で点灯する。


その他のコード:

その他の例題として、押している間だけ倍速で点滅するようにしてみる。
    /* USER CODE END WHILE */
    HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_13);

  if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12)==1){
    HAL_Delay(500);
  }
  else{
    HAL_Delay(250);
  }
と書き換えてみる。
押しているだけ早く点滅する事を確認する








コメント

このブログの人気の投稿

Attiny85とAQM0802A(LCD)のI2C接続

Attiny85 FuseRest

HS101 STM32の自作お手軽オシロスコープ