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.
48 lines
1.5 KiB
C
48 lines
1.5 KiB
C
/*
|
|
* This file is part of the libopenstm32 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 2 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, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include <libopenstm32.h>
|
|
|
|
int main(void)
|
|
{
|
|
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. */
|
|
};
|
|
|