efm32: energy management unit headers and example

This commit is contained in:
chrysn
2012-03-02 21:54:23 +01:00
parent eda122180a
commit e388056fda
6 changed files with 335 additions and 65 deletions

View File

@@ -2,8 +2,12 @@
EFM32-TG-STK3300 Examples lightswitch README
============================================
This is a small example program for GPIO input and output (and, in future, IRQ
handling).
This is a small example program for GPIO input and output, and how the device
can be configured to use minimal power (although the example is merely
scratching the surface of what is possible powersaving-wise).
It's intended for the EFM32-TG-STK3300 eval board. It turn the User LED on when
PB0 is pressed, and off when PB1 is pressed.
Various implementations are offered (-busywait, -interrupt), and can configured
in lightswitch.c.

View File

@@ -0,0 +1,40 @@
/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2012 chrysn <chrysn@fsfe.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libopencm3/efm32/tinygecko/irq.h>
#include <libopencm3/efm32/tinygecko/emu.h>
#define ISER0 MMIO32(0xE000E100)
#define ICER0 MMIO32(0xE000E180)
#define ISPR0 MMIO32(0XE000E200)
#define ICPR0 MMIO32(0XE000E280)
/** @file Simplest implementation of the lightswitch mechanism. */
int main(void)
{
gpio_setup();
while(1) {
if (pb0_get())
led_on();
if (pb1_get())
led_off();
};
}

View File

@@ -0,0 +1,88 @@
/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2012 chrysn <chrysn@fsfe.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file Common definitions used by all lightswitch implementations */
#include <libopencm3/efm32/tinygecko/gpio.h>
#include <libopencm3/efm32/tinygecko/cmu.h>
/** The User LED is connected to PD7 to the plus side of the LED according to
* t0011_efm32_tiny_gecko_stk_user_manual.pdf figures 16.2 and 16.3 (called
* UIF_LED0)
*/
#define LED_PORT GPIO_PD
#define LED_PIN GPIO7
#define BUTTON0_PORT GPIO_PD
#define BUTTON0_PORT_EXTIPSEL GPIO_EXTIPSEL_PORTD
#define BUTTON0_PIN_NUMBER 8
#define BUTTON0_PIN GPIO8
#define BUTTON1_PORT GPIO_PB
#define BUTTON1_PORT_EXTIPSEL GPIO_EXTIPSEL_PORTB
#define BUTTON1_PIN_NUMBER 11
#define BUTTON1_PIN GPIO11
void gpio_setup(void);
void led_on(void);
void led_off(void);
bool pb0_get(void);
bool pb1_get(void);
/**
* Enable GPIO, and set up port D7 as an output pin and D8 and B11 as input.
*/
void gpio_setup(void)
{
// Before GPIO works, according to d0034_efm32tg_reference_manual.pdf
// note in section 28.3.7, we'll have to enable GPIO in CMU_HFPERCLKEN0
CMU_HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
gpio_set_mode(LED_PORT, GPIO_MODE_PUSHPULL, LED_PIN);
// Button PB0 is connected to pin PD8 and pulled low when pushed,
// Botton PB1 to pin PB11 (sources as for LED). Pullups and debouncing
// are alreay in place in hardware, so no filtering or pullup is
// needed.
gpio_set_mode(BUTTON0_PORT, GPIO_MODE_INPUT, BUTTON0_PIN);
gpio_set_mode(BUTTON1_PORT, GPIO_MODE_INPUT, BUTTON1_PIN);
}
void led_on(void)
{
gpio_set(LED_PORT, LED_PIN);
}
void led_off(void)
{
gpio_clear(LED_PORT, LED_PIN);
}
bool pb0_get(void)
{
return !gpio_get(GPIO_PD, GPIO8);
}
bool pb1_get(void)
{
return !gpio_get(GPIO_PB, GPIO11);
}

View File

