STM32F401-Nucleoで外付けLEDを点灯させる(Lチカ)
CubeMXでピンの設定をする
STM32ではCubeMXを使ってピンにデータをインプットするピンかアウトプットするピンなのかを設定を行う必要がある。
ボードを使ってプロジェクトを作成すると、ボードに搭載されているLEDやスイッチの設定がすでに行われている。
今回は、STM32F401-NucleoからブレッドボードにつないだLEDとスイッチでLEDの点灯・点滅を行っていきたいと思う。
基本的にグレーの状態になっているのがピンの設定が行われていないピンとなる。
ピンの番号をクリックすると、画像のようにピンに行える割り当て設定の一覧が出てくる。
今回は「PA10」を「GPIO_Input」、「PB5]を「GPIO_Output」と設定する。
ブレッドボードにはPA10にスイッチをつなぎ、PB5にLEDをつなげる。
設定が終わったら「ファイル(F)」→「保存(S)」をクリックする。
この画面で「はい(Y)」をクリックする。
あとは自動でピンの設定がされたソースコードが自動生成される。
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
/*Configure GPIO pin : B1_Pin */
GPIO_InitStruct.Pin = B1_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : LD2_Pin */
GPIO_InitStruct.Pin = LD2_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
/*Configure GPIO pin : PA10 */
GPIO_InitStruct.Pin = GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PB5 */
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(GPIOB, &GPIO_InitStruct);
}
ソースコードによるピンの設定コードがこのようになっている。
「B1_Pin」と「LD2_Pin」はデフォルトの設定である。
これはSTM32の新規プロジェクトでNucleoを選択したのでこの設定がある。
その後、自分たちで設定を行った「PA10」と「PB5」の設定がコードに追加されていることがわかる。
main.cでプログラムを書いていく
プロジェクト・エクスプローラーから「Core」→「Src」→「main.c」でソース画面を表示する。
スイッチによるLEDの点灯・点滅のプログラムはこのような感じで書いてみた。
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10)==0){
HAL_GPIO_TogglePin (GPIOB, GPIO_PIN_5);
HAL_Delay(200);
}
}
/* USER CODE END 3 */
STM32のHALライブラリでスイッチ入力を行うときは「HAL_GPIO_ReadPin(GPIOx,GPIO_PIN_xx)」という関数を使う。
引数は「PA10」なら「GPIOA, GPIO_PIN_10」となる。
「HAL_GPIO_TogglePin」は出力の反転を行う関数になる。
引数は上のRead関数と同じようになる。
初期化が行われていないからできないと思われるが、CubeMXでコードを生成したときに、自動で初期化まで行っている。
実行結果がこんな感じになる。
コメント
コメントを投稿