Просмотр исходного кода

Merge pull request #34 from szechyjs/add_f3_support

Initial support for STM32F3
ObKo 9 лет назад
Родитель
Сommit
7bb0487794
4 измененных файлов с 104 добавлено и 1 удалено
  1. 13 0
      cmake/FindCMSIS.cmake
  2. 20 0
      cmake/FindSTM32HAL.cmake
  3. 1 1
      cmake/gcc_stm32.cmake
  4. 70 0
      cmake/gcc_stm32f3.cmake

+ 13 - 0
cmake/FindCMSIS.cmake

@@ -39,6 +39,19 @@ ELSEIF(STM32_FAMILY STREQUAL "F2")
     LIST(APPEND CMSIS_COMMON_HEADERS core_cm4.h)
     SET(CMSIS_DEVICE_HEADERS stm32f2xx.h system_stm32f2xx.h)
     SET(CMSIS_DEVICE_SOURCES system_stm32f2xx.c)
+ELSEIF(STM32_FAMILY STREQUAL "F3")
+    IF(NOT STM32Cube_DIR)
+        SET(STM32Cube_DIR "/opt/STM32Cube_FW_F3_V1.6.0")
+        MESSAGE(STATUS "No STM32Cube_DIR specified, using default: " ${STM32Cube_DIR})
+    ENDIF()
+
+    STRING(REGEX REPLACE "^(3..).(.)" "\\1x\\2" STM32_STARTUP_NAME ${STM32_CODE})
+    STRING(TOLOWER ${STM32_STARTUP_NAME} STM32_STARTUP_NAME_LOWER)
+    SET(CMSIS_STARTUP_SOURCE startup_stm32f${STM32_STARTUP_NAME_LOWER}.s)
+
+    LIST(APPEND CMSIS_COMMON_HEADERS core_cm4.h)
+    SET(CMSIS_DEVICE_HEADERS stm32f3xx.h system_stm32f3xx.h)
+    SET(CMSIS_DEVICE_SOURCES system_stm32f3xx.c)
 ELSEIF(STM32_FAMILY STREQUAL "F4")
     IF(NOT STM32Cube_DIR)
         SET(STM32Cube_DIR "/opt/STM32Cube_FW_F4_V1.8.0")

+ 20 - 0
cmake/FindSTM32HAL.cmake

@@ -66,6 +66,26 @@ ELSEIF(STM32_FAMILY STREQUAL "F2")
     SET(HAL_SRCS
         stm32f2xx_hal.c
     )
