Project_OKI’s diary

エンジニアの勉強ブログ

STM32マイコン_10(レジスタ操作でLED点滅)

​​​​

STM32:レジスタ操作でLED点滅

1.本日の内容

 (1) STM32マイコン(nucleo f401RE)を使用して、LEDの点灯/消灯を行う。
 (2) 今回は、HALの関数を使わず、レジスタを操作し、LEDを点滅させる。

・目次

 

2.内容

 

​​(1) やる内容の詳細​

  ・STM32マイコン(nucleo f401RE)を使用して、LEDの点灯/消灯を行う。
    ・nucleof401についてる青ボタンを押した時
    ・プログラムを実行し、LEDを2秒ごとに点滅する。

  ・レジスタの操作でON/OFF出来ることを確認する。

  ・今回は、GPIOのレジスタについて説明する。

(2) 使用部品​
個数 部品名 型番
1 USBケーブル USBミニBタイプ
1 mbed(マイコンボード) ​​nucleo f401RE

​​​​

(3) STM32CubeMXの設定、プログラムを出力

  CubeMXの設定及び、AtricTrueStdioの起動については下記記事の

 「(3)STM32CubeMXの設定、プログラムを出力」を参照

  →STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary


(4) AtricTrueStdioでプログラム作成

​ (a) プログラムの書き込み
   ・トンカチマークをクリックして、ビルドする。
   ・エラーが出ないことを確認する。
   ・下記プログラムを記載する。

while(1){
/* USER CODE BEGIN 3 */
	  //PA5を1に設定
	  GPIOA -> ODR = 0b0000000000100000;
	  HAL_Delay(1000); //1秒待つ
	  //PA全てのポートを0に設定
	  GPIOA -> ODR = 0b0000000000000000;
	  HAL_Delay(1000); //1秒待つ
}
/* USER CODE END 3 */
(5) プログラムの説明

 

 (a)GPIOA -> ODR = 0b000000000100000;
   ・LEDを点灯させる。
   ・リファレンスRM0368の8.4.6を参照。
   ・ODRがポートの設定となっている。
    参考:​https://www.javadrive.jp/cstart/ope/index6.html
    詳細:
     ・​STM32いじってみた(3) - 設定の記法・GPIO編
     ・​STM32 汎用I/Oポートのプログラミング​  
     ・​STM32F3Discover GPIO
(6) 詳細説明:
 
STM32F401xのレジスタに関しては、RM0386に記載している。
STM32に関する資料は、下記サイトからダウンロードできる。
  
 RM0368の8.4.6章には、GPIOレジスタの項目がある。
 ここには、GPIOレジスタについて記載している。
 今回は、CubeMxを使用しているため、初期設定はされているので、
 GPIOの出力ポートレジスタに絞って説明を行う。
 詳しい設定説明については、下記サイトに載っているので、確認すると良い。
 
 ここでは、根本的な考え方について記載する。
 
 GPIOの出力データレジスタを確認すると、下記のようになっている。
 

STM32_GPIOレジスタ
 これは、GPIOxのODRレジスタに値をセットすれば、
 GPIOの出力データにアクセスが出来るということだ。
 ODRレジスタの指定が、今回の
 GPIOA -> ODR 
 という部分になっている。
 ->はアロー関数という。
 
 ここでは、簡単に、 GPIOAのODRという場所を示していると考えると良い。
 これが、例えばPBにアクセスしたい場合は、
 GPIOB -> ODR になる。
 
 そのレジスタの、今回はPA5なので、 ODR5を1に設定すると、
 PA5がHighになる。
 その設定が、0b0000000000100000;
 である。
 この0bというのは、2進数を示しており、
 この0b以降の
 0b15,14,13・・・2,1,0ビット目を指す。
 
 例えば、PA7だったら、一番右側から、8番目を1にする。
 0b0000000010000000;
 PA0だったら、一番右側から、1番目を1にする。
 0b0000000000000001;
 
 このように、ODR5を1にセットすると、GPIOがHighとなり、LEDが点灯する。
 
 ただ、この方法には、問題がある。
 例えば、PA5だけを設定したい場合、
 0b0000000000100000; だと、PA0やPA1などの他のポートも一緒に設定してしまう。
 
 それらが起こらないために、
 これらの記事で紹介している方法などを用いている。
 
 今回は、ここまで。
 もう少し詳しい話はいつか書く。
 
 
 

3.関連記事

組み込みC言語