diff --git a/miosix/arch/cortexM7_stm32h7/common/drivers/pll.h b/miosix/arch/cortexM7_stm32h7/common/drivers/pll.h index 0a9f17a04dd0cc01d1de643c31b4c88178057957..281305b9bb072a6269cad0ebb652479975bf14d6 100644 --- a/miosix/arch/cortexM7_stm32h7/common/drivers/pll.h +++ b/miosix/arch/cortexM7_stm32h7/common/drivers/pll.h @@ -25,9 +25,6 @@ * along with this program; if not, see <http://www.gnu.org/licenses/> * ***************************************************************************/ -#ifndef PLL_H -#define PLL_H +#pragma once void startPll(); - -#endif //PLL_H diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/boot.cpp b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/boot.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ca14d36d1f7feee139f2fea02ea77cb148707b0c --- /dev/null +++ b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/boot.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (C) 2024 by Daniele Cattaneo * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * As a special exception, if other files instantiate templates or use * + * macros or inline functions from this file, or you compile this file * + * and link it with other works to produce a work based on this file, * + * this file does not by itself cause the resulting work to be covered * + * by the GNU General Public License. However the source code for this * + * file must still be made available in accordance with the GNU General * + * Public License. This exception does not invalidate any other reasons * + * why a work based on this file might be covered by the GNU General * + * Public License. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, see <http://www.gnu.org/licenses/> * + ***************************************************************************/ + +#include "drivers/pll.h" +#include "cache/cortexMx_cache.h" + +extern "C" void SystemInit(); + +namespace miosix { + +void IRQmemoryAndClockInit() +{ + SystemInit(); + startPll(); + miosix::IRQconfigureCache(); +} + +} // namespace miosix diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/core/stage_1_boot.cpp b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/core/stage_1_boot.cpp deleted file mode 100644 index 6214af297b921984748d21a76347e96e077bd7c0..0000000000000000000000000000000000000000 --- a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/core/stage_1_boot.cpp +++ /dev/null @@ -1,579 +0,0 @@ - -#include "interfaces/arch_registers.h" -#include "core/interrupts.h" //For the unexpected interrupt call -#include "cache/cortexMx_cache.h" -#include "drivers/pll.h" -#include "kernel/stage_2_boot.h" -#include <string.h> - -/* - * startup.cpp - * STM32 C++ startup. - * NOTE: for stm32h755 devices ONLY. - * Supports interrupt handlers in C++ without extern "C" - * Developed by Terraneo Federico, based on ST startup code. - * Additionally modified to boot Miosix. - */ - -/** - * Called by Reset_Handler, performs initialization and calls main. - * Never returns. - */ -void program_startup() __attribute__((noreturn)); -void program_startup() -{ - //Cortex M7 core appears to get out of reset with interrupts already enabled - __disable_irq(); - - //SystemInit() is called *before* initializing .data and zeroing .bss - //Despite all startup files provided by ST do the opposite, there are three - //good reasons to do so: - //First, the CMSIS specifications say that SystemInit() must not access - //global variables, so it is actually possible to call it before - //Second, when running Miosix with the xram linker scripts .data and .bss - //are placed in the external RAM, so we *must* call SystemInit(), which - //enables xram, before touching .data and .bss - //Third, this is a performance improvement since the loops that initialize - //.data and zeros .bss now run with the CPU at full speed instead of 8MHz - SystemInit(); - startPll(); - - miosix::IRQconfigureCache(); - - //These are defined in the linker script - extern unsigned char _etext asm("_etext"); - extern unsigned char _data asm("_data"); - extern unsigned char _edata asm("_edata"); - extern unsigned char _bss_start asm("_bss_start"); - extern unsigned char _bss_end asm("_bss_end"); - - //Initialize .data section, clear .bss section - unsigned char *etext=&_etext; - unsigned char *data=&_data; - unsigned char *edata=&_edata; - unsigned char *bss_start=&_bss_start; - unsigned char *bss_end=&_bss_end; - memcpy(data, etext, edata-data); - memset(bss_start, 0, bss_end-bss_start); - - //Move on to stage 2 - _init(); - - //If main returns, reboot - NVIC_SystemReset(); - for(;;) ; -} - -/** - * Reset handler, called by hardware immediately after reset - */ -void Reset_Handler() __attribute__((__interrupt__, noreturn)); -void Reset_Handler() -{ - /* - * Initialize process stack and switch to it. - * This is required for booting Miosix, a small portion of the top of the - * heap area will be used as stack until the first thread starts. After, - * this stack will be abandoned and the process stack will point to the - * current thread's stack. - */ - asm volatile("ldr r0, =_heap_end \n\t" - "msr psp, r0 \n\t" - "movw r0, #2 \n\n" //Privileged, process stack - "msr control, r0 \n\t" - "isb \n\t":::"r0"); - - program_startup(); -} - -/** - * All unused interrupts call this function. - */ -extern "C" void Default_Handler() -{ - unexpectedInterrupt(); -} - -//System handlers -void /*__attribute__((weak))*/ Reset_Handler(); //These interrupts are not -void /*__attribute__((weak))*/ NMI_Handler(); //weak because they are -void /*__attribute__((weak))*/ HardFault_Handler(); //surely defined by Miosix -void /*__attribute__((weak))*/ MemManage_Handler(); -void /*__attribute__((weak))*/ BusFault_Handler(); -void /*__attribute__((weak))*/ UsageFault_Handler(); -void /*__attribute__((weak))*/ SVC_Handler(); -void /*__attribute__((weak))*/ DebugMon_Handler(); -void /*__attribute__((weak))*/ PendSV_Handler(); -void /*__attribute__((weak))*/ SysTick_Handler(); - -//Interrupt handlers -void __attribute__((weak)) WWDG_IRQHandler(); -void __attribute__((weak)) PVD_AVD_IRQHandler(); -void __attribute__((weak)) TAMP_STAMP_IRQHandler(); -void __attribute__((weak)) RTC_WKUP_IRQHandler(); -void __attribute__((weak)) FLASH_IRQHandler(); -void __attribute__((weak)) RCC_IRQHandler(); -void __attribute__((weak)) EXTI0_IRQHandler(); -void __attribute__((weak)) EXTI1_IRQHandler(); -void __attribute__((weak)) EXTI2_IRQHandler(); -void __attribute__((weak)) EXTI3_IRQHandler(); -void __attribute__((weak)) EXTI4_IRQHandler(); -void __attribute__((weak)) DMA1_Stream0_IRQHandler(); -void __attribute__((weak)) DMA1_Stream1_IRQHandler(); -void __attribute__((weak)) DMA1_Stream2_IRQHandler(); -void __attribute__((weak)) DMA1_Stream3_IRQHandler(); -void __attribute__((weak)) DMA1_Stream4_IRQHandler(); -void __attribute__((weak)) DMA1_Stream5_IRQHandler(); -void __attribute__((weak)) DMA1_Stream6_IRQHandler(); -void __attribute__((weak)) ADC_IRQHandler(); -void __attribute__((weak)) FDCAN1_IT0_IRQHandler(); -void __attribute__((weak)) FDCAN2_IT0_IRQHandler(); -void __attribute__((weak)) FDCAN1_IT1_IRQHandler(); -void __attribute__((weak)) FDCAN2_IT1_IRQHandler(); -void __attribute__((weak)) EXTI9_5_IRQHandler(); -void __attribute__((weak)) TIM1_BRK_IRQHandler(); -void __attribute__((weak)) TIM1_UP_IRQHandler(); -void __attribute__((weak)) TIM1_TRG_COM_IRQHandler(); -void __attribute__((weak)) TIM1_CC_IRQHandler(); -void __attribute__((weak)) TIM2_IRQHandler(); -void __attribute__((weak)) TIM3_IRQHandler(); -void __attribute__((weak)) TIM4_IRQHandler(); -void __attribute__((weak)) I2C1_EV_IRQHandler(); -void __attribute__((weak)) I2C1_ER_IRQHandler(); -void __attribute__((weak)) I2C2_EV_IRQHandler(); -void __attribute__((weak)) I2C2_ER_IRQHandler(); -void __attribute__((weak)) SPI1_IRQHandler(); -void __attribute__((weak)) SPI2_IRQHandler(); -void __attribute__((weak)) USART1_IRQHandler(); -void __attribute__((weak)) USART2_IRQHandler(); -void __attribute__((weak)) USART3_IRQHandler(); -void __attribute__((weak)) EXTI15_10_IRQHandler(); -void __attribute__((weak)) RTC_Alarm_IRQHandler(); -void __attribute__((weak)) TIM8_BRK_TIM12_IRQHandler(); -void __attribute__((weak)) TIM8_UP_TIM13_IRQHandler(); -void __attribute__((weak)) TIM8_TRG_COM_TIM14_IRQHandler(); -void __attribute__((weak)) TIM8_CC_IRQHandler(); -void __attribute__((weak)) DMA1_Stream7_IRQHandler(); -void __attribute__((weak)) FMC_IRQHandler(); -void __attribute__((weak)) SDMMC1_IRQHandler(); -void __attribute__((weak)) TIM5_IRQHandler(); -void __attribute__((weak)) SPI3_IRQHandler(); -void __attribute__((weak)) UART4_IRQHandler(); -void __attribute__((weak)) UART5_IRQHandler(); -void __attribute__((weak)) TIM6_DAC_IRQHandler(); -void __attribute__((weak)) TIM7_IRQHandler(); -void __attribute__((weak)) DMA2_Stream0_IRQHandler(); -void __attribute__((weak)) DMA2_Stream1_IRQHandler(); -void __attribute__((weak)) DMA2_Stream2_IRQHandler(); -void __attribute__((weak)) DMA2_Stream3_IRQHandler(); -void __attribute__((weak)) DMA2_Stream4_IRQHandler(); -void __attribute__((weak)) ETH_IRQHandler(); -void __attribute__((weak)) ETH_WKUP_IRQHandler(); -void __attribute__((weak)) FDCAN_CAL_IRQHandler(); -void __attribute__((weak)) CM7_SEV_IRQHandler(); -void __attribute__((weak)) CM4_SEV_IRQHandler(); -void __attribute__((weak)) DMA2_Stream5_IRQHandler(); -void __attribute__((weak)) DMA2_Stream6_IRQHandler(); -void __attribute__((weak)) DMA2_Stream7_IRQHandler(); -void __attribute__((weak)) USART6_IRQHandler(); -void __attribute__((weak)) I2C3_EV_IRQHandler(); -void __attribute__((weak)) I2C3_ER_IRQHandler(); -void __attribute__((weak)) OTG_HS_EP1_OUT_IRQHandler(); -void __attribute__((weak)) OTG_HS_EP1_IN_IRQHandler(); -void __attribute__((weak)) OTG_HS_WKUP_IRQHandler(); -void __attribute__((weak)) OTG_HS_IRQHandler(); -void __attribute__((weak)) DCMI_IRQHandler(); -void __attribute__((weak)) CRYP_IRQHandler(); -void __attribute__((weak)) HASH_RNG_IRQHandler(); -void __attribute__((weak)) FPU_IRQHandler(); -void __attribute__((weak)) UART7_IRQHandler(); -void __attribute__((weak)) UART8_IRQHandler(); -void __attribute__((weak)) SPI4_IRQHandler(); -void __attribute__((weak)) SPI5_IRQHandler(); -void __attribute__((weak)) SPI6_IRQHandler(); -void __attribute__((weak)) SAI1_IRQHandler(); -void __attribute__((weak)) LTDC_IRQHandler(); -void __attribute__((weak)) LTDC_ER_IRQHandler(); -void __attribute__((weak)) DMA2D_IRQHandler(); -void __attribute__((weak)) SAI2_IRQHandler(); -void __attribute__((weak)) QUADSPI_IRQHandler(); -void __attribute__((weak)) LPTIM1_IRQHandler(); -void __attribute__((weak)) CEC_IRQHandler(); -void __attribute__((weak)) I2C4_EV_IRQHandler(); -void __attribute__((weak)) I2C4_ER_IRQHandler(); -void __attribute__((weak)) SPDIF_RX_IRQHandler(); -void __attribute__((weak)) OTG_FS_EP1_OUT_IRQHandler(); -void __attribute__((weak)) OTG_FS_EP1_IN_IRQHandler(); -void __attribute__((weak)) OTG_FS_WKUP_IRQHandler(); -void __attribute__((weak)) OTG_FS_IRQHandler(); -void __attribute__((weak)) DMAMUX1_OVR_IRQHandler(); -void __attribute__((weak)) HRTIM1_Master_IRQHandler(); -void __attribute__((weak)) HRTIM1_TIMA_IRQHandler(); -void __attribute__((weak)) HRTIM1_TIMB_IRQHandler(); -void __attribute__((weak)) HRTIM1_TIMC_IRQHandler(); -void __attribute__((weak)) HRTIM1_TIMD_IRQHandler(); -void __attribute__((weak)) HRTIM1_TIME_IRQHandler(); -void __attribute__((weak)) HRTIM1_FLT_IRQHandler(); -void __attribute__((weak)) DFSDM1_FLT0_IRQHandler(); -void __attribute__((weak)) DFSDM1_FLT1_IRQHandler(); -void __attribute__((weak)) DFSDM1_FLT2_IRQHandler(); -void __attribute__((weak)) DFSDM1_FLT3_IRQHandler(); -void __attribute__((weak)) SAI3_IRQHandler(); -void __attribute__((weak)) SWPMI1_IRQHandler(); -void __attribute__((weak)) TIM15_IRQHandler(); -void __attribute__((weak)) TIM16_IRQHandler(); -void __attribute__((weak)) TIM17_IRQHandler(); -void __attribute__((weak)) MDIOS_WKUP_IRQHandler(); -void __attribute__((weak)) MDIOS_IRQHandler(); -void __attribute__((weak)) JPEG_IRQHandler(); -void __attribute__((weak)) MDMA_IRQHandler(); -void __attribute__((weak)) SDMMC2_IRQHandler(); -void __attribute__((weak)) HSEM1_IRQHandler(); -void __attribute__((weak)) HSEM2_IRQHandler(); -void __attribute__((weak)) ADC3_IRQHandler(); -void __attribute__((weak)) DMAMUX2_OVR_IRQHandler(); -void __attribute__((weak)) BDMA_Channel0_IRQHandler(); -void __attribute__((weak)) BDMA_Channel1_IRQHandler(); -void __attribute__((weak)) BDMA_Channel2_IRQHandler(); -void __attribute__((weak)) BDMA_Channel3_IRQHandler(); -void __attribute__((weak)) BDMA_Channel4_IRQHandler(); -void __attribute__((weak)) BDMA_Channel5_IRQHandler(); -void __attribute__((weak)) BDMA_Channel6_IRQHandler(); -void __attribute__((weak)) BDMA_Channel7_IRQHandler(); -void __attribute__((weak)) COMP1_IRQHandler(); -void __attribute__((weak)) LPTIM2_IRQHandler(); -void __attribute__((weak)) LPTIM3_IRQHandler(); -void __attribute__((weak)) LPTIM4_IRQHandler(); -void __attribute__((weak)) LPTIM5_IRQHandler(); -void __attribute__((weak)) LPUART1_IRQHandler(); -void __attribute__((weak)) WWDG_RST_IRQHandler(); -void __attribute__((weak)) CRS_IRQHandler(); -void __attribute__((weak)) ECC_IRQHandler(); -void __attribute__((weak)) SAI4_IRQHandler(); -void __attribute__((weak)) HOLD_CORE_IRQHandler(); -void __attribute__((weak)) WAKEUP_PIN_IRQHandler(); - -//Stack top, defined in the linker script -extern char _main_stack_top asm("_main_stack_top"); - -//Interrupt vectors, must be placed @ address 0x00000000 -//The extern declaration is required otherwise g++ optimizes it out -extern void (* const __Vectors[])(); -void (* const __Vectors[])() __attribute__ ((section(".isr_vector"))) = -{ - reinterpret_cast<void (*)()>(&_main_stack_top),/* Stack pointer*/ - Reset_Handler, /* Reset Handler */ - NMI_Handler, /* NMI Handler */ - HardFault_Handler, /* Hard Fault Handler */ - MemManage_Handler, /* MPU Fault Handler */ - BusFault_Handler, /* Bus Fault Handler */ - UsageFault_Handler, /* Usage Fault Handler */ - 0, /* Reserved */ - 0, /* Reserved */ - 0, /* Reserved */ - 0, /* Reserved */ - SVC_Handler, /* SVCall Handler */ - DebugMon_Handler, /* Debug Monitor Handler */ - 0, /* Reserved */ - PendSV_Handler, /* PendSV Handler */ - SysTick_Handler, /* SysTick Handler */ - - /* External Interrupts */ - WWDG_IRQHandler, - PVD_AVD_IRQHandler, - TAMP_STAMP_IRQHandler, - RTC_WKUP_IRQHandler, - FLASH_IRQHandler, - RCC_IRQHandler, - EXTI0_IRQHandler, - EXTI1_IRQHandler, - EXTI2_IRQHandler, - EXTI3_IRQHandler, - EXTI4_IRQHandler, - DMA1_Stream0_IRQHandler, - DMA1_Stream1_IRQHandler, - DMA1_Stream2_IRQHandler, - DMA1_Stream3_IRQHandler, - DMA1_Stream4_IRQHandler, - DMA1_Stream5_IRQHandler, - DMA1_Stream6_IRQHandler, - ADC_IRQHandler, - FDCAN1_IT0_IRQHandler, - FDCAN2_IT0_IRQHandler, - FDCAN1_IT1_IRQHandler, - FDCAN2_IT1_IRQHandler, - EXTI9_5_IRQHandler, - TIM1_BRK_IRQHandler, - TIM1_UP_IRQHandler, - TIM1_TRG_COM_IRQHandler, - TIM1_CC_IRQHandler, - TIM2_IRQHandler, - TIM3_IRQHandler, - TIM4_IRQHandler, - I2C1_EV_IRQHandler, - I2C1_ER_IRQHandler, - I2C2_EV_IRQHandler, - I2C2_ER_IRQHandler, - SPI1_IRQHandler, - SPI2_IRQHandler, - USART1_IRQHandler, - USART2_IRQHandler, - USART3_IRQHandler, - EXTI15_10_IRQHandler, - RTC_Alarm_IRQHandler, - 0, - TIM8_BRK_TIM12_IRQHandler, - TIM8_UP_TIM13_IRQHandler, - TIM8_TRG_COM_TIM14_IRQHandler, - TIM8_CC_IRQHandler, - DMA1_Stream7_IRQHandler, - FMC_IRQHandler, - SDMMC1_IRQHandler, - TIM5_IRQHandler, - SPI3_IRQHandler, - UART4_IRQHandler, - UART5_IRQHandler, - TIM6_DAC_IRQHandler, - TIM7_IRQHandler, - DMA2_Stream0_IRQHandler, - DMA2_Stream1_IRQHandler, - DMA2_Stream2_IRQHandler, - DMA2_Stream3_IRQHandler, - DMA2_Stream4_IRQHandler, - ETH_IRQHandler, - ETH_WKUP_IRQHandler, - FDCAN_CAL_IRQHandler, - CM7_SEV_IRQHandler, - CM4_SEV_IRQHandler, - 0, - 0, - DMA2_Stream5_IRQHandler, - DMA2_Stream6_IRQHandler, - DMA2_Stream7_IRQHandler, - USART6_IRQHandler, - I2C3_EV_IRQHandler, - I2C3_ER_IRQHandler, - OTG_HS_EP1_OUT_IRQHandler, - OTG_HS_EP1_IN_IRQHandler, - OTG_HS_WKUP_IRQHandler, - OTG_HS_IRQHandler, - DCMI_IRQHandler, - CRYP_IRQHandler, - HASH_RNG_IRQHandler, - FPU_IRQHandler, - UART7_IRQHandler, - UART8_IRQHandler, - SPI4_IRQHandler, - SPI5_IRQHandler, - SPI6_IRQHandler, - SAI1_IRQHandler, - LTDC_IRQHandler, - LTDC_ER_IRQHandler, - DMA2D_IRQHandler, - SAI2_IRQHandler, - QUADSPI_IRQHandler, - LPTIM1_IRQHandler, - CEC_IRQHandler, - I2C4_EV_IRQHandler, - I2C4_ER_IRQHandler, - SPDIF_RX_IRQHandler, - OTG_FS_EP1_OUT_IRQHandler, - OTG_FS_EP1_IN_IRQHandler, - OTG_FS_WKUP_IRQHandler, - OTG_FS_IRQHandler, - DMAMUX1_OVR_IRQHandler, - HRTIM1_Master_IRQHandler, - HRTIM1_TIMA_IRQHandler, - HRTIM1_TIMB_IRQHandler, - HRTIM1_TIMC_IRQHandler, - HRTIM1_TIMD_IRQHandler, - HRTIM1_TIME_IRQHandler, - HRTIM1_FLT_IRQHandler, - DFSDM1_FLT0_IRQHandler, - DFSDM1_FLT1_IRQHandler, - DFSDM1_FLT2_IRQHandler, - DFSDM1_FLT3_IRQHandler, - SAI3_IRQHandler, - SWPMI1_IRQHandler, - TIM15_IRQHandler, - TIM16_IRQHandler, - TIM17_IRQHandler, - MDIOS_WKUP_IRQHandler, - MDIOS_IRQHandler, - JPEG_IRQHandler, - MDMA_IRQHandler, - 0, - SDMMC2_IRQHandler, - HSEM1_IRQHandler, - HSEM2_IRQHandler, - ADC3_IRQHandler, - DMAMUX2_OVR_IRQHandler, - BDMA_Channel0_IRQHandler, - BDMA_Channel1_IRQHandler, - BDMA_Channel2_IRQHandler, - BDMA_Channel3_IRQHandler, - BDMA_Channel4_IRQHandler, - BDMA_Channel5_IRQHandler, - BDMA_Channel6_IRQHandler, - BDMA_Channel7_IRQHandler, - COMP1_IRQHandler, - LPTIM2_IRQHandler, - LPTIM3_IRQHandler, - LPTIM4_IRQHandler, - LPTIM5_IRQHandler, - LPUART1_IRQHandler, - WWDG_RST_IRQHandler, - CRS_IRQHandler, - ECC_IRQHandler, - SAI4_IRQHandler, - 0, - HOLD_CORE_IRQHandler, - WAKEUP_PIN_IRQHandler -}; - -#pragma weak SysTick_Handler = Default_Handler -#pragma weak WWDG_IRQHandler = Default_Handler -#pragma weak PVD_AVD_IRQHandler = Default_Handler -#pragma weak TAMP_STAMP_IRQHandler = Default_Handler -#pragma weak RTC_WKUP_IRQHandler = Default_Handler -#pragma weak FLASH_IRQHandler = Default_Handler -#pragma weak RCC_IRQHandler = Default_Handler -#pragma weak EXTI0_IRQHandler = Default_Handler -#pragma weak EXTI1_IRQHandler = Default_Handler -#pragma weak EXTI2_IRQHandler = Default_Handler -#pragma weak EXTI3_IRQHandler = Default_Handler -#pragma weak EXTI4_IRQHandler = Default_Handler -#pragma weak DMA1_Stream0_IRQHandler = Default_Handler -#pragma weak DMA1_Stream1_IRQHandler = Default_Handler -#pragma weak DMA1_Stream2_IRQHandler = Default_Handler -#pragma weak DMA1_Stream3_IRQHandler = Default_Handler -#pragma weak DMA1_Stream4_IRQHandler = Default_Handler -#pragma weak DMA1_Stream5_IRQHandler = Default_Handler -#pragma weak DMA1_Stream6_IRQHandler = Default_Handler -#pragma weak ADC_IRQHandler = Default_Handler -#pragma weak FDCAN1_IT0_IRQHandler = Default_Handler -#pragma weak FDCAN2_IT0_IRQHandler = Default_Handler -#pragma weak FDCAN1_IT1_IRQHandler = Default_Handler -#pragma weak FDCAN2_IT1_IRQHandler = Default_Handler -#pragma weak EXTI9_5_IRQHandler = Default_Handler -#pragma weak TIM1_BRK_IRQHandler = Default_Handler -#pragma weak TIM1_UP_IRQHandler = Default_Handler -#pragma weak TIM1_TRG_COM_IRQHandler = Default_Handler -#pragma weak TIM1_CC_IRQHandler = Default_Handler -#pragma weak TIM2_IRQHandler = Default_Handler -#pragma weak TIM3_IRQHandler = Default_Handler -#pragma weak TIM4_IRQHandler = Default_Handler -#pragma weak I2C1_EV_IRQHandler = Default_Handler -#pragma weak I2C1_ER_IRQHandler = Default_Handler -#pragma weak I2C2_EV_IRQHandler = Default_Handler -#pragma weak I2C2_ER_IRQHandler = Default_Handler -#pragma weak SPI1_IRQHandler = Default_Handler -#pragma weak SPI2_IRQHandler = Default_Handler -#pragma weak USART1_IRQHandler = Default_Handler -#pragma weak USART2_IRQHandler = Default_Handler -#pragma weak USART3_IRQHandler = Default_Handler -#pragma weak EXTI15_10_IRQHandler = Default_Handler -#pragma weak RTC_Alarm_IRQHandler = Default_Handler -#pragma weak TIM8_BRK_TIM12_IRQHandler = Default_Handler -#pragma weak TIM8_UP_TIM13_IRQHandler = Default_Handler -#pragma weak TIM8_TRG_COM_TIM14_IRQHandler = Default_Handler -#pragma weak TIM8_CC_IRQHandler = Default_Handler -#pragma weak DMA1_Stream7_IRQHandler = Default_Handler -#pragma weak FMC_IRQHandler = Default_Handler -#pragma weak SDMMC1_IRQHandler = Default_Handler -#pragma weak TIM5_IRQHandler = Default_Handler -#pragma weak SPI3_IRQHandler = Default_Handler -#pragma weak UART4_IRQHandler = Default_Handler -#pragma weak UART5_IRQHandler = Default_Handler -#pragma weak TIM6_DAC_IRQHandler = Default_Handler -#pragma weak TIM7_IRQHandler = Default_Handler -#pragma weak DMA2_Stream0_IRQHandler = Default_Handler -#pragma weak DMA2_Stream1_IRQHandler = Default_Handler -#pragma weak DMA2_Stream2_IRQHandler = Default_Handler -#pragma weak DMA2_Stream3_IRQHandler = Default_Handler -#pragma weak DMA2_Stream4_IRQHandler = Default_Handler -#pragma weak ETH_IRQHandler = Default_Handler -#pragma weak ETH_WKUP_IRQHandler = Default_Handler -#pragma weak FDCAN_CAL_IRQHandler = Default_Handler -#pragma weak CM7_SEV_IRQHandler = Default_Handler -#pragma weak CM4_SEV_IRQHandler = Default_Handler -#pragma weak DMA2_Stream5_IRQHandler = Default_Handler -#pragma weak DMA2_Stream6_IRQHandler = Default_Handler -#pragma weak DMA2_Stream7_IRQHandler = Default_Handler -#pragma weak USART6_IRQHandler = Default_Handler -#pragma weak I2C3_EV_IRQHandler = Default_Handler -#pragma weak I2C3_ER_IRQHandler = Default_Handler -#pragma weak OTG_HS_EP1_OUT_IRQHandler = Default_Handler -#pragma weak OTG_HS_EP1_IN_IRQHandler = Default_Handler -#pragma weak OTG_HS_WKUP_IRQHandler = Default_Handler -#pragma weak OTG_HS_IRQHandler = Default_Handler -#pragma weak DCMI_IRQHandler = Default_Handler -#pragma weak CRYP_IRQHandler = Default_Handler -#pragma weak HASH_RNG_IRQHandler = Default_Handler -#pragma weak FPU_IRQHandler = Default_Handler -#pragma weak UART7_IRQHandler = Default_Handler -#pragma weak UART8_IRQHandler = Default_Handler -#pragma weak SPI4_IRQHandler = Default_Handler -#pragma weak SPI5_IRQHandler = Default_Handler -#pragma weak SPI6_IRQHandler = Default_Handler -#pragma weak SAI1_IRQHandler = Default_Handler -#pragma weak LTDC_IRQHandler = Default_Handler -#pragma weak LTDC_ER_IRQHandler = Default_Handler -#pragma weak DMA2D_IRQHandler = Default_Handler -#pragma weak SAI2_IRQHandler = Default_Handler -#pragma weak QUADSPI_IRQHandler = Default_Handler -#pragma weak LPTIM1_IRQHandler = Default_Handler -#pragma weak CEC_IRQHandler = Default_Handler -#pragma weak I2C4_EV_IRQHandler = Default_Handler -#pragma weak I2C4_ER_IRQHandler = Default_Handler -#pragma weak SPDIF_RX_IRQHandler = Default_Handler -#pragma weak OTG_FS_EP1_OUT_IRQHandler = Default_Handler -#pragma weak OTG_FS_EP1_IN_IRQHandler = Default_Handler -#pragma weak OTG_FS_WKUP_IRQHandler = Default_Handler -#pragma weak OTG_FS_IRQHandler = Default_Handler -#pragma weak DMAMUX1_OVR_IRQHandler = Default_Handler -#pragma weak HRTIM1_Master_IRQHandler = Default_Handler -#pragma weak HRTIM1_TIMA_IRQHandler = Default_Handler -#pragma weak HRTIM1_TIMB_IRQHandler = Default_Handler -#pragma weak HRTIM1_TIMC_IRQHandler = Default_Handler -#pragma weak HRTIM1_TIMD_IRQHandler = Default_Handler -#pragma weak HRTIM1_TIME_IRQHandler = Default_Handler -#pragma weak HRTIM1_FLT_IRQHandler = Default_Handler -#pragma weak DFSDM1_FLT0_IRQHandler = Default_Handler -#pragma weak DFSDM1_FLT1_IRQHandler = Default_Handler -#pragma weak DFSDM1_FLT2_IRQHandler = Default_Handler -#pragma weak DFSDM1_FLT3_IRQHandler = Default_Handler -#pragma weak SAI3_IRQHandler = Default_Handler -#pragma weak SWPMI1_IRQHandler = Default_Handler -#pragma weak TIM15_IRQHandler = Default_Handler -#pragma weak TIM16_IRQHandler = Default_Handler -#pragma weak TIM17_IRQHandler = Default_Handler -#pragma weak MDIOS_WKUP_IRQHandler = Default_Handler -#pragma weak MDIOS_IRQHandler = Default_Handler -#pragma weak JPEG_IRQHandler = Default_Handler -#pragma weak MDMA_IRQHandler = Default_Handler -#pragma weak SDMMC2_IRQHandler = Default_Handler -#pragma weak HSEM1_IRQHandler = Default_Handler -#pragma weak HSEM2_IRQHandler = Default_Handler -#pragma weak ADC3_IRQHandler = Default_Handler -#pragma weak DMAMUX2_OVR_IRQHandler = Default_Handler -#pragma weak BDMA_Channel0_IRQHandler = Default_Handler -#pragma weak BDMA_Channel1_IRQHandler = Default_Handler -#pragma weak BDMA_Channel2_IRQHandler = Default_Handler -#pragma weak BDMA_Channel3_IRQHandler = Default_Handler -#pragma weak BDMA_Channel4_IRQHandler = Default_Handler -#pragma weak BDMA_Channel5_IRQHandler = Default_Handler -#pragma weak BDMA_Channel6_IRQHandler = Default_Handler -#pragma weak BDMA_Channel7_IRQHandler = Default_Handler -#pragma weak COMP1_IRQHandler = Default_Handler -#pragma weak LPTIM2_IRQHandler = Default_Handler -#pragma weak LPTIM3_IRQHandler = Default_Handler -#pragma weak LPTIM4_IRQHandler = Default_Handler -#pragma weak LPTIM5_IRQHandler = Default_Handler -#pragma weak LPUART1_IRQHandler = Default_Handler -#pragma weak WWDG_RST_IRQHandler = Default_Handler -#pragma weak CRS_IRQHandler = Default_Handler -#pragma weak ECC_IRQHandler = Default_Handler -#pragma weak SAI4_IRQHandler = Default_Handler -#pragma weak HOLD_CORE_IRQHandler = Default_Handler -#pragma weak WAKEUP_PIN_IRQHandler = Default_Handler diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/arch_registers_impl.h b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/arch_registers_impl.h index 58f95d58456fd0dd5e3dfb36cbfd740f673bf785..1eec979ade0d06ab8d43d715340487c6e8d82189 100644 --- a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/arch_registers_impl.h +++ b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/arch_registers_impl.h @@ -20,3 +20,6 @@ //CPU level alone, the bus matrices and peripherals themselves may also reorder //accesses as a side-effect of how they work. #define RCC_SYNC() __DSB() + +//Peripheral interrupt start from 0 and the last one is 149, so there are 150 +#define MIOSIX_NUM_PERIPHERAL_IRQ 150 diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/bsp.cpp b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/bsp.cpp index 27a6f1847f06d9f249cec913d8c216f3f18513a3..25e1c634277bb66493ad165042c9cff95e50a48a 100644 --- a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/bsp.cpp +++ b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/interfaces-impl/bsp.cpp @@ -33,6 +33,7 @@ #include <cstdlib> #include <inttypes.h> #include <sys/ioctl.h> +#include "interfaces/bsp.h" #include "interfaces_private/bsp_private.h" #include "kernel/kernel.h" #include "kernel/sync.h" @@ -77,10 +78,11 @@ void IRQbspInit() ledOn(); delayMs(100); ledOff(); - auto tx=Gpio<GPIOD_BASE,8>::getPin(); tx.alternateFunction(7); - auto rx=Gpio<GPIOD_BASE,9>::getPin(); rx.alternateFunction(7); - DefaultConsole::instance().IRQset(intrusive_ref_ptr<Device>( - new STM32Serial(defaultSerialPort,defaultSerialSpeed,tx,rx))); + DefaultConsole::instance().IRQset( + STM32SerialBase::get<defaultSerialTxPin,defaultSerialRxPin, + defaultSerialRtsPin,defaultSerialCtsPin>( + defaultSerial,defaultSerialSpeed, + defaultSerialFlowctrl,defaultSerialDma)); } void bspInit2() diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom.ld b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom.ld index c500dedec67fe652037f698a9c4300897a44c9c9..e6ed30f8de372e7ad44891c14ec922414b2ac974 100644 --- a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom.ld +++ b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom.ld @@ -44,7 +44,7 @@ ASSERT(_main_stack_size % 8 == 0, "MAIN stack size error"); _heap_end = 0x24080000; /* end of available ram */ /* identify the Entry Point */ -ENTRY(_Z13Reset_Handlerv) +ENTRY(_ZN6miosix13Reset_HandlerEv) /* specify the memory areas */ MEMORY @@ -122,7 +122,7 @@ SECTIONS KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*crtend.o(.ctors)) - _ctor_end = .; + _ctor_end = .; . = ALIGN(4); KEEP (*crtbegin.o(.dtors)) diff --git a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom_processes.ld b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom_processes.ld index 31c5ef1e81b7b1354b48bf94cb2bf0262c995fef..dc2d4d7fae24338eecb624e147138de936592d2a 100644 --- a/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom_processes.ld +++ b/miosix/arch/cortexM7_stm32h7/stm32h755zi_nucleo/stm32_1M+512k_rom_processes.ld @@ -47,7 +47,7 @@ _process_pool_start = _heap_end; _process_pool_end = 0x24080000; /* end of available ram */ /* identify the Entry Point */ -ENTRY(_Z13Reset_Handlerv) +ENTRY(_ZN6miosix13Reset_HandlerEv) /* specify the memory areas */ MEMORY @@ -125,7 +125,7 @@ SECTIONS KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*crtend.o(.ctors)) - _ctor_end = .; + _ctor_end = .; . = ALIGN(4); KEEP (*crtbegin.o(.dtors)) diff --git a/miosix/config/Makefile.inc b/miosix/config/Makefile.inc index 428d31cd6a9741715c5338e979df179a2c42b81c..12d9a49fe87bfcd22f247f1cc17a304ae5dca1fd 100644 --- a/miosix/config/Makefile.inc +++ b/miosix/config/Makefile.inc @@ -2727,7 +2727,7 @@ else ifeq ($(ARCH),cortexM7_stm32h7) ## Select architecture specific files ## These are the files in arch/<arch name>/<board name> ARCH_SRC := \ - $(BOARD_INC)/core/stage_1_boot.cpp \ + $(BOARD_INC)/boot.cpp \ arch/common/drivers/stm32_hardware_rng.cpp \ $(BOARD_INC)/interfaces-impl/bsp.cpp @@ -2781,7 +2781,8 @@ else ifeq ($(ARCH),cortexM7_stm32h7) arch/common/sleep/cortexMx_sleep.cpp \ arch/common/cache/cortexMx_cache.cpp \ arch/common/drivers/stm32_gpio.cpp \ - arch/common/drivers/serial_stm32.cpp \ + arch/common/drivers/stm32f7_serial.cpp \ + arch/common/drivers/stm32_serial_common.cpp \ arch/common/drivers/dcc.cpp \ arch/common/drivers/sd_stm32h7.cpp \ $(ARCH_INC)/drivers/pll.cpp \ diff --git a/miosix/config/arch/cortexM7_stm32h7/stm32h755zi_nucleo/board_settings.h b/miosix/config/arch/cortexM7_stm32h7/stm32h755zi_nucleo/board_settings.h index 99cc2e451f613c151bf15813c05a7efd31f09284..0a4a35c5b2795d281d82b2ca801582208c1ef0c5 100644 --- a/miosix/config/arch/cortexM7_stm32h7/stm32h755zi_nucleo/board_settings.h +++ b/miosix/config/arch/cortexM7_stm32h7/stm32h755zi_nucleo/board_settings.h @@ -27,6 +27,8 @@ #pragma once +#include "interfaces/gpio.h" + /** * \internal * Versioning for board_settings.h for out of git tree projects @@ -45,12 +47,27 @@ namespace miosix { const unsigned int MAIN_STACK_SIZE=4*1024; /// Serial port -//This board only exposes USART1, without flow control +/// This board only exposes USART3, without flow control +/// Serial ports 1 to 9 are available (9 is LPUART1) +const unsigned int defaultSerial=3; const unsigned int defaultSerialSpeed=115200; -const unsigned int defaultSerialPort=3; -// #define SERIAL_1_DMA -// #define SERIAL_2_DMA -#define SERIAL_3_DMA +const bool defaultSerialFlowctrl=false; +const bool defaultSerialDma=true; +// Default serial 1 pins (uncomment when using serial 1) +//using defaultSerialTxPin = Gpio<GPIOA_BASE,9>; +//using defaultSerialRxPin = Gpio<GPIOA_BASE,10>; +//using defaultSerialRtsPin = Gpio<GPIOA_BASE,12>; +//using defaultSerialCtsPin = Gpio<GPIOA_BASE,11>; +// Default serial 2 pins (uncomment when using serial 2) +//using defaultSerialTxPin = Gpio<GPIOA_BASE,2>; +//using defaultSerialRxPin = Gpio<GPIOA_BASE,3>; +//using defaultSerialRtsPin = Gpio<GPIOA_BASE,1>; +//using defaultSerialCtsPin = Gpio<GPIOA_BASE,0>; +// Default serial 3 pins (uncomment when using serial 3) +using defaultSerialTxPin = Gpio<GPIOD_BASE,8>; +using defaultSerialRxPin = Gpio<GPIOD_BASE,9>; +using defaultSerialRtsPin = Gpio<GPIOB_BASE,14>; +using defaultSerialCtsPin = Gpio<GPIOB_BASE,13>; //SD card driver static const unsigned char sdVoltage=33; //Board powered @ 3.3V