/* * This file is part of Cleanflight and Betaflight. * * Cleanflight and Betaflight are free software. You can redistribute * this software and/or modify this software under the terms of the * GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) * any later version. * * Cleanflight and Betaflight are distributed in the hope that they * 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. * * You should have received a copy of the GNU General Public License * along with this software. * * If not, see . */ #pragma once #if defined(STM32G474xx) #include "stm32g4xx.h" #include "stm32g4xx_hal.h" #include "system_stm32g4xx.h" #include "stm32g4xx_ll_spi.h" #include "stm32g4xx_ll_gpio.h" #include "stm32g4xx_ll_dma.h" #include "stm32g4xx_ll_rcc.h" #include "stm32g4xx_ll_bus.h" #include "stm32g4xx_ll_tim.h" #include "stm32g4xx_ll_system.h" #include "drivers/stm32/stm32g4xx_ll_ex.h" // Chip Unique ID on G4 #define U_ID_0 (*(uint32_t*)UID_BASE) #define U_ID_1 (*(uint32_t*)(UID_BASE + 4)) #define U_ID_2 (*(uint32_t*)(UID_BASE + 8)) #define USE_PIN_AF #ifndef STM32G4 #define STM32G4 #endif #elif defined(STM32H743xx) || defined(STM32H750xx) || defined(STM32H7A3xx) || defined(STM32H7A3xxQ) || defined(STM32H723xx) || defined(STM32H725xx) || defined(STM32H730xx) #include "stm32h7xx.h" #include "stm32h7xx_hal.h" #include "system_stm32h7xx.h" #include "stm32h7xx_ll_spi.h" #include "stm32h7xx_ll_gpio.h" #include "stm32h7xx_ll_dma.h" #include "stm32h7xx_ll_rcc.h" #include "stm32h7xx_ll_bus.h" #include "stm32h7xx_ll_tim.h" #include "stm32h7xx_ll_system.h" #include "drivers/stm32/stm32h7xx_ll_ex.h" // Chip Unique ID on H7 #define U_ID_0 (*(uint32_t*)UID_BASE) #define U_ID_1 (*(uint32_t*)(UID_BASE + 4)) #define U_ID_2 (*(uint32_t*)(UID_BASE + 8)) #define USE_PIN_AF #ifndef STM32H7 #define STM32H7 #endif #elif defined(STM32F722xx) || defined(STM32F745xx) || defined(STM32F746xx) || defined(STM32F765xx) #include "stm32f7xx.h" #include "stm32f7xx_hal.h" #include "system_stm32f7xx.h" #include "stm32f7xx_ll_spi.h" #include "stm32f7xx_ll_gpio.h" #include "stm32f7xx_ll_dma.h" #include "stm32f7xx_ll_rcc.h" #include "stm32f7xx_ll_bus.h" #include "stm32f7xx_ll_tim.h" #include "stm32f7xx_ll_system.h" #include "drivers/stm32/stm32f7xx_ll_ex.h" // Chip Unique ID on F7 #define U_ID_0 (*(uint32_t*)UID_BASE) #define U_ID_1 (*(uint32_t*)(UID_BASE + 4)) #define U_ID_2 (*(uint32_t*)(UID_BASE + 8)) #define USE_PIN_AF #ifndef STM32F7 #define STM32F7 #endif #elif defined(STM32F40_41xxx) || defined(STM32F411xE) || defined(STM32F446xx) #include "stm32f4xx.h" // Chip Unique ID on F405 #define U_ID_0 (*(uint32_t*)0x1fff7a10) #define U_ID_1 (*(uint32_t*)0x1fff7a14) #define U_ID_2 (*(uint32_t*)0x1fff7a18) #ifndef STM32F4 #define STM32F4 #endif #endif #ifdef STM32F4 #if defined(STM32F40_41xxx) #define USE_FAST_DATA #endif #define USE_RPM_FILTER #define USE_DYN_IDLE #define USE_DYN_NOTCH_FILTER #define USE_ADC_INTERNAL #define USE_USB_CDC_HID #define USE_USB_MSC #define USE_PERSISTENT_MSC_RTC #define USE_MCO #define USE_DMA_SPEC #define USE_PERSISTENT_OBJECTS #define USE_CUSTOM_DEFAULTS_ADDRESS #define USE_LATE_TASK_STATISTICS #if defined(STM32F40_41xxx) || defined(STM32F411xE) #define USE_OVERCLOCK #endif #endif // STM32F4 #ifdef STM32F7 #define USE_ITCM_RAM #define ITCM_RAM_OPTIMISATION "-O2", "-freorder-blocks-algorithm=simple" #define USE_FAST_DATA #define USE_RPM_FILTER #define USE_DYN_IDLE #define USE_DYN_NOTCH_FILTER #define USE_OVERCLOCK #define USE_ADC_INTERNAL #define USE_USB_CDC_HID #define USE_USB_MSC #define USE_PERSISTENT_MSC_RTC #define USE_MCO #define USE_DMA_SPEC #define USE_PERSISTENT_OBJECTS #define USE_CUSTOM_DEFAULTS_ADDRESS #define USE_LATE_TASK_STATISTICS #endif // STM32F7 #ifdef STM32H7 #ifdef USE_DSHOT #define USE_DSHOT_CACHE_MGMT #endif #define USE_ITCM_RAM #define USE_FAST_DATA #define USE_RPM_FILTER #define USE_DYN_IDLE #define USE_DYN_NOTCH_FILTER #define USE_ADC_INTERNAL #define USE_USB_CDC_HID #define USE_DMA_SPEC #define USE_PERSISTENT_OBJECTS #define USE_DMA_RAM #define USE_USB_MSC #define USE_RTC_TIME #define USE_PERSISTENT_MSC_RTC #define USE_LATE_TASK_STATISTICS #endif #ifdef STM32G4 #define USE_RPM_FILTER #define USE_DYN_IDLE #define USE_OVERCLOCK #define USE_DYN_NOTCH_FILTER #define USE_ADC_INTERNAL #define USE_USB_MSC #define USE_USB_CDC_HID #define USE_MCO #define USE_DMA_SPEC #define USE_LATE_TASK_STATISTICS #endif #if defined(STM32F4) || defined(STM32F7) || defined(STM32H7) || defined(STM32G4) #define TASK_GYROPID_DESIRED_PERIOD 125 // 125us = 8kHz #define SCHEDULER_DELAY_LIMIT 10 #else #define TASK_GYROPID_DESIRED_PERIOD 1000 // 1000us = 1kHz #define SCHEDULER_DELAY_LIMIT 100 #endif // Set the default cpu_overclock to the first level (108MHz) for F411 // Helps with looptime stability as the CPU is borderline when running native gyro sampling #if defined(USE_OVERCLOCK) && defined(STM32F411xE) #define DEFAULT_CPU_OVERCLOCK 1 #else #define DEFAULT_CPU_OVERCLOCK 0 #endif #if defined(STM32H7) // Move ISRs to fast ram to avoid flash latency. #define FAST_IRQ_HANDLER FAST_CODE #else #define FAST_IRQ_HANDLER #endif #if defined(STM32F4) || defined(STM32G4) // F4 can't DMA to/from CCM (core coupled memory) SRAM (where the stack lives) // On G4 there is no specific DMA target memory #define DMA_DATA_ZERO_INIT #define DMA_DATA #define STATIC_DMA_DATA_AUTO static #elif defined(STM32F7) // F7 has no cache coherency issues DMAing to/from DTCM, otherwise buffers must be cache aligned #define DMA_DATA_ZERO_INIT FAST_DATA_ZERO_INIT #define DMA_DATA FAST_DATA #define STATIC_DMA_DATA_AUTO static DMA_DATA #else // DMA to/from any memory #define DMA_DATA_ZERO_INIT __attribute__ ((section(".dmaram_bss"), aligned(32))) #define DMA_DATA __attribute__ ((section(".dmaram_data"), aligned(32))) #define STATIC_DMA_DATA_AUTO static DMA_DATA #endif #if defined(STM32F4) || defined(STM32H7) // Data in RAM which is guaranteed to not be reset on hot reboot #define PERSISTENT __attribute__ ((section(".persistent_data"), aligned(4))) #endif #ifdef USE_DMA_RAM #if defined(STM32H7) #define DMA_RAM __attribute__((section(".DMA_RAM"), aligned(32))) #define DMA_RW_AXI __attribute__((section(".DMA_RW_AXI"), aligned(32))) extern uint8_t _dmaram_start__; extern uint8_t _dmaram_end__; #elif defined(STM32G4) #define DMA_RAM_R __attribute__((section(".DMA_RAM_R"))) #define DMA_RAM_W __attribute__((section(".DMA_RAM_W"))) #define DMA_RAM_RW __attribute__((section(".DMA_RAM_RW"))) #endif #else #define DMA_RAM #define DMA_RW_AXI #define DMA_RAM_R #define DMA_RAM_W #define DMA_RAM_RW #endif #define USE_TIMER_MGMT #define USE_TIMER_AF #ifdef STM32F4 #ifndef I2C1_SCL_PIN #define I2C1_SCL_PIN PB6 #endif #ifndef I2C1_SDA_PIN #define I2C1_SDA_PIN PB7 #endif #ifndef I2C2_SCL_PIN #define I2C2_SCL_PIN PB10 #endif #ifndef I2C2_SDA_PIN #define I2C2_SDA_PIN PB11 #endif #ifndef I2C3_SCL_PIN #define I2C3_SCL_PIN PA8 #endif #ifndef I2C3_SDA_PIN #define I2C3_SDA_PIN PC9 #endif #endif // STM32F4 #ifdef STM32F7 #ifndef I2C1_SCL_PIN #define I2C1_SCL_PIN PB6 #endif #ifndef I2C1_SDA_PIN #define I2C1_SDA_PIN PB7 #endif #ifndef I2C2_SCL_PIN #define I2C2_SCL_PIN PB10 #endif #ifndef I2C2_SDA_PIN #define I2C2_SDA_PIN PB11 #endif #ifndef I2C3_SCL_PIN #define I2C3_SCL_PIN PA8 #endif #ifndef I2C3_SDA_PIN #define I2C3_SDA_PIN PB4 #endif #ifndef I2C4_SCL_PIN #define I2C4_SCL_PIN PD12 #endif #ifndef I2C4_SDA_PIN #define I2C4_SDA_PIN PD13 #endif #endif // STM32F7 #ifndef SPI1_SCK_PIN #define SPI1_SCK_PIN PA5 #define SPI1_MISO_PIN PA6 #define SPI1_MOSI_PIN PA7 #endif #ifndef SPI2_SCK_PIN #define SPI2_SCK_PIN PB13 #define SPI2_MISO_PIN PB14 #define SPI2_MOSI_PIN PB15 #endif #ifndef SPI3_SCK_PIN #define SPI3_SCK_PIN PB3 #define SPI3_MISO_PIN PB4 #define SPI3_MOSI_PIN PB5 #endif #ifndef SPI4_SCK_PIN #define SPI4_SCK_PIN NONE #define SPI4_MISO_PIN NONE #define SPI4_MOSI_PIN NONE #endif #ifndef SPI5_SCK_PIN #define SPI5_SCK_PIN NONE #define SPI5_MISO_PIN NONE #define SPI5_MOSI_PIN NONE #endif #ifndef SPI6_SCK_PIN #define SPI6_SCK_PIN NONE #define SPI6_MISO_PIN NONE #define SPI6_MOSI_PIN NONE #endif