Brian Silverman | 44311d6 | 2013-12-06 22:03:29 -0800 | [diff] [blame] | 1 | #include <stdint.h> |
| 2 | |
Brian Silverman | 1b6fbd0 | 2013-12-12 18:08:47 -0800 | [diff] [blame^] | 3 | #include <STM32F2XX.h> |
| 4 | |
Brian Silverman | 44311d6 | 2013-12-06 22:03:29 -0800 | [diff] [blame] | 5 | #include "cape/bootloader_handoff.h" |
| 6 | |
| 7 | // Sets everything up and then jumps to the main code. |
| 8 | static void jump_to_main(void) __attribute__((noreturn)); |
| 9 | static void jump_to_main(void) { |
Brian Silverman | aa9183a | 2013-12-08 10:33:47 -0800 | [diff] [blame] | 10 | __asm__ __volatile__( |
Brian Silverman | 44311d6 | 2013-12-06 22:03:29 -0800 | [diff] [blame] | 11 | "mov sp, %[stack]\n\t" |
| 12 | "bx %[reset]" : : |
| 13 | [stack]"r"(RAM_START + RAM_SIZE), [reset]"r"(MAIN_FLASH_START | 1) |
| 14 | : "memory"); |
| 15 | __builtin_unreachable(); |
| 16 | } |
| 17 | |
Brian Silverman | 5020be6 | 2013-12-06 19:09:07 -0800 | [diff] [blame] | 18 | void _start(void) { |
Brian Silverman | 1b6fbd0 | 2013-12-12 18:08:47 -0800 | [diff] [blame^] | 19 | SYSCFG->CMPCR = SYSCFG_CMPCR_CMP_PD; // enable IO compensation cell |
| 20 | while (!(SYSCFG->CMPCR & SYSCFG_CMPCR_READY)) {} // wait for it to be ready |
| 21 | |
| 22 | // We don't have anything on the 1 port D pin, so don't bother enabling it. |
| 23 | RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOBEN | RCC_AHB1ENR_GPIOCEN; |
| 24 | |
Brian Silverman | 44311d6 | 2013-12-06 22:03:29 -0800 | [diff] [blame] | 25 | jump_to_main(); |
Brian Silverman | 5020be6 | 2013-12-06 19:09:07 -0800 | [diff] [blame] | 26 | } |