STM32 F401RE Input
開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本
定番!ARMキット&PIC用Cプログラムでいきなりマイコン制御[DVD-ROM付き] (マイコン活用シリーズ)
- 作者:芹井 滋喜
- 発売日: 2016/01/29
- メディア: 単行本
次は基板に実装されているボタンを使っていきたいと思います。
プロジェクトの作成はデフォルトのまま、プロジェクト名(F401RE_Input_00)だけ変えて同様に作成します。
embedded-blog.ccwo.net
ボタンとLEDのピンを確認します。
PC13が基板上の青色ボタン、PA5が基板上の緑色LEDなので、main.cにコードを追加します。
/* Includes ------------------------------------------------------------------*/ #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ #define LED_PORT GPIOA #define LED_PIN GPIO_PIN_5 #define LED_ON GPIO_PIN_SET #define LED_OFF GPIO_PIN_RESET #define SW_PORT GPIOC #define SW_PIN GPIO_PIN_13 #define SW_OFF GPIO_PIN_SET #define SW_ON GPIO_PIN_RESET /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ 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(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(HAL_GPIO_ReadPin(SW_PORT, SW_PIN)==SW_ON){ HAL_GPIO_WritePin(LED_PORT, LED_PIN, LED_ON); }else{ HAL_GPIO_WritePin(LED_PORT, LED_PIN, LED_OFF); } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
としました。whileループの中でスイッチのON、OFFをみて、押されたらLEDを点灯させ、離されたらLEDを消灯させるよくあるプログラムです。
つぎにMX_GPIO_Init関数の中をみます。
static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* 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 : B1_Pin */ GPIO_InitStruct.Pin = B1_Pin; GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); /*Configure GPIO pins : USART_TX_Pin USART_RX_Pin */ GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Alternate = GPIO_AF7_USART2; HAL_GPIO_Init(GPIOA, &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 Output Level */ HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); }
__HAL_RCC_GPIOC_CLK_ENABLE();のようにポートごとにクロックを供給する必要があります。
B1とLD2が今回使用したPC13(ボタン)とPA5(LED)です。
B1はGPIO_MODE_EVT_RISINGで分かるように立ち上がりエッジ割り込みモードに設定されていますが、Inputモードとこれは併用のため今回のプログラムではこのままで動作可能です。
押してるとき
離してるとき
20160914の記事