Enable nvic and exti support for L1
And include an example that uses it.
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
##
|
||||
## This file is part of the libopencm3 project.
|
||||
##
|
||||
## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
|
||||
##
|
||||
## This library is free software: you can redistribute it and/or modify
|
||||
## it under the terms of the GNU Lesser General Public License as published by
|
||||
## the Free Software Foundation, either version 3 of the License, or
|
||||
## (at your option) any later version.
|
||||
##
|
||||
## This library is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
## GNU Lesser General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU Lesser General Public License
|
||||
## along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
##
|
||||
|
||||
BINARY = main
|
||||
LDSCRIPT = ../../../../../lib/stm32/l1/stm32l15xxb.ld
|
||||
|
||||
include ../../Makefile.include
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
* Counts how long the user button was held down (in ms)
|
||||
* Uses one free running counter plus EXTI as an ugly input capture
|
||||
115200@8n1 console on PA2 (tx only)
|
||||
|
||||
117
examples/stm32/l1/stm32l-discovery/button-irq-printf/main.c
Normal file
117
examples/stm32/l1/stm32l-discovery/button-irq-printf/main.c
Normal file
@@ -0,0 +1,117 @@
|
||||
/*
|
||||
* Karl Palsson, 2012 <karlp@tweak.net.au
|
||||
*/
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <libopencm3/cm3/nvic.h>
|
||||
#include <libopencm3/stm32/l1/rcc.h>
|
||||
#include <libopencm3/stm32/l1/gpio.h>
|
||||
#include <libopencm3/stm32/exti.h>
|
||||
#include <libopencm3/stm32/usart.h>
|
||||
|
||||
#include "syscfg.h"
|
||||
|
||||
static struct state_t state;
|
||||
|
||||
void clock_setup(void) {
|
||||
/* Lots of things on all ports... */
|
||||
rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_GPIOAEN);
|
||||
rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_GPIOBEN);
|
||||
|
||||
/* Enable clocks for USART2. */
|
||||
rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_USART2EN);
|
||||
}
|
||||
|
||||
void gpio_setup(void) {
|
||||
gpio_mode_setup(LED_DISCO_GREEN_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, LED_DISCO_GREEN_PIN);
|
||||
|
||||
/* Setup GPIO pins for USART2 transmit. */
|
||||
gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO2);
|
||||
|
||||
/* Setup USART2 TX pin as alternate function. */
|
||||
gpio_set_af(GPIOA, GPIO_AF7, GPIO2);
|
||||
}
|
||||
|
||||
void usart_setup(void) {
|
||||
usart_set_baudrate(USART_CONSOLE, 115200);
|
||||
usart_set_databits(USART_CONSOLE, 8);
|
||||
usart_set_stopbits(USART_CONSOLE, USART_STOPBITS_1);
|
||||
usart_set_mode(USART_CONSOLE, USART_MODE_TX);
|
||||
usart_set_parity(USART_CONSOLE, USART_PARITY_NONE);
|
||||
usart_set_flow_control(USART_CONSOLE, USART_FLOWCONTROL_NONE);
|
||||
|
||||
/* Finally enable the USART. */
|
||||
usart_enable(USART_CONSOLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Use USART_CONSOLE as a console.
|
||||
* @param file
|
||||
* @param ptr
|
||||
* @param len
|
||||
* @return
|
||||
*/
|
||||
int _write(int file, char *ptr, int len) {
|
||||
int i;
|
||||
|
||||
if (file == STDOUT_FILENO || file == STDERR_FILENO) {
|
||||
for (i = 0; i < len; i++) {
|
||||
if (ptr[i] == '\n') {
|
||||
usart_send_blocking(USART_CONSOLE, '\r');
|
||||
}
|
||||
usart_send_blocking(USART_CONSOLE, ptr[i]);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
errno = EIO;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void BUTTON_DISCO_USER_isr(void) {
|
||||
exti_reset_request(BUTTON_DISCO_USER_EXTI);
|
||||
if (state.falling) {
|
||||
state.falling = false;
|
||||
exti_set_trigger(BUTTON_DISCO_USER_EXTI, EXTI_TRIGGER_RISING);
|
||||
// ILOG("fell: %d\n", TIM_CNT(TIM7));
|
||||
puts("fell!\n");
|
||||
} else {
|
||||
puts("Rose!\n");
|
||||
// TIM_CNT(TIM7) = 0;
|
||||
state.falling = true;
|
||||
exti_set_trigger(BUTTON_DISCO_USER_EXTI, EXTI_TRIGGER_FALLING);
|
||||
}
|
||||
}
|
||||
|
||||
void setup_buttons(void) {
|
||||
/* Enable EXTI0 interrupt. */
|
||||
nvic_enable_irq(BUTTON_DISCO_USER_NVIC);
|
||||
|
||||
gpio_mode_setup(BUTTON_DISCO_USER_PORT, GPIO_MODE_INPUT, GPIO_PUPD_NONE, BUTTON_DISCO_USER_PIN);
|
||||
|
||||
/* Configure the EXTI subsystem. */
|
||||
exti_select_source(BUTTON_DISCO_USER_EXTI, BUTTON_DISCO_USER_PORT);
|
||||
state.falling = false;
|
||||
exti_set_trigger(BUTTON_DISCO_USER_EXTI, EXTI_TRIGGER_RISING);
|
||||
exti_enable_request(BUTTON_DISCO_USER_EXTI);
|
||||
}
|
||||
|
||||
int main(void) {
|
||||
int i;
|
||||
int j = 0;
|
||||
clock_setup();
|
||||
gpio_setup();
|
||||
usart_setup();
|
||||
puts("hi guys!\n");
|
||||
setup_buttons();
|
||||
while (1) {
|
||||
puts("tick:");
|
||||
putchar('a' + (j++ % 26));
|
||||
gpio_toggle(GPIOB, GPIO7); /* LED on/off */
|
||||
for (i = 0; i < 100000; i++) /* Wait a bit. */
|
||||
__asm__("NOP");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
/*
|
||||
* General configuration of the device
|
||||
*
|
||||
* Karl Palsson <karlp@tweak.net.au> 2012
|
||||
*/
|
||||
|
||||
#ifndef SYSCFG_H
|
||||
#define SYSCFG_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include <libopencm3/stm32/l1/gpio.h>
|
||||
#include <libopencm3/stm32/nvic.h>
|
||||
#include <libopencm3/stm32/exti.h>
|
||||
#include <libopencm3/stm32/usart.h>
|
||||
|
||||
|
||||
#define USART_CONSOLE USART2
|
||||
#define USE_NASTYLOG 1
|
||||
|
||||
#define LED_DISCO_GREEN_PORT GPIOB
|
||||
#define LED_DISCO_GREEN_PIN GPIO7
|
||||
#define LED_DISCO_BLUE_PORT GPIOB
|
||||
#define LED_DISCO_BLUE_PIN GPIO6
|
||||
|
||||
#define BUTTON_DISCO_USER_PORT GPIOA
|
||||
#define BUTTON_DISCO_USER_PIN GPIO0
|
||||
#define BUTTON_DISCO_USER_EXTI EXTI0
|
||||
#define BUTTON_DISCO_USER_isr exti0_isr
|
||||
#define BUTTON_DISCO_USER_NVIC NVIC_EXTI0_IRQ
|
||||
|
||||
|
||||
struct state_t {
|
||||
bool falling;
|
||||
};
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* SYSCFG_H */
|
||||
|
||||
Reference in New Issue
Block a user