From: phfr24 Date: Sun, 12 Jul 2026 04:18:30 +0000 (-0300) Subject: faultmask, kentry () X-Git-Url: https://git.wirehaze.ovh/stm32f411ceu6.git/commitdiff_plain/8b035a8bab6355d1addd7440a92116e2e23e4419 faultmask, kentry () --- diff --git a/Makefile b/Makefile index b864e5a..f0ec81f 100644 --- a/Makefile +++ b/Makefile @@ -46,7 +46,7 @@ OCFLAGS := --output-target=binary # --------------------------------------------------------------------------- # -objs := kernel.o +objs := kernel.o kentry.o lds := kernel.ld LDFLAGS += -T $(lds) diff --git a/kentry.c b/kentry.c new file mode 100644 index 0000000..33b8295 --- /dev/null +++ b/kentry.c @@ -0,0 +1,46 @@ +#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); + } + } +} diff --git a/kernel.c b/kernel.c index dc4c134..1545c6e 100644 --- a/kernel.c +++ b/kernel.c @@ -1,37 +1,42 @@ #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 */ @@ -80,43 +85,12 @@ reset_handler (void) /* 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))