@@ -0,0 +1,71 @@
/*
* This file is part of the libopencm3 project.
*
* Copyright (C) 2012 chrysn <chrysn@fsfe.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libopencm3/efm32/tinygecko/irq.h>
#include <libopencm3/efm32/tinygecko/emu.h>
#define ISER0 MMIO32(0xE000E100)
void interrupt_setup()
{
// These are the ports the pin interrupts for 8 and 11 are to be
// configured to, and they should trigger on falling edge.
GPIO_EXTIPSELH = (BUTTON0_PORT_EXTIPSEL << ((BUTTON0_PIN_NUMBER-8)*4)) |
(BUTTON1_PORT_EXTIPSEL << ((BUTTON1_PIN_NUMBER-8)*4));
GPIO_EXTIFALL = BUTTON0_PIN | BUTTON1_PIN;
// Enable interrupts on the GPIO side
GPIO_INSENSE = GPIO_INSENSE_INT;
GPIO_IEN = BUTTON0_PIN | BUTTON1_PIN;
// Enable GPIO interrupts in NVIC
ISER0 = (1<<IRQ_GPIO_EVEN) | (1<<IRQ_GPIO_ODD);
}
int main(void)
{
gpio_setup();
interrupt_setup();
while(1) {
emu_sleep_em1();
};
}
void gpio_even_isr()
{
// Clearing the GPIO interrupt pending register. While the NVIC
// interrupt pending register gets cleared automatically once it jumps
// here, the pin's pending state has to be cleared explicitly.
// (Dispatch to different subroutines for different even pins that
// trigger an interrupt would happen here.)
GPIO_IFC = BUTTON0_PIN;
led_on();
}
void gpio_odd_isr()
{
// See gpio_even_isr.
GPIO_IFC = BUTTON1_PIN;
led_off();
}

View File

@@ -17,72 +17,14 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <libopencm3/efm32/tinygecko/gpio.h>
#include <libopencm3/efm32/tinygecko/cmu.h>
void gpio_setup(void);
void led_on(void);
void led_off(void);
bool pb0_get(void);
bool pb1_get(void);
/** @file
* Example for switching the User LED of the EFM32-TG-STK330 eval board on and
* off using the buttons.
*/
int main(void)
{
gpio_setup();
#include "lightswitch-common.c"
while(1) {
if (pb0_get()) led_on();
if (pb1_get()) led_off();
};
}
/**
* Enable GPIO, and set up port D7 as an output pin.
*/
void gpio_setup(void)
{
// Before GPIO works, according to d0034_efm32tg_reference_manual.pdf
// note in section 28.3.7, we'll have to enable GPIO in CMU_HFPERCLKEN0
CMU_HFPERCLKEN0 |= CMU_HFPERCLKEN0_GPIO;
// The User LED is connected to PD7 to the plus side of the LED
// according to t0011_efm32_tiny_gecko_stk_user_manual.pdf figures 16.2
// and 16.3 (called UIF_LED0)
gpio_set_mode(GPIO_PD, GPIO_MODE_PUSHPULL, GPIO7);
// Button PB0 is connected to pin PD8 and pulled low when pushed,
// Botton PB1 to pin PB11 (sources as for LED). Pullups and debouncing
// are alreay in place in hardware, so no filtering or pullup is
// needed.
gpio_set_mode(GPIO_PD, GPIO_MODE_INPUT, GPIO8);
gpio_set_mode(GPIO_PB, GPIO_MODE_INPUT, GPIO11);
}
void led_on(void)
{
gpio_set(GPIO_PD, GPIO7);
}
void led_off(void)
{
gpio_clear(GPIO_PD, GPIO7);
}
bool pb0_get(void)
{
return !gpio_get(GPIO_PD, GPIO8);
}
bool pb1_get(void)
{
return !gpio_get(GPIO_PB, GPIO11);
}
/** Change this include to -busywait, -interrupt, or -prs (not implemented
* yet). The overall behavior will not change, but different implementations
* will be used. */
#include "lightswitch-busywait.c"