aboutsummaryrefslogtreecommitdiff
path: root/example
diff options
context:
space:
mode:
authorUwe Hermann2009-07-18 06:09:08 +0200
committerUwe Hermann2009-07-18 06:09:08 +0200
commit915d5bff90c86e1c8c072b0f13177f82283f3883 (patch)
tree64fef68af22720251179441ef457e92165025ec6 /example
parent355701525e048e1f77e64bc5dc4546c0e5d86fba (diff)
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.
Diffstat (limited to 'example')
-rw-r--r--example/Makefile2
-rw-r--r--example/blink.c22
-rw-r--r--example/blink.ld1
3 files changed, 23 insertions, 2 deletions
diff --git a/example/Makefile b/example/Makefile
index 23d07e5..0667d67 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 aa68322..21ac147 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 c57079c..07ea842 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