en.radzio.dxp.pl

Lesson 2. Reading the button
After blinking the LED, described in lesson 1, we can do another excercise - reading the button state. On the STM32VLDISCOVERY board we have two buttons - one for resetting board (RST, black) and one for user purpose (USER, blue). The USER button is connected to PA0 pin and active state are high.

Creating project are similiar to described in lesson 1. First thing to do to use this button is enable clock for GPIO peripheral :

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN;

Remember that we use also GPIOC, so we need turn on clock for both GPIOA and GPIOC. Next, let's do some defines for USER button :

#define SW_USER_GPIO GPIOA
#define SW_USER_PIN  0

and now we can configure GPIO to work as input :

#if (SW_USER_PIN > 7)
  SW_USER_GPIO->CRH = (SW_USER_GPIO->CRH & CONFMASKH(SW_USER_PIN)) | GPIOPINCONFH(SW_USER_PIN,     GPIOCONF(GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOATING));
#else
  SW_USER_GPIO->CRL = (SW_USER_GPIO->CRH & CONFMASKL(SW_USER_PIN)) | GPIOPINCONFL(SW_USER_PIN,     GPIOCONF(GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOATING));
#endif

Now we can check in endless loop state of the button and turn LED on if is pressed :

while (1) {
if(SW_USER_GPIO->IDR & (1 << SW_USER_PIN))
  LED_BLUE_GPIO->BSRR = (1 << LED_BLUE_PIN);
else
  LED_BLUE_GPIO->BRR = (1 << LED_BLUE_PIN);
}

Complete code of example :

//=============================================================================
// STM32VLDISCOVERY tutorial
// Lesson 2. Reading the button.
// Copyright : Radoslaw Kwiecien
// http://en.radzio.dxp.pl
// e-mail : radek(at)dxp.pl
//=============================================================================
#include "stm32f10x.h"
#include "antilib_gpio.h"
//=============================================================================
// Defines
//=============================================================================
#define LED_BLUE_GPIO GPIOC
#define LED_BLUE_PIN 8

#define SW_USER_GPIO GPIOA
#define SW_USER_PIN 0
//=============================================================================
// main function
//=============================================================================
int main(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPCEN;

#if (LED_BLUE_PIN > 7)
  LED_BLUE_GPIO->CRH = (LED_BLUE_GPIO->CRH & CONFMASKH(LED_BLUE_PIN)) | GPIOPINCONFH(LED_BLUE_PIN,     GPIOCONF(GPIO_MODE_OUTPUT2MHz, GPIO_CNF_OUTPUT_PUSHPULL));
#else
  LED_BLUE_GPIO->CRL = (LED_BLUE_GPIO->CRL & CONFMASKL(LED_BLUE_PIN)) | GPIOPINCONFL(LED_BLUE_PIN,     GPIOCONF(GPIO_MODE_OUTPUT2MHz, GPIO_CNF_OUTPUT_PUSHPULL));
#endif

#if (SW_USER_PIN > 7)
  SW_USER_GPIO->CRH = (SW_USER_GPIO->CRH & CONFMASKH(SW_USER_PIN)) | GPIOPINCONFH(SW_USER_PIN,     GPIOCONF(GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOATING));
#else
  SW_USER_GPIO->CRL = (SW_USER_GPIO->CRH & CONFMASKL(SW_USER_PIN)) | GPIOPINCONFL(SW_USER_PIN,     GPIOCONF(GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOATING));
#endif

while (1) {
if(SW_USER_GPIO->IDR & (1 << SW_USER_PIN))
  LED_BLUE_GPIO->BSRR = (1 << LED_BLUE_PIN);
else
  LED_BLUE_GPIO->BRR = (1 << LED_BLUE_PIN);
}
}
//=============================================================================
// End of file
//=============================================================================

After flashing MCU and pressing down the USER button blue LED will be turned on, after release the button LED will be turned off.

 

 
(c) Radosław Kwiecień