サンプルプログラム 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 について説明していきます。
N446RE_Blk_LED の構成
STM32CubeIDEの画面左側、Project Explorerの
N446RE_Blk_LEDを展開した画面は以下のようになります。
サンプルプログラム 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 にあります。
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
なんでも、気軽に ご相談ください。
担当:おの
えがおのでんし 案内