サンプルプログラム N446RE_Blk_LED の説明
マスコット   LED点滅のプログラムです。

  STMicroelectronics社製の
 評価用基板、NUCLEO-F446RE と
 freeの開発ツール、STM32CubeIDE
 使用しています。



目次

サンプルプログラム N446RE_Blk_LED のソース

サンプルプログラム N446RE_Blk_LED の説明
 N446RE_Blk_LED の構成
 ユーザープログラムの実行開始位置
 N446RE_Blk_LED のmain()の説明
  1) 初期化の部分
  2) LED点滅処理の部分
 各モジュールの説明
  1) GPIO初期化
  2) Wait_mSec
  3) LED_ON
  4) LED_OFF




サンプルプログラム N446RE_Blk_LED のソース
 STM32CubeIDE 1.7.0 を使用して作成しました。

 ここからサンプルプログラム R_N446RE_Blk_LED.zip をダウンロードしてください。



サンプルプログラム N446RE_Blk_LED の説明
  NUCLEO-F446RE基板上のLED、LD2を点滅させるサンプルプログラムです。

 プロジェクトを最初に開いた画面は以下のようになります。

N446RE_Blk_LED_Scrn_First

 以下、サンプルプログラム N446RE_Blk_LED について説明していきます。



 N446RE_Blk_LED の構成
  STM32CubeIDEの画面左側、Project Explorerの
 N446RE_Blk_LEDを展開した画面は以下のようになります。

N446RE_Blk_LED_Tree

  サンプルプログラム N446RE_Blk_LED の構成を以下に示します。
N446RE_Blk_LED
  |- Includes
  |
  |- Core
  |    |- Inc
  |    |    |- main.h
  |    |    |- stm32f4xx_hal_conf.h
  |    |    |- stm32f4xx_it.h
  |    |
  |    |- Src
  |    |    |- main.c
  |    |    |- stm32f4xx_hal_msp.c
  |    |    |- stm32f4xx_it.c
  |    |    |- syscalls.c
  |    |    |- system.c
  |    |    |- system_stm32f4xx.c
  |    |
  |    |- Startup
  |
  |- Drivers
  |
  |- N446RE_Blk_LED.launch
  |- STM32F446RETX_FLASH.ld
  |- STM32F446RETX_RAM.ld



 ユーザープログラムの実行開始位置
  プログラムは、int main(void) から実行開始します。

  int main(void) は、フォルダ Core/Src/main.c にあります。

N446RE_Blk_LED_main

  STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
 行った後、int main(void) を呼び出します。

  ユーザーコード(記述したプログラム)は、
 int main(void) の先頭から実行されます。



 N446RE_Blk_LED のmain()の説明
  サンプルプログラム N446RE_Blk_LED の main() の記述は、
 以下のとおりです。


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    LED_ON();  // LED点灯

    Wait_mSec(100);  // 100mSec待つ

    LED_OFF();  // LED消灯

    Wait_mSec(900);  // 900mSec待つ
  }
  /* USER CODE END 3 */
}


 1) 初期化の部分

  a) CPUのPeripheral初期化
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
   により、CPUのPeripheralなどの基本的な初期化を行います。
  PeripheralとはCPUの周辺インターフェースなどのことを言います。

   HAL_Init はプロジェクト構築時に自動的に組み込まれる、
  HAL Drivers(フォルダ Drivers/STM32F4xx_HAL_Drivers) 内に記述されています。


  b) CPU動作クロックの設定
  /* Configure the system clock */
  SystemClock_Config();

   CPUの動作クロックとPeripheralの動作クロックを設定します。

   SystemClock_Config(); の設定内容は、

int main(void)
{
         .
         .
         .
}
 の、すぐ下に記述されています。


  c) GPIOの初期化
   GPIO初期化のモジュール MX_GPIO_Init(); を呼び出しています。

   SystemClock_Configの下に記述されています。

  /* Initialize all configured peripherals */
  MX_GPIO_Init();


   LEDが接続されているピンを出力に設定しています。



 2) LED点滅処理の部分
   LED点滅処理の記述を以下に示します。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  LED_ON();    // LED点灯

  Wait_mSec(100);  // 100mSec待つ

  LED_OFF();  // LED消灯

  Wait_mSec(900);  // 900mSec待つ
  }
  /* USER CODE END 3 */


   LED点滅処理は、
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
  の、永久ループの中に記述しています。

   その理由は、LEDを点灯して100mSec時間待ち、
  LEDを消灯して900mSec時間待ちを繰り返すためです。

  LED_ON();    // LED点灯
  から、実行開始して、
  Wait_mSec(900);  // 900mSec待つ
  を実行すると、再び、
  LED_ON();    // LED点灯
  から実行する処理を繰り返します。



 各モジュールの説明



 1) GPIO初期化
   CPUのピンを初期化します。

   以下に、MX_GPIO_Initのコード(記述)を示します。

   void SystemClock_Config(void) の下に記述されています。

/**
  * @brief GPIO Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);

  /*Configure GPIO pin : PA5 */
  GPIO_InitStruct.Pin = GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}



 2) Wait_mSec
   引数で指定されたぶんだけmSec単位で時間待ちをします。

   このモジュールは、呼び出されると、引数で指定された時間が経過するまで
  戻ってきません。

   以下に、Wait_mSecのコードを示します。

//--------------------------------------
// mSec待ち
//--------------------------------------
// 引数
// uint32_t uint32_mSec : 待ち時間(mSec)
//--------------------------------------
void Wait_mSec(uint32_t uint32_mSec)
{
  uint32_t uint32_tikstart = 0;


  // 開始時間取得
  uint32_tikstart = HAL_GetTick();

  // 時間経過待ち
  do{
  }while((HAL_GetTick() - uint32_tikstart) <= uint32_mSec);
}

   a) HAL_GetTick()
     HAL_GetTick() は、プロジェクト構築時に
    自動的に記述されたモジュールです。

     1mSecごとにカウントするカウンターの値を取得します。
     カウンタは32bitsの変数で、0 ~ 4,294,967,295 を繰り返しカウントします。


   b) 開始時間取得
  // 開始時間取得
  uint32_tikstart = HAL_GetTick();
     で、時間待ち開始時のカウント数を取得します。


   c) 時間経過待ち
  // 時間経過待ち
  do{
  }while((HAL_GetTick() - uint32_tikstart) <= uint32_mSec);
     により、引数の uint32_mSec の時間が経過するのを待ちます。



 3) LED_ON
   LEDを点灯します。

   以下に、LED_ONのコード(記述)を示します。
//------------------------------------------------
// LED点灯
//------------------------------------------------
void LED_ON(void)
{
  // LED ON : Highを出力
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}



 4) LED_OFF
   LEDを消灯します。

   以下に、LED_OFFのコード(記述)を示します。
//------------------------------------------------
// LED消灯
//------------------------------------------------
void LED_OFF(void)
{
  // LED OFF : Lowを出力
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
}



A+-2C (ええ加減にC) のページに戻る




 メールアドレス: apm2c.sumi@gmail.com

 なんでも、気軽に ご相談ください。
 担当:おの

マスコット
  えがおのでんし 案内