From 50b3522e7aefc7fad7fea8123f5ee2c40c8e217a Mon Sep 17 00:00:00 2001 From: Piotr Esden-Tempski Date: Wed, 14 Jan 2015 18:28:00 -0800 Subject: [PATCH] [stm32f429i-discovery] Added tick blink example. --- .../stm32f429i-discovery/tick_blink/Makefile | 25 +++++ .../f4/stm32f429i-discovery/tick_blink/README | 14 +++ .../tick_blink/tick_blink.c | 91 +++++++++++++++++++ 3 files changed, 130 insertions(+) create mode 100644 examples/stm32/f4/stm32f429i-discovery/tick_blink/Makefile create mode 100644 examples/stm32/f4/stm32f429i-discovery/tick_blink/README create mode 100644 examples/stm32/f4/stm32f429i-discovery/tick_blink/tick_blink.c diff --git a/examples/stm32/f4/stm32f429i-discovery/tick_blink/Makefile b/examples/stm32/f4/stm32f429i-discovery/tick_blink/Makefile new file mode 100644 index 0000000..f3fb691 --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/tick_blink/Makefile @@ -0,0 +1,25 @@ +## +## This file is part of the libopencm3 project. +## +## Copyright (C) 2009 Uwe Hermann +## +## 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 . +## + +BINARY = tick_blink + +LDSCRIPT = ../stm32f429i-discovery.ld + +include ../../Makefile.include + diff --git a/examples/stm32/f4/stm32f429i-discovery/tick_blink/README b/examples/stm32/f4/stm32f429i-discovery/tick_blink/README new file mode 100644 index 0000000..bf5a173 --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/tick_blink/README @@ -0,0 +1,14 @@ +------------------------------------------------------------------------------ +README +------------------------------------------------------------------------------ + +This example is the same as fancy_blink except that it uses the +systick timer to generate time accurate delays. Shows how to set +up the systick timer to create an interrupt every millisecond and +how to write a delay routine (msleep) that can then delay for a +specific number of milliseconds. + +Board connections: +------------------ + + diff --git a/examples/stm32/f4/stm32f429i-discovery/tick_blink/tick_blink.c b/examples/stm32/f4/stm32f429i-discovery/tick_blink/tick_blink.c new file mode 100644 index 0000000..a032a08 --- /dev/null +++ b/examples/stm32/f4/stm32f429i-discovery/tick_blink/tick_blink.c @@ -0,0 +1,91 @@ +/* + * This file is part of the libopencm3 project. + * + * Copyright (C) 2009 Uwe Hermann + * Copyright (C) 2011 Damjan Marion + * Copyright (C) 2011 Mark Panajotovic + * Copyright (C) 2013 Chuck McManis + * + * 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 . + */ + +/* This version derived from fancy blink */ + +#include +#include +#include +#include + +/* monotonically increasing number of milliseconds from reset + * overflows every 49 days if you're wondering + */ +volatile uint32_t system_millis; + +/* Called when systick fires */ +void sys_tick_handler(void) +{ + system_millis++; +} + +/* sleep for delay milliseconds */ +static void msleep(uint32_t delay) +{ + uint32_t wake = system_millis + delay; + while (wake > system_millis); +} + +/* Set up a timer to create 1mS ticks. */ +static void systick_setup(void) +{ + /* clock rate / 1000 to get 1mS interrupt rate */ + systick_set_reload(168000); + systick_set_clocksource(STK_CSR_CLKSOURCE_AHB); + systick_counter_enable(); + /* this done last */ + systick_interrupt_enable(); +} + +/* Set STM32 to 168 MHz. */ +static void clock_setup(void) +{ + rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]); + + /* Enable GPIOG clock. */ + rcc_periph_clock_enable(RCC_GPIOG); +} + +static void gpio_setup(void) +{ + /* Set GPIO13-14 (in GPIO port G) to 'output push-pull'. */ + gpio_mode_setup(GPIOG, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, + GPIO13 | GPIO14); +} + +int main(void) +{ + clock_setup(); + gpio_setup(); + systick_setup(); + + /* Set two LEDs for wigwag effect when toggling. */ + gpio_set(GPIOG, GPIO13); + + /* Blink the LEDs (PG13 and PG14) on the board. */ + while (1) { + gpio_toggle(GPIOG, GPIO13 | GPIO14); + msleep(100); + } + + return 0; +}