From 915d5bff90c86e1c8c072b0f13177f82283f3883 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Sat, 18 Jul 2009 06:09:08 +0200 Subject: [PATCH] Implement the simplest possible (working) blinking LED example application. This is the first working example code which is tested on hardware. The LED on the Olimex STM-H103 eval board is happily blinking. We use a dummy "delay" function (basically a busy-waiting for-loop), which will only work if you use -O0 in CFLAGS (-O2, -O3, or -Os will not work as the compiler optimizes the loop away). We use some arbitrary value for stack size (2 KB) and use main() directly as the reset vector function. This will change later. Also, we do the GPIO and clock init as well as the GPIO toggling for the LED blinking fully "manually" for now, but there may be more higher-level functions for doing that at some later date. --- example/Makefile | 2 +- example/blink.c | 22 +++++++++++++++++++++- example/blink.ld | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/example/Makefile b/example/Makefile index 23d07e52..0667d670 100644 --- a/example/Makefile +++ b/example/Makefile @@ -26,7 +26,7 @@ CC = $(PREFIX)-gcc LD = $(PREFIX)-ld OBJCOPY = $(PREFIX)-objcopy OBJDUMP = $(PREFIX)-objdump -CFLAGS = -Os -g -Wall -Wextra -I../include -fno-common \ +CFLAGS = -O0 -g -Wall -Wextra -I../include -fno-common \ -mcpu=cortex-m3 -mthumb LDFLAGS = -L../lib -T$(BINARY).ld -nostartfiles OBJS = $(BINARY).o diff --git a/example/blink.c b/example/blink.c index aa68322a..21ac147b 100644 --- a/example/blink.c +++ b/example/blink.c @@ -22,6 +22,26 @@ int main(void) { - /* TODO */ + int i; + + /* GPIO setup: Enable GPIOC clock, set GPIO12 to 'output push-pull'. */ + RCC_APB2ENR = RCC_IOPCEN; + GPIOC_CRH = (GPIO_CNF_OUTPUT_PUSHPULL << (((12 - 8) * 4) + 2)); + GPIOC_CRH |= (GPIO_MODE_OUTPUT_2_MHZ << ((12 - 8) * 4)); + + /* Blink the LED (PC12) on the board. */ + while (1) { + GPIOC_BSRR = GPIO12; /* LED off */ + for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */ + GPIOC_BRR = GPIO12; /* LED on */ + for (i = 0; i < 80000; i++); /* Wait (needs -O0 CFLAGS). */ + } + return 0; } + +u32 *vector_table[2] __attribute__ ((section(".vectors"))) = { + (u32 *)0x20000800, /* Use 2 KB stack (0x800 bytes). */ + (u32 *)main, /* Use main() as reset vector for now. */ +}; + diff --git a/example/blink.ld b/example/blink.ld index c57079c0..07ea842b 100644 --- a/example/blink.ld +++ b/example/blink.ld @@ -33,6 +33,7 @@ SECTIONS . = ORIGIN(rom); .text : { + *(.vectors) /* Vector table */ *(.text) /* Program code */ *(.rodata) /* Read-only data */ } >rom