--- /dev/null
+#include "stm32f411.h"
+
+static const char *text[] = {
+ "hello, friend.\r\n",
+ "hello, friend?\r\n",
+ "that's lame.\r\n",
+ "maybe i should give you a name.\r\n",
+ "but that's a slippery slope.\r\n",
+ "you're only in my head.\r\n",
+ "we have to remember that.\r\n",
+ "shit.\r\n",
+ "it's actually happening, i'm talking to an imaginary person.\r\n\n"
+};
+
+void
+kentry (void)
+{
+ unsigned int line, off;
+
+ /* Test UART and LED ---------------------------------------------------- */
+
+ while (1)
+ {
+ for (line = 0; line < sizeof text / sizeof *text; ++line)
+ {
+ /* Print current line */
+ off = 0;
+ while (text[line][off])
+ {
+ /* TXE: Transmit data register empty */
+ while (!(*USART1_SR & (1u << 7))); /* 0: Data is not transferred
+ to the shift register */
+
+ /* DR[8:0]: Data value */
+ *USART1_DR = text[line][off++];
+ }
+
+ /* TC: Transmission complete */
+ while (!(*USART1_SR & (1u << 6))); /* 0: Transmission is not
+ complete */
+
+ /* Blink LED */
+ *GPIOC_ODR ^= (1u << 13);
+ }
+ }
+}
#include "link.h"
#include "stm32f411.h"
-static const char *text[] = {
- "hello, friend.\r\n",
- "hello, friend?\r\n",
- "that's lame.\r\n",
- "maybe i should give you a name.\r\n",
- "but that's a slippery slope.\r\n",
- "you're only in my head.\r\n",
- "we have to remember that.\r\n",
- "shit.\r\n",
- "it's actually happening, i'm talking to an imaginary person.\r\n\n"
-};
+__attribute__ ((noreturn)) extern void kentry (void);
static void
reset_handler (void)
{
unsigned int *src, *dst;
- unsigned int line, off;
- /* Relocate .data section to SRAM */
+ /* Set FAULTMASK */
+ asm ("cpsid f");
+
+ /* Initialize .data and .bss in SRAM ------------------------------------ */
+
+ /* Relocate .data section */
src = &_data_lma_start;
dst = &_data_vma_start;
while (dst < &_data_vma_end)
*(dst++) = *(src++);
- /* Initialize .bss section */
+ /* Initialize .bss */
dst = &_bss_vma_start;
while (dst < &_bss_vma_end)
*(dst++) = 0;
+ /* LED setup ------------------------------------------------------------ */
+
+ /* GPIOCEN: IO port C clock enable */
+ *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled */
+ /* MODERy[1:0]: Port x configuration bits (y = 0..15) */
+ *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits */
+ *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode */
+
+ /* PC13: 0 = LED on
+ * 1 = LED off */
+
/* SYSCLK setup --------------------------------------------------------- */
/* HSEBYP: HSE clock bypass */
/* TE: Transmitter enable */
*USART1_CR1 |= (1u << 3); /* 1: Transmitter is enabled */
- /* LED setup ------------------------------------------------------------ */
+ /* Jump to kernel entry code -------------------------------------------- */
- /* GPIOCEN: IO port C clock enable */
- *RCC_AHB1ENR |= (1u << 2); /* 1: IO port C clock enabled */
- /* MODERy[1:0]: Port x configuration bits (y = 0..15) */
- *GPIOC_MODER &= ~(0b11u << 26); /* Clear PC13 bits */
- *GPIOC_MODER |= (1u << 26); /* 01: General purpose output mode */
-
- /* PC13: 0 = LED on
- * 1 = LED off */
+ /* Clear FAULTMASK */
+ asm ("cpsie f");
- /* Test UART and LED ---------------------------------------------------- */
-
- while (1)
- {
- for (line = 0; line < sizeof text / sizeof *text; ++line)
- {
- /* Print current line */
- off = 0;
- while (text[line][off])
- {
- /* TXE: Transmit data register empty */
- while (!(*USART1_SR & (1u << 7))); /* 0: Data is not transferred
- to the shift register */
-
- /* DR[8:0]: Data value */
- *USART1_DR = text[line][off++];
- }
-
- /* TC: Transmission complete */
- while (!(*USART1_SR & (1u << 6))); /* 0: Transmission is not
- complete */
-
- /* Blink LED */
- *GPIOC_ODR ^= (1u << 13);
- }
- }
+ kentry ();
}
__attribute__ ((section (".vector_table"), used))