CCWO Embedded Space

CCWOの日々の開発を発信するブログ

STM32 F401RE Input

開発環境
・評価ボード NUCLEO-F401RE
・IDE MDK-ARM V5 and STM32CubeMX
・OS windows 10 pro
・本

次は基板に実装されているボタンを使っていきたいと思います。
プロジェクトの作成はデフォルトのまま、プロジェクト名(F401RE_Input_00)だけ変えて同様に作成します。
embedded-blog.ccwo.net

ボタンとLEDのピンを確認します。
f:id:CCWO:20160914134247p:plain
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モードとこれは併用のため今回のプログラムではこのままで動作可能です。
押してるとき
f:id:CCWO:20160915002210j:plain
離してるとき
f:id:CCWO:20160915002249j:plain

20160914の記事