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.
This commit is contained in:
Uwe Hermann 2009-07-18 06:09:08 +02:00
parent 355701525e
commit 915d5bff90
3 changed files with 23 additions and 2 deletions

View File

@ -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

View File

@ -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. */
};

View File

@ -33,6 +33,7 @@ SECTIONS
. = ORIGIN(rom);
.text : {
*(.vectors) /* Vector table */
*(.text) /* Program code */
*(.rodata) /* Read-only data */
} >rom