]> wirehaze git hosting - stm32f411ceu6.git/blob - kernel.c

wirehaze git hosting

usart wip
[stm32f411ceu6.git] / kernel.c
1 #include "link.h"
2 #include "stm32f411.h"
3
4 const char msg[] = "blink ";
5
6 static void
7 delay (void)
8 {
9 volatile unsigned int i;
10 for (i = 0; i < 500000; i++);
11 }
12
13 static void
14 reset_handler (void)
15 {
16 unsigned int *src, *dst;
17 unsigned int off;
18
19 /* relocate .data to sram */
20 src = &_data_lma_start;
21 dst = &_data_vma_start;
22
23 while (dst < &_data_vma_end)
24 *(dst++) = *(src++);
25
26 /* initialize .bss */
27 dst = &_bss_vma_start;
28
29 while (dst < &_bss_vma_end)
30 *(dst++) = 0;
31
32 /* (todo) usart pin setup (alt func and enable port clock) */
33
34 /* UE: USART enable */
35 *USART_CR1 |= (1u << 13); /* 1: USART enable */
36 /* M: Word length */
37 *USART_CR1 &= ~(1u << 12); /* 0: 1 Start bit, 8 Data bits, n Stop bit */
38 /* STOP: STOP bits */
39 *USART_CR2 &= ~(3u << 12); /* 00: 1 Stop bit */
40 /* the clock frequnecy is 16mhz initially, so for a baud rate of 115.2 KBps we
41 * need to set USARTDIV=8.6875 */
42 *USART_BRR = (8u << 4) | 11; /* mantissa and fraction (/16) */
43 /* TE: Transmitter enable */
44 *USART_CR1 |= (1u << 3); /* 1: Transmitter is enabled */
45
46 /* blink blink setup */
47 *RCC_AHB1ENR |= (1u << 2);
48 *GPIOC_MODER &= ~(3u << 26);
49 *GPIOC_MODER |= (1u << 26);
50
51 while (1)
52 {
53 /* speak */
54 off = 0;
55 do
56 {
57 /* TXE: Transmit data register empty */
58 if (!(*USART_SR & (1u << 7)))
59 continue;
60
61 *USART_DR = msg[off++];
62 }
63 while (off < sizeof msg);
64
65 /* blink */
66 *GPIOC_ODR ^= (1u << 13);
67 delay ();
68 }
69 }
70
71 __attribute__ ((section (".vector_table"), used))
72 static unsigned long const vector_table[] = {
73 (unsigned long) &_sram_end,
74 (unsigned long) reset_handler,
75 };