diff --git a/global.h b/global.h index 652fe67..a25267c 100644 --- a/global.h +++ b/global.h @@ -14,6 +14,10 @@ */ /* Copyright (c) 2016 King Kévin */ +#include // GPIO defines +#include // interrupt defines +#include // external interrupt defines + /* get the length of an array */ #define LENGTH(x) (sizeof(x) / sizeof((x)[0])) @@ -22,17 +26,28 @@ /* LED pin */ #ifdef SYSTEM_BOARD -/* for system board LED is on pin 11/PA1 */ +/* on system board LED is on pin 11/PA1 */ #define LED_RCC RCC_GPIOA #define LED_PORT GPIOA #define LED_PIN GPIO1 #elif MAPLE_MINI -/* for maple mini LED is on pin 19/PB1 */ +/* on maple mini LED is on pin 19/PB1 */ #define LED_RCC RCC_GPIOB #define LED_PORT GPIOB #define LED_PIN GPIO1 #endif +/* user button */ +#ifdef MAPLE_MINI +/* on maple mini button is on 32/PB8 */ +#define BUTTON_RCC RCC_GPIOB +#define BUTTON_PORT GPIOB +#define BUTTON_PIN GPIO8 +#define BUTTON_EXTI EXTI8 +#define BUTTON_IRQ NVIC_EXTI9_5_IRQ +#define BUTTON_ISR exti9_5_isr +#endif + /* switch on LED */ void led_on(void); /* switch off LED */ diff --git a/main.c b/main.c index dc80370..0e2ae03 100644 --- a/main.c +++ b/main.c @@ -26,6 +26,8 @@ #include // general purpose input output library #include // vector table definition #include // Cortex M3 utilities +#include // interrupt utilities +#include // external interrupt utilities /* own libraries */ #include "global.h" // board definitions @@ -83,17 +85,26 @@ int main(void) SCB_VTOR = (uint32_t) 0x08002000; // relocate vector table because of the bootloader rcc_clock_setup_in_hse_8mhz_out_72mhz(); // use 8 MHz high speed external clock to generate 72 MHz internal clock + usart_setup(); // setup USART (for printing) + cdcacm_setup(); // setup USB CDC ACM (for printing) + setbuf(stdout, NULL); // set standard out buffer to NULL to immediately print + setbuf(stderr, NULL); // set standard error buffer to NULL to immediately print // setup LED - rcc_periph_clock_enable(LED_RCC); //enable clock for LED + rcc_periph_clock_enable(LED_RCC); // enable clock for LED gpio_set_mode(LED_PORT, GPIO_MODE_OUTPUT_2_MHZ, GPIO_CNF_OUTPUT_PUSHPULL, LED_PIN); // set LED pin to 'output push-pull' led_off(); // switch off LED to indicate setup started - usart_setup(); // setup USART (for printing) - cdcacm_setup(); // setup USB CDC ACM (for printing) - - setbuf(stdout, NULL); // set standard out buffer to NULL to immediately print - setbuf(stderr, NULL); // set standard error buffer to NULL to immediately print + // setup button +#if defined(BUTTON_RCC) && defined(BUTTON_PORT) && defined(BUTTON_PIN) && defined(BUTTON_EXTI) && defined(BUTTON_IRQ) + rcc_periph_clock_enable(BUTTON_RCC); // enable clock for button + gpio_set_mode(BUTTON_PORT, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT, BUTTON_PIN); // set button pin to input + rcc_periph_clock_enable(RCC_AFIO); // enable alternate function clock for external interrupt + exti_select_source(BUTTON_EXTI, BUTTON_PORT); // mask external interrupt of this pin only for this port + exti_set_trigger(BUTTON_EXTI, EXTI_TRIGGER_BOTH); // trigger on both edge + exti_enable_request(BUTTON_EXTI); // enable external interrupt + nvic_enable_irq(BUTTON_IRQ); // enable interrupt +#endif printf("welcome to the STM32F1 CuVoodoo example code\n"); // print welcome message led_on(); // switch on LED to indicate setup completed @@ -113,3 +124,11 @@ int main(void) return 0; } + +#if defined(BUTTON_ISR) && defined(BUTTON_EXTI) +void BUTTON_ISR(void) +{ + exti_reset_request(BUTTON_EXTI); // reset interrupt + led_toggle(); // toggle LED to show the button press has been detected +} +#endif