aboutsummaryrefslogtreecommitdiff
path: root/examples/stm32/f2
diff options
context:
space:
mode:
authorStephen Caudle2011-10-31 00:16:37 -0400
committerStephen Caudle2011-10-31 00:16:37 -0400
commit580d25a84baaa160b0afdc096e9aa1e8ca1c2d2b (patch)
treed3df10cb7a99745eafabe15a0ec286dc9923b4e8 /examples/stm32/f2
parent68d2e0d1e3c587e18eef6a6ef9c40b3549b2f9e7 (diff)
Move STM32 example projects in family specific folders
Diffstat (limited to 'examples/stm32/f2')
-rw-r--r--examples/stm32/f2/Makefile.include138
-rw-r--r--examples/stm32/f2/jobygps/jobygps.cfg3
-rw-r--r--examples/stm32/f2/jobygps/miniblink/Makefile23
-rw-r--r--examples/stm32/f2/jobygps/miniblink/README6
-rw-r--r--examples/stm32/f2/jobygps/miniblink/miniblink.c77
-rw-r--r--examples/stm32/f2/jobygps/miniblink/miniblink.ld31
-rw-r--r--examples/stm32/f2/jobygps/spi_test/Makefile23
-rw-r--r--examples/stm32/f2/jobygps/spi_test/spi_test.c113
-rw-r--r--examples/stm32/f2/jobygps/spi_test/spi_test.ld31
-rw-r--r--examples/stm32/f2/jobygps/usart_printf/Makefile23
-rw-r--r--examples/stm32/f2/jobygps/usart_printf/usart_printf.c109
-rw-r--r--examples/stm32/f2/jobygps/usart_printf/usart_printf.ld31
12 files changed, 608 insertions, 0 deletions
diff --git a/examples/stm32/f2/Makefile.include b/examples/stm32/f2/Makefile.include
new file mode 100644
index 0000000..aa9a159
--- /dev/null
+++ b/examples/stm32/f2/Makefile.include
@@ -0,0 +1,138 @@
+##
+## This file is part of the libopencm3 project.
+##
+## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+## Copyright (C) 2010 Piotr Esden-Tempski <piotr@esden.net>
+## Copyright (C) 2011 Fergus Noble <fergusnoble@gmail.com>
+##
+## 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/>.
+##
+
+PREFIX ?= arm-none-eabi
+# PREFIX ?= arm-elf
+CC = $(PREFIX)-gcc
+LD = $(PREFIX)-gcc
+OBJCOPY = $(PREFIX)-objcopy
+OBJDUMP = $(PREFIX)-objdump
+GDB = $(PREFIX)-gdb
+# Uncomment this line if you want to use the installed (not local) library.
+#TOOLCHAIN_DIR := $(shell dirname `which $(CC)`)/../$(PREFIX)
+TOOLCHAIN_DIR = ../../../../..
+CFLAGS += -Os -g -Wall -Wextra -I$(TOOLCHAIN_DIR)/include \
+ -fno-common -mcpu=cortex-m3 -mthumb -msoft-float -MD -DSTM32F2
+LDSCRIPT = $(BINARY).ld
+LDFLAGS += -lc -lnosys -L$(TOOLCHAIN_DIR)/lib \
+ -L$(TOOLCHAIN_DIR)/lib/stm32/f2 \
+ -T$(LDSCRIPT) -nostartfiles -Wl,--gc-sections \
+ -mthumb -march=armv7 -mfix-cortex-m3-ldrd -msoft-float
+OBJS += $(BINARY).o
+
+OOCD ?= openocd
+OOCD_INTERFACE ?= flossjtag
+OOCD_BOARD ?= olimex_stm32_h103
+# Black magic probe specific variables
+# Set the BMP_PORT to a serial port and then BMP is used for flashing
+BMP_PORT ?=
+
+# Be silent per default, but 'make V=1' will show all compiler calls.
+ifneq ($(V),1)
+Q := @
+NULL := 2>/dev/null
+else
+LDFLAGS += -Wl,--print-gc-sections
+endif
+
+.SUFFIXES: .elf .bin .hex .srec .list .images
+.SECONDEXPANSION:
+.SECONDARY:
+
+all: images
+
+images: $(BINARY).images
+flash: $(BINARY).flash
+
+%.images: %.bin %.hex %.srec %.list
+ @#echo "*** $* images generated ***"
+
+%.bin: %.elf
+ @#printf " OBJCOPY $(*).bin\n"
+ $(Q)$(OBJCOPY) -Obinary $(*).elf $(*).bin
+
+%.hex: %.elf
+ @#printf " OBJCOPY $(*).hex\n"
+ $(Q)$(OBJCOPY) -Oihex $(*).elf $(*).hex
+
+%.srec: %.elf
+ @#printf " OBJCOPY $(*).srec\n"
+ $(Q)$(OBJCOPY) -Osrec $(*).elf $(*).srec
+
+%.list: %.elf
+ @#printf " OBJDUMP $(*).list\n"
+ $(Q)$(OBJDUMP) -S $(*).elf > $(*).list
+
+%.elf: $(OBJS) $(LDSCRIPT) $(TOOLCHAIN_DIR)/lib/stm32/f2/libopencm3_stm32f2.a
+ @#printf " LD $(subst $(shell pwd)/,,$(@))\n"
+ $(Q)$(LD) -o $(*).elf $(OBJS) -lopencm3_stm32f2 $(LDFLAGS)
+
+%.o: %.c Makefile
+ @#printf " CC $(subst $(shell pwd)/,,$(@))\n"
+ $(Q)$(CC) $(CFLAGS) -o $@ -c $<
+
+clean:
+ $(Q)rm -f *.o
+ $(Q)rm -f *.d
+ $(Q)rm -f *.elf
+ $(Q)rm -f *.bin
+ $(Q)rm -f *.hex
+ $(Q)rm -f *.srec
+ $(Q)rm -f *.list
+
+ifeq ($(BMP_PORT),)
+ifeq ($(OOCD_SERIAL),)
+%.flash: %.hex
+ @printf " FLASH $<\n"
+ @# IMPORTANT: Don't use "resume", only "reset" will work correctly!
+ $(Q)$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \
+ -f board/$(OOCD_BOARD).cfg \
+ -c "init" -c "reset init" \
+ -c "stm32x mass_erase 0" \
+ -c "flash write_image $(*).hex" \
+ -c "reset" \
+ -c "shutdown" $(NULL)
+else
+%.flash: %.hex
+ @printf " FLASH $<\n"
+ @# IMPORTANT: Don't use "resume", only "reset" will work correctly!
+ $(Q)$(OOCD) -f interface/$(OOCD_INTERFACE).cfg \
+ -f board/$(OOCD_BOARD).cfg \
+ -c "ft2232_serial $(OOCD_SERIAL)" \
+ -c "init" -c "reset init" \
+ -c "stm32x mass_erase 0" \
+ -c "flash write_image $(*).hex" \
+ -c "reset" \
+ -c "shutdown" $(NULL)
+endif
+else
+%.flash: %.elf
+ @echo " GDB $(*).elf (flash)"
+ $(Q)$(GDB) --batch \
+ -ex 'target extended-remote $(BMP_PORT)' \
+ -x $(TOOLCHAIN_DIR)/scripts/black_magic_probe_flash.scr \
+ $(*).elf
+endif
+
+.PHONY: images clean
+
+-include $(OBJS:.o=.d)
+
diff --git a/examples/stm32/f2/jobygps/jobygps.cfg b/examples/stm32/f2/jobygps/jobygps.cfg
new file mode 100644
index 0000000..7ca449e
--- /dev/null
+++ b/examples/stm32/f2/jobygps/jobygps.cfg
@@ -0,0 +1,3 @@
+reset_config srst_only srst_push_pull
+source [find target/stm32f2x.cfg]
+
diff --git a/examples/stm32/f2/jobygps/miniblink/Makefile b/examples/stm32/f2/jobygps/miniblink/Makefile
new file mode 100644
index 0000000..24a478b
--- /dev/null
+++ b/examples/stm32/f2/jobygps/miniblink/Makefile
@@ -0,0 +1,23 @@
+##
+## This file is part of the libopencm3 project.
+##
+## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## 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/>.
+##
+
+BINARY = miniblink
+
+include ../../Makefile.include
+
diff --git a/examples/stm32/f2/jobygps/miniblink/README b/examples/stm32/f2/jobygps/miniblink/README
new file mode 100644
index 0000000..0130112
--- /dev/null
+++ b/examples/stm32/f2/jobygps/miniblink/README
@@ -0,0 +1,6 @@
+------------------------------------------------------------------------------
+README
+------------------------------------------------------------------------------
+
+This is the smallest-possible example program using libopencm3.
+
diff --git a/examples/stm32/f2/jobygps/miniblink/miniblink.c b/examples/stm32/f2/jobygps/miniblink/miniblink.c
new file mode 100644
index 0000000..2927df5
--- /dev/null
+++ b/examples/stm32/f2/jobygps/miniblink/miniblink.c
@@ -0,0 +1,77 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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/stm32/rcc.h>
+#include <libopencm3/stm32/f2/gpio.h>
+
+void gpio_setup(void)
+{
+ /* Enable GPIOC clock. */
+ /* Manually: */
+ // RCC_APB2ENR |= RCC_APB2ENR_IOPCEN;
+ /* Using API functions: */
+ //rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPCEN);
+
+ /* Set GPIO12 (in GPIO port C) to 'output push-pull'. */
+ /* Manually: */
+ // GPIOC_CRH = (GPIO_CNF_OUTPUT_PUSHPULL << (((12 - 8) * 4) + 2));
+ // GPIOC_CRH |= (GPIO_MODE_OUTPUT_2_MHZ << ((12 - 8) * 4));
+ /* Using API functions: */
+ MMIO32(RCC_BASE+0x30) |= (1<<2);
+ gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO3|GPIO4);
+}
+
+int main(void)
+{
+ int i;
+
+ gpio_setup();
+
+ /* Blink the LED (PC12) on the board. */
+ while (1) {
+ /* Manually: */
+ // GPIOC_BSRR = GPIO12; /* LED off */
+ // for (i = 0; i < 800000; i++) /* Wait a bit. */
+ // __asm__("nop");
+ // GPIOC_BRR = GPIO12; /* LED on */
+ // for (i = 0; i < 800000; i++) /* Wait a bit. */
+ // __asm__("nop");
+
+ /* Using API functions gpio_set()/gpio_clear(): */
+ // gpio_set(GPIOC, GPIO12); /* LED off */
+ // for (i = 0; i < 800000; i++) /* Wait a bit. */
+ // __asm__("nop");
+ // gpio_clear(GPIOC, GPIO12); /* LED on */
+ // for (i = 0; i < 800000; i++) /* Wait a bit. */
+ // __asm__("nop");
+
+ /* Using API function gpio_toggle(): */
+ //gpio_toggle(GPIOC, GPIO3); /* LED on/off */
+ gpio_set(GPIOC, GPIO3);
+ gpio_clear(GPIOC, GPIO4);
+ for (i = 0; i < 800000; i++) /* Wait a bit. */
+ __asm__("nop");
+ gpio_clear(GPIOC, GPIO3);
+ gpio_set(GPIOC, GPIO4);
+ for (i = 0; i < 800000; i++) /* Wait a bit. */
+ __asm__("nop");
+ }
+
+ return 0;
+}
diff --git a/examples/stm32/f2/jobygps/miniblink/miniblink.ld b/examples/stm32/f2/jobygps/miniblink/miniblink.ld
new file mode 100644
index 0000000..cfe9ab7
--- /dev/null
+++ b/examples/stm32/f2/jobygps/miniblink/miniblink.ld
@@ -0,0 +1,31 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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/>.
+ */
+
+/* Linker script for Olimex STM32-H103 (STM32F103RBT6, 128K flash, 20K RAM). */
+
+/* Define memory regions. */
+MEMORY
+{
+ rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K
+ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
+}
+
+/* Include the common ld script. */
+INCLUDE libopencm3_stm32f2.ld
+
diff --git a/examples/stm32/f2/jobygps/spi_test/Makefile b/examples/stm32/f2/jobygps/spi_test/Makefile
new file mode 100644
index 0000000..de4c338
--- /dev/null
+++ b/examples/stm32/f2/jobygps/spi_test/Makefile
@@ -0,0 +1,23 @@
+##
+## This file is part of the libopencm3 project.
+##
+## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## 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/>.
+##
+
+BINARY = spi_test
+
+include ../../Makefile.include
+
diff --git a/examples/stm32/f2/jobygps/spi_test/spi_test.c b/examples/stm32/f2/jobygps/spi_test/spi_test.c
new file mode 100644
index 0000000..f1ce719
--- /dev/null
+++ b/examples/stm32/f2/jobygps/spi_test/spi_test.c
@@ -0,0 +1,113 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2011 Fergus Noble <fergusnoble@gmail.com>
+ * Copyright (C) 2011 Henry Hallam <henry@pericynthion.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/stm32/spi.h>
+#include <libopencm3/stm32/usart.h>
+#include <libopencm3/stm32/nvic.h>
+#include <libopencm3/stm32/f2/gpio.h>
+#include <libopencm3/stm32/f2/rcc.h>
+
+#include <stdio.h>
+#include <errno.h>
+
+void clock_setup(void)
+{
+ RCC_APB1ENR |= RCC_APB1ENR_SPI2EN;
+ RCC_APB2ENR |= RCC_APB2ENR_USART1EN;
+ RCC_AHB1ENR |= RCC_AHB1ENR_IOPCEN | RCC_AHB1ENR_IOPAEN | RCC_AHB1ENR_IOPBEN;
+
+}
+
+void spi_setup(void)
+{
+ gpio_mode_setup(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO13 | GPIO14 | GPIO15);
+ gpio_set_af(GPIOB, GPIO_AF5, GPIO13 | GPIO14 | GPIO15);
+
+ /* Setup SPI parameters. */
+ spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_256, SPI_CR1_CPOL, \
+ SPI_CR1_CPHA, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
+ spi_enable_ss_output(SPI2); /* Required, see 25.3.1 section about NSS */
+
+ /* Finally enable the SPI. */
+ spi_enable(SPI2);
+}
+
+void usart_setup(void)
+{
+ gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9);
+ gpio_set_af(GPIOA, GPIO_AF7, GPIO9|GPIO10);
+
+ /* Setup UART parameters. */
+ usart_set_baudrate(USART1, 9600, 16000000);
+ usart_set_databits(USART1, 8);
+ usart_set_stopbits(USART1, USART_STOPBITS_1);
+ usart_set_parity(USART1, USART_PARITY_NONE);
+ usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
+ usart_set_mode(USART1, USART_MODE_TX);
+
+ /* Finally enable the USART. */
+ usart_enable(USART1);
+}
+
+void gpio_setup(void)
+{
+ gpio_set(GPIOC, GPIO3);
+
+ /* Setup GPIO3 (in GPIO port C) for led use. */
+ gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT,
+ GPIO_MODE_OUTPUT, GPIO3);
+}
+
+int _write (int file, char *ptr, int len)
+{
+ int i;
+
+ if (file == 1) {
+ for (i = 0; i < len; i++){
+ usart_send_blocking(USART1, ptr[i]);
+ }
+ return i;
+ }
+ errno = EIO;
+ return -1;
+}
+
+int main(void)
+{
+ int counter = 0;
+ volatile u16 dummy;
+
+ clock_setup();
+ gpio_setup();
+ usart_setup();
+ spi_setup();
+
+ while (1)
+ {
+ counter++;
+ printf("Hello, world! %i\r\n", counter);
+ dummy = spi_read(SPI2); /* Stops RX buff overflow, but probably not needed */
+ spi_send(SPI2,(u8)counter);
+ gpio_toggle(GPIOC, GPIO3);
+ }
+
+ while(1);
+ return 0;
+}
diff --git a/examples/stm32/f2/jobygps/spi_test/spi_test.ld b/examples/stm32/f2/jobygps/spi_test/spi_test.ld
new file mode 100644
index 0000000..cfe9ab7
--- /dev/null
+++ b/examples/stm32/f2/jobygps/spi_test/spi_test.ld
@@ -0,0 +1,31 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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/>.
+ */
+
+/* Linker script for Olimex STM32-H103 (STM32F103RBT6, 128K flash, 20K RAM). */
+
+/* Define memory regions. */
+MEMORY
+{
+ rom (rx) : ORIGIN = 0x08000000, LENGTH = 256K
+ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 64K
+}
+
+/* Include the common ld script. */
+INCLUDE libopencm3_stm32f2.ld
+
diff --git a/examples/stm32/f2/jobygps/usart_printf/Makefile b/examples/stm32/f2/jobygps/usart_printf/Makefile
new file mode 100644
index 0000000..fb26208
--- /dev/null
+++ b/examples/stm32/f2/jobygps/usart_printf/Makefile
@@ -0,0 +1,23 @@
+##
+## This file is part of the libopencm3 project.
+##
+## Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+##
+## 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/>.
+##
+
+BINARY = usart_printf
+
+include ../../Makefile.include
+
diff --git a/examples/stm32/f2/jobygps/usart_printf/usart_printf.c b/examples/stm32/f2/jobygps/usart_printf/usart_printf.c
new file mode 100644
index 0000000..d9c8dbb
--- /dev/null
+++ b/examples/stm32/f2/jobygps/usart_printf/usart_printf.c
@@ -0,0 +1,109 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>,
+ * 2011 Piotr Esden-Tempski <piotr@esden.net>
+ *
+ * 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/stm32/f2/gpio.h>
+#include <libopencm3/stm32/usart.h>
+#include <libopencm3/stm32/nvic.h>
+#include <libopencm3/stm32/f2/rcc.h>
+
+#include <stdio.h>
+#include <errno.h>
+
+void clock_setup(void)
+{
+ //rcc_clock_setup_in_hse_8mhz_out_72mhz();
+
+ /* Enable GPIOA clock (for LED GPIOs). */
+ //rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPCEN);
+
+ /* Enable clocks for GPIO port A (for GPIO_USART1_TX) and USART1. */
+ //rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_IOPAEN |
+// RCC_APB2ENR_AFIOEN |
+// RCC_APB2ENR_USART1EN);
+ RCC_APB2ENR |= RCC_APB2ENR_USART1EN;
+ RCC_AHB1ENR |= RCC_AHB1ENR_IOPCEN | RCC_AHB1ENR_IOPAEN;
+}
+
+void usart_setup(void)
+{
+ gpio_mode_setup(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO9);
+ gpio_set_af(GPIOA, GPIO_AF7, GPIO9|GPIO10);
+
+ /* Setup UART parameters. */
+ usart_set_baudrate(USART1, 9600, 16000000);
+ usart_set_databits(USART1, 8);
+ usart_set_stopbits(USART1, USART_STOPBITS_1);
+ usart_set_parity(USART1, USART_PARITY_NONE);
+ usart_set_flow_control(USART1, USART_FLOWCONTROL_NONE);
+ usart_set_mode(USART1, USART_MODE_TX);
+
+ /* Finally enable the USART. */
+ usart_enable(USART1);
+}
+
+void gpio_setup(void)
+{
+ gpio_set(GPIOC, GPIO3);
+
+ /* Setup GPIO6 and 7 (in GPIO port A) for led use. */
+ gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT,
+ GPIO_MODE_OUTPUT, GPIO3);
+}
+
+int _write (int file, char *ptr, int len)
+{
+ int i;
+
+ if (file == 1) {
+ for (i = 0; i < len; i++){
+ usart_send_blocking(USART1, ptr[i]);
+ }
+
+ return i;
+ }
+
+ errno = EIO;
+ return -1;
+}
+
+int main(void)
+{
+ int counter = 0;
+ float fcounter = 0.0;
+ double dcounter = 0.0;
+
+ clock_setup();
+ gpio_setup();
+ usart_setup();
+
+ /*
+ * Write Hello World an integer, float and double all over
+ * again while incrementing the numbers.
+ */
+ while (1) {
+ gpio_toggle(GPIOC, GPIO3);
+ printf("Hello World! %i %f %f\r\n", counter, fcounter, dcounter);
+ counter++;
+ fcounter+=0.01;
+ dcounter+=0.01;
+ }
+
+ return 0;
+}
diff --git a/examples/stm32/f2/jobygps/usart_printf/usart_printf.ld b/examples/stm32/f2/jobygps/usart_printf/usart_printf.ld
new file mode 100644
index 0000000..e80bdbd
--- /dev/null
+++ b/examples/stm32/f2/jobygps/usart_printf/usart_printf.ld
@@ -0,0 +1,31 @@
+/*
+ * This file is part of the libopencm3 project.
+ *
+ * Copyright (C) 2009 Uwe Hermann <uwe@hermann-uwe.de>
+ *
+ * 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/>.
+ */
+
+/* Linker script for Open-BLDC (STM32F103CBT6, 128K flash, 20K RAM). */
+
+/* Define memory regions. */
+MEMORY
+{
+ rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
+ ram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K
+}
+
+/* Include the common ld script. */
+INCLUDE libopencm3_stm32f2.ld
+