From 154bbce9f0b1d033cd3c1422932ff79b456cd367 Mon Sep 17 00:00:00 2001 From: Rutherther Date: Fri, 27 Sep 2024 15:41:20 +0200 Subject: [PATCH] feat: add support for stm32f446 --- devices/stm32f446/include/defines.h | 4 + devices/stm32f446/isr.c | 223 ++++++++++++++++++++++++++++ devices/stm32f446/linker_script.ld | 48 ++++++ 3 files changed, 275 insertions(+) create mode 100644 devices/stm32f446/include/defines.h create mode 100644 devices/stm32f446/isr.c create mode 100644 devices/stm32f446/linker_script.ld diff --git a/devices/stm32f446/include/defines.h b/devices/stm32f446/include/defines.h new file mode 100644 index 0000000..9c9e1a9 --- /dev/null +++ b/devices/stm32f446/include/defines.h @@ -0,0 +1,4 @@ +#define SRAM_START (0x20000000U) +#define SRAM_SIZE (32U * 1024U) +#define SRAM_END (SRAM_START + SRAM_SIZE) +#define STACK_POINTER_INIT_ADDRESS (SRAM_END) diff --git a/devices/stm32f446/isr.c b/devices/stm32f446/isr.c new file mode 100644 index 0000000..4031009 --- /dev/null +++ b/devices/stm32f446/isr.c @@ -0,0 +1,223 @@ +#include +#include "defines.h" +#define ISR_VECTOR_SIZE_WORDS 115 + +void reset_handler(void); +void default_handler(void); +void nmi_handler(void) __attribute__((weak, alias("default_handler"))); +void hard_fault_handler(void) __attribute__((weak, alias("default_handler"))); +void bus_fault_handler(void) __attribute__((weak, alias("default_handler"))); +void usage_fault_handler(void) __attribute__((weak, alias("default_handler"))); +void svcall_handler(void) __attribute__((weak, alias("default_handler"))); +void debug_monitor_handler(void) __attribute__((weak, alias("default_handler"))); +void pendsv_handler(void) __attribute__((weak, alias("default_handler"))); +void systick_handler(void) __attribute__((weak, alias("default_handler"))); +void WWDG_handler(void) __attribute__((weak, alias("default_handler"))); +void PVD_handler(void) __attribute__((weak, alias("default_handler"))); +void TAMP_STAMP_handler(void) __attribute__((weak, alias("default_handler"))); +void RTC_WKUP_handler(void) __attribute__((weak, alias("default_handler"))); +void FLASH_handler(void) __attribute__((weak, alias("default_handler"))); +void RCC_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI0_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI1_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI2_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI3_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI4_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream0_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream1_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream2_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream3_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream4_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream5_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream6_handler(void) __attribute__((weak, alias("default_handler"))); +void ADC_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN1_TX_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN1_RX0_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN1_RX1_handler(void) __attribute__((weak, alias("default_handler"))); +void SCE_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI9_5_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM1_BRK_TIM9_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM1_UP_TIM10_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM1_TRG_COM_TIM11_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM1_CC_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM2_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM3_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM4_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C1_EV_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C1_ER_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C2_EV_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C2_ER_handler(void) __attribute__((weak, alias("default_handler"))); +void SPI1_handler(void) __attribute__((weak, alias("default_handler"))); +void SPI2_handler(void) __attribute__((weak, alias("default_handler"))); +void USART1_handler(void) __attribute__((weak, alias("default_handler"))); +void USART2_handler(void) __attribute__((weak, alias("default_handler"))); +void USART3_handler(void) __attribute__((weak, alias("default_handler"))); +void EXTI15_10_handler(void) __attribute__((weak, alias("default_handler"))); +void RTC_Alarm_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_FS_WKUP_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM8_BRK_TIM12_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM8_UP_TIM13_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM8_TRG_COM_TIM14_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM8_CC_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA1_Stream7_handler(void) __attribute__((weak, alias("default_handler"))); +void FMC_handler(void) __attribute__((weak, alias("default_handler"))); +void SDIO_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM5_handler(void) __attribute__((weak, alias("default_handler"))); +void SPI3_handler(void) __attribute__((weak, alias("default_handler"))); +void UART4_handler(void) __attribute__((weak, alias("default_handler"))); +void UART5_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM6_DAC_handler(void) __attribute__((weak, alias("default_handler"))); +void TIM7_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream0_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream1_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream2_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream3_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream4_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN2_TX_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN2_RX0_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN2_RX1_handler(void) __attribute__((weak, alias("default_handler"))); +void CAN2_SCE_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_FS_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream5_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream6_handler(void) __attribute__((weak, alias("default_handler"))); +void DMA2_Stream7_handler(void) __attribute__((weak, alias("default_handler"))); +void USART6_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C3_EV_handler(void) __attribute__((weak, alias("default_handler"))); +void I2C3_ER_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_HS_EP1_OUT_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_HS_EP1_IN_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_HS_WKUP_handler(void) __attribute__((weak, alias("default_handler"))); +void OTG_HS_handler(void) __attribute__((weak, alias("default_handler"))); +void DCMI_handler(void) __attribute__((weak, alias("default_handler"))); +void FPU_handler(void) __attribute__((weak, alias("default_handler"))); +void SPI4_handler(void) __attribute__((weak, alias("default_handler"))); +void SAI1_handler(void) __attribute__((weak, alias("default_handler"))); +void SAI2_handler(void) __attribute__((weak, alias("default_handler"))); +void QUADSPI_handler(void) __attribute__((weak, alias("default_handler"))); +void CEC_handler(void) __attribute__((weak, alias("default_handler"))); +void SPDIF_RX_handler(void) __attribute__((weak, alias("default_handler"))); +void FMPI2C1_EV_handler(void) __attribute__((weak, alias("default_handler"))); +void FMPI2C1_ER_handler(void) __attribute__((weak, alias("default_handler"))); + +uint32_t isr_vector[ISR_VECTOR_SIZE_WORDS] __attribute__((section(".isr_vector"))) = { + STACK_POINTER_INIT_ADDRESS, + // arm cortex interrupts + (uint32_t)&reset_handler, + (uint32_t)&nmi_handler, + (uint32_t)&hard_fault_handler, + (uint32_t)&bus_fault_handler, + (uint32_t)&usage_fault_handler, + 0, + 0, + 0, + 0, + 0, + (uint32_t)&svcall_handler, + (uint32_t)&debug_monitor_handler, + 0, + (uint32_t)&pendsv_handler, + (uint32_t)&systick_handler, + // device specific interrupts + (uint32_t)&WWDG_handler, /* Window WatchDog */ + (uint32_t)&PVD_handler, /* PVD through EXTI Line detection */ + (uint32_t)&TAMP_STAMP_handler, /* Tamper and TimeStamps through the EXTI line */ + (uint32_t)&RTC_WKUP_handler, /* RTC Wakeup through the EXTI line */ + (uint32_t)&FLASH_handler, /* FLASH */ + (uint32_t)&RCC_handler, /* RCC */ + (uint32_t)&EXTI0_handler, /* EXTI Line0 */ + (uint32_t)&EXTI1_handler, /* EXTI Line1 */ + (uint32_t)&EXTI2_handler, /* EXTI Line2 */ + (uint32_t)&EXTI3_handler, /* EXTI Line3 */ + (uint32_t)&EXTI4_handler, /* EXTI Line4 */ + (uint32_t)&DMA1_Stream0_handler, /* DMA1 Stream 0 */ + (uint32_t)&DMA1_Stream1_handler, /* DMA1 Stream 1 */ + (uint32_t)&DMA1_Stream2_handler, /* DMA1 Stream 2 */ + (uint32_t)&DMA1_Stream3_handler, /* DMA1 Stream 3 */ + (uint32_t)&DMA1_Stream4_handler, /* DMA1 Stream 4 */ + (uint32_t)&DMA1_Stream5_handler, /* DMA1 Stream 5 */ + (uint32_t)&DMA1_Stream6_handler, /* DMA1 Stream 6 */ + (uint32_t)&ADC_handler, /* ADC1, ADC2 and ADC3s */ + (uint32_t)&CAN1_TX_handler, /* CAN1 TX */ + (uint32_t)&CAN1_RX0_handler, /* CAN1 RX0 */ + (uint32_t)&CAN1_RX1_handler, /* CAN1 RX1 */ + (uint32_t)&SCE_handler, /* CAN1 SCE */ + (uint32_t)&EXTI9_5_handler, /* External Line[9:5]s */ + (uint32_t)&TIM1_BRK_TIM9_handler, /* TIM1 Break and TIM9 */ + (uint32_t)&TIM1_UP_TIM10_handler, /* TIM1 Update and TIM10 */ + (uint32_t)&TIM1_TRG_COM_TIM11_handler, /* TIM1 Trigger and Commutation and TIM11 */ + (uint32_t)&TIM1_CC_handler, /* TIM1 Capture Compare */ + (uint32_t)&TIM2_handler, /* TIM2 */ + (uint32_t)&TIM3_handler, /* TIM3 */ + (uint32_t)&TIM4_handler, /* TIM4 */ + (uint32_t)&I2C1_EV_handler, /* I2C1 Event */ + (uint32_t)&I2C1_ER_handler, /* I2C1 Error */ + (uint32_t)&I2C2_EV_handler, /* I2C2 Event */ + (uint32_t)&I2C2_ER_handler, /* I2C2 Error */ + (uint32_t)&SPI1_handler, /* SPI1 */ + (uint32_t)&SPI2_handler, /* SPI2 */ + (uint32_t)&USART1_handler, /* USART1 */ + (uint32_t)&USART2_handler, /* USART2 */ + (uint32_t)&USART3_handler, /* USART3 */ + (uint32_t)&EXTI15_10_handler, /* External Line[15:10]s */ + (uint32_t)&RTC_Alarm_handler, /* RTC Alarm (A and B) through EXTI Line */ + (uint32_t)&OTG_FS_WKUP_handler, /* USB OTG FS Wakeup through EXTI line */ + (uint32_t)&TIM8_BRK_TIM12_handler, /* TIM8 Break and TIM12 */ + (uint32_t)&TIM8_UP_TIM13_handler, /* TIM8 Update and TIM13 */ + (uint32_t)&TIM8_TRG_COM_TIM14_handler, /* TIM8 Trigger and Commutation and TIM14 */ + (uint32_t)&TIM8_CC_handler, /* TIM8 Capture Compare */ + (uint32_t)&DMA1_Stream7_handler, /* DMA1 Stream7 */ + (uint32_t)&FMC_handler, /* FMC */ + (uint32_t)&SDIO_handler, /* SDIO */ + (uint32_t)&TIM5_handler, /* TIM5 */ + (uint32_t)&SPI3_handler, /* SPI3 */ + (uint32_t)&UART4_handler, /* UART4 */ + (uint32_t)&UART5_handler, /* UART5 */ + (uint32_t)&TIM6_DAC_handler, /* TIM6 and DAC1&2 underrun errors */ + (uint32_t)&TIM7_handler, /* TIM7 */ + (uint32_t)&DMA2_Stream0_handler, /* DMA2 Stream 0 */ + (uint32_t)&DMA2_Stream1_handler, /* DMA2 Stream 1 */ + (uint32_t)&DMA2_Stream2_handler, /* DMA2 Stream 2 */ + (uint32_t)&DMA2_Stream3_handler, /* DMA2 Stream 3 */ + (uint32_t)&DMA2_Stream4_handler, /* DMA2 Stream 4 */ + 0 , /* Reserved */ + 0 , /* Reserved */ + (uint32_t)&CAN2_TX_handler, /* CAN2 TX */ + (uint32_t)&CAN2_RX0_handler, /* CAN2 RX0 */ + (uint32_t)&CAN2_RX1_handler, /* CAN2 RX1 */ + (uint32_t)&CAN2_SCE_handler, /* CAN2 SCE */ + (uint32_t)&OTG_FS_handler, /* USB OTG FS */ + (uint32_t)&DMA2_Stream5_handler, /* DMA2 Stream 5 */ + (uint32_t)&DMA2_Stream6_handler, /* DMA2 Stream 6 */ + (uint32_t)&DMA2_Stream7_handler, /* DMA2 Stream 7 */ + (uint32_t)&USART6_handler, /* USART6 */ + (uint32_t)&I2C3_EV_handler, /* I2C3 event */ + (uint32_t)&I2C3_ER_handler, /* I2C3 error */ + (uint32_t)&OTG_HS_EP1_OUT_handler, /* USB OTG HS End Point 1 Out */ + (uint32_t)&OTG_HS_EP1_IN_handler, /* USB OTG HS End Point 1 In */ + (uint32_t)&OTG_HS_WKUP_handler, /* USB OTG HS Wakeup through EXTI */ + (uint32_t)&OTG_HS_handler, /* USB OTG HS */ + (uint32_t)&DCMI_handler, /* DCMI */ + 0 , /* Reserved */ + 0 , /* Reserved */ + (uint32_t)&FPU_handler, /* FPU */ + 0 , /* Reserved */ + 0 , /* Reserved */ + (uint32_t)&SPI4_handler, /* SPI4 */ + 0 , /* Reserved */ + 0 , /* Reserved */ + (uint32_t)&SAI1_handler, /* SAI1 */ + 0 , /* Reserved */ + 0 , /* Reserved */ + 0 , /* Reserved */ + (uint32_t)&SAI2_handler, /* SAI2 */ + (uint32_t)&QUADSPI_handler, /* QuadSPI */ + (uint32_t)&CEC_handler, /* CEC */ + (uint32_t)&SPDIF_RX_handler, /* SPDIF RX */ + (uint32_t)&FMPI2C1_EV_handler, /* FMPI2C 1 Event */ + (uint32_t)&FMPI2C1_ER_handler /* FMPI2C 1 Error */ +}; + +void default_handler(void) +{ + while(1); +} diff --git a/devices/stm32f446/linker_script.ld b/devices/stm32f446/linker_script.ld new file mode 100644 index 0000000..6415a6b --- /dev/null +++ b/devices/stm32f446/linker_script.ld @@ -0,0 +1,48 @@ +MEMORY +{ + FLASH (rx): ORIGIN = 0x08000000, LENGTH = 512K + SRAM (rwx): ORIGIN = 0x20000000, LENGTH = 128K +} + +SECTIONS +{ + .isr_vector : + { + KEEP(*(.isr_vector)) + } >FLASH + + .text : + { + . = ALIGN(4); + + *(.text) + *(.rodata) + + . = ALIGN(4); + _etext = .; + } >FLASH + + .data : + { + . = ALIGN(4); + _sdata = .; + + *(.data) + + . = ALIGN(4); + _edata = .; + } >SRAM AT> FLASH + + .bss : + { + . = ALIGN(4); + _sbss = .; + + *(.bss) + + . = ALIGN(4); + _ebss = .; + } >SRAM +} + +ENTRY(reset_handler) -- 2.48.1