+ELSEIF(STM32_FAMILY STREQUAL "F3")
+    SET(HAL_COMPONENTS adc can cec comp cortex crc dac dma flash gpio i2c i2s
+                       irda nand nor opamp pccard pcd pwr rcc rtc sdadc
+                       smartcard smbus spi sram tim tsc uart usart wwdg)
+
+    SET(HAL_REQUIRED_COMPONENTS cortex pwr rcc)
+
+    SET(HAL_EX_COMPONENTS adc crc dac flash i2c i2s opamp pcd pwr
+                          rcc rtc smartcard spi tim uart)
+
+    SET(HAL_PREFIX stm32f3xx_)
+
+    SET(HAL_HEADERS
+        stm32f3xx_hal.h
+        stm32f3xx_hal_def.h
+    )
+
+    SET(HAL_SRCS
+        stm32f3xx_hal.c
+    )
 ELSEIF(STM32_FAMILY STREQUAL "F4")
     SET(HAL_COMPONENTS adc can cec cortex crc cryp dac dcmi dma dma2d eth flash
                        flash_ramfunc fmpi2c gpio hash hcd i2c i2s irda iwdg ltdc

+ 1 - 1
cmake/gcc_stm32.cmake

@@ -1,6 +1,6 @@
 INCLUDE(CMakeForceCompiler)
 
-SET(STM32_SUPPORTED_FAMILIES L0 F0 F1 F2 F4 F7 CACHE INTERNAL "stm32 supported families")
+SET(STM32_SUPPORTED_FAMILIES L0 F0 F1 F2 F3 F4 F7 CACHE INTERNAL "stm32 supported families")
 
 IF(NOT TOOLCHAIN_PREFIX)
      SET(TOOLCHAIN_PREFIX "/usr")

+ 70 - 0
cmake/gcc_stm32f3.cmake

@@ -0,0 +1,70 @@
+SET(CMAKE_C_FLAGS "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=gnu11 -Os -ffunction-sections -fdata-sections -g -Wall" CACHE INTERNAL "c compiler flags")
+SET(CMAKE_CXX_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -std=c++11 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "cxx compiler flags")
+SET(CMAKE_ASM_FLAGS "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -g -Wa,--no-warn -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags")
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections -mthumb -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard" CACHE INTERNAL "executable linker flags")
+SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16" CACHE INTERNAL "module linker flags")
+SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16" CACHE INTERNAL "shared linker flags")
+SET(STM32_CHIP_TYPES 301xx 302xx 303xx 334xx 373xx CACHE INTERNAL "stm32f3 chip types")
+SET(STM32_CODES "301.." "302.." "303.." "334.." "373..")
+
+MACRO(STM32_GET_CHIP_TYPE CHIP CHIP_TYPE)
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF](3[037][1234].[68BC]).*$" "\\1" STM32_CODE ${CHIP})
+    SET(INDEX 0)
+    FOREACH(C_TYPE ${STM32_CHIP_TYPES})
+        LIST(GET STM32_CODES ${INDEX} CHIP_TYPE_REGEXP)
+        IF(STM32_CODE MATCHES ${CHIP_TYPE_REGEXP})
+            SET(RESULT_TYPE ${C_TYPE})
+        ENDIF()
+        MATH(EXPR INDEX "${INDEX}+1")
+    ENDFOREACH()
+    SET(${CHIP_TYPE} ${RESULT_TYPE})
+ENDMACRO()
+
+MACRO(STM32_GET_CHIP_PARAMETERS CHIP FLASH_SIZE RAM_SIZE)
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF](3[037][1234].[68BC]).*$" "\\1" STM32_CODE ${CHIP})
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[fF]3[037][1234].([68BC]).*$" "\\1" STM32_SIZE_CODE ${CHIP})
+
+    IF(STM32_SIZE_CODE STREQUAL "6")
+        SET(FLASH "32K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "8")
+        SET(FLASH "64K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "B")
+        SET(FLASH "128K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "C")
+        SET(FLASH "256K")
+    ENDIF()
+
+    STM32_GET_CHIP_TYPE(${CHIP} TYPE)
+
+    IF(${TYPE} STREQUAL "301xx")
+        SET(RAM "16K")
+    ELSEIF(${TYPE} STREQUAL "302xx")
+        SET(RAM "256K")
+    ELSEIF(${TYPE} STREQUAL "303xx")
+        SET(RAM "48K")
+    ELSEIF(${TYPE} STREQUAL "334xx")
+        SET(RAM "16K")
+    ELSEIF(${TYPE} STREQUAL "373xx")
+        SET(RAM "128K")
+    ENDIF()
+
+    SET(${FLASH_SIZE} ${FLASH})
+    SET(${RAM_SIZE} ${RAM})
+ENDMACRO()
+
+FUNCTION(STM32_SET_CHIP_DEFINITIONS TARGET CHIP_TYPE)
+    LIST(FIND STM32_CHIP_TYPES ${CHIP_TYPE} TYPE_INDEX)
+    IF(TYPE_INDEX EQUAL -1)
+        MESSAGE(FATAL_ERROR "Invalid/unsupported STM32F3 chip type: ${CHIP_TYPE}")
+    ENDIF()
+    GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
+    STRING(REGEX REPLACE "^(3..).(.)" "\\1x\\2" CHIP_TYPE_2 ${STM32_CODE})
+    IF(TARGET_DEFS)
+        SET(TARGET_DEFS "STM32F3;STM32F${CHIP_TYPE_2};${TARGET_DEFS}")
+    ELSE()
+        SET(TARGET_DEFS "STM32F3;STM32F${CHIP_TYPE_2}")
+    ENDIF()
+
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
+ENDFUNCTION()