Przeglądaj źródła

Add stm32l1xx support

DenisKrasutsi 7 lat temu
rodzic
commit
893c104498

+ 2 - 2
README.md

@@ -6,7 +6,7 @@ This project is used to develop applications for the STM32 - ST's ARM Cortex-Mx
 
 
 * cmake >= 3.0
 * cmake >= 3.0
 * GCC toolchain with newlib (optional).
 * GCC toolchain with newlib (optional).
-* STM32CubeMX package for STM32F0, STM32F1, STM32F2, STM32F3, STM32F4, STM32F7, STM32L0, STM32L4 families.
+* STM32CubeMX package for STM32F0, STM32F1, STM32F2, STM32F3, STM32F4, STM32F7, STM32L0, STM32L1, STM32L4 families.
 
 
 ## Project contains
 ## Project contains
 
 
@@ -32,7 +32,7 @@ First of all you need to configure toolchain and libraries, you can do this by e
 * `TOOLCHAIN_PREFIX` - where toolchain is located, **default**: `/usr`
 * `TOOLCHAIN_PREFIX` - where toolchain is located, **default**: `/usr`
 * `TARGET_TRIPLET` - toolchain target triplet, **default**: `arm-none-eabi`
 * `TARGET_TRIPLET` - toolchain target triplet, **default**: `arm-none-eabi`
 * `STM32_CHIP` - STM32 device code, e.g. `STM32F407VG` or `STM32F103VG`
 * `STM32_CHIP` - STM32 device code, e.g. `STM32F407VG` or `STM32F103VG`
-* `STM32_FAMILY` - STM32 family (F0, F1, F4, etc.) currently, F0, F1, F2, F4 and F7 families are supported. **Note:** If `STM32_CHIP` variable is set, `STM32_FAMILY` is optional.
+* `STM32_FAMILY` - STM32 family (F0, F1, F4, etc.) currently, F0, F1, F2, F4, F7, L0, L1 and L4 families are supported. **Note:** If `STM32_CHIP` variable is set, `STM32_FAMILY` is optional.
 * `STM32Cube_DIR` - path to STM32CubeMX directory **default**: `/opt/STM32Cube_FW_F0_V1.4.0 /opt/STM32Cube_FW_F1_V1.1.0 /opt/STM32Cube_FW_F2_V1.1.0 /opt/STM32Cube_FW_F4_V1.6.0`
 * `STM32Cube_DIR` - path to STM32CubeMX directory **default**: `/opt/STM32Cube_FW_F0_V1.4.0 /opt/STM32Cube_FW_F1_V1.1.0 /opt/STM32Cube_FW_F2_V1.1.0 /opt/STM32Cube_FW_F4_V1.6.0`
 
 
 To use the toolchain, you'll need to copy contents of the `cmake` folder into cmake's modules path, or use the `CMAKE_MODULE_PATH` variable.
 To use the toolchain, you'll need to copy contents of the `cmake` folder into cmake's modules path, or use the `CMAKE_MODULE_PATH` variable.

+ 11 - 0
cmake/FindCMSIS.cmake

@@ -91,6 +91,17 @@ ELSEIF(STM32_FAMILY STREQUAL "L0")
     IF(NOT CMSIS_STARTUP_SOURCE)
     IF(NOT CMSIS_STARTUP_SOURCE)
         SET(CMSIS_STARTUP_SOURCE startup_stm32l${STM32_CHIP_TYPE_LOWER}.s)
         SET(CMSIS_STARTUP_SOURCE startup_stm32l${STM32_CHIP_TYPE_LOWER}.s)
     ENDIF()
     ENDIF()
+ELSEIF(STM32_FAMILY STREQUAL "L1")
+    IF(NOT STM32Cube_DIR)
+        SET(STM32Cube_DIR "/opt/STM32Cube_FW_L1_V1.8.0")
+        MESSAGE(WARNING "No STM32Cube_DIR specified, using default: " ${STM32Cube_DIR})
+    ENDIF()
+    LIST(APPEND CMSIS_COMMON_HEADERS core_cm3.h)
+    SET(CMSIS_DEVICE_HEADERS stm32l1xx.h system_stm32l1xx.h)
+    SET(CMSIS_DEVICE_SOURCES system_stm32l1xx.c)
+    IF(NOT CMSIS_STARTUP_SOURCE)
+        SET(CMSIS_STARTUP_SOURCE startup_stm32l${STM32_CHIP_TYPE_LOWER}.s)
+    ENDIF()
 ELSEIF(STM32_FAMILY STREQUAL "L4")
 ELSEIF(STM32_FAMILY STREQUAL "L4")
     IF(NOT STM32Cube_DIR)
     IF(NOT STM32Cube_DIR)
         SET(STM32Cube_DIR "/opt/STM32Cube_FW_L4_V1.9.0")
         SET(STM32Cube_DIR "/opt/STM32Cube_FW_L4_V1.9.0")

+ 10 - 0
cmake/FindSTM32HAL.cmake

@@ -87,7 +87,17 @@ ELSEIF(STM32_FAMILY STREQUAL "L0")
     SET(HAL_EX_COMPONENTS adc comp crc cryp dac flash i2c pcd pwr rcc rtc smartcard tim uart usart)
     SET(HAL_EX_COMPONENTS adc comp crc cryp dac flash i2c pcd pwr rcc rtc smartcard tim uart usart)
 
 
     SET(HAL_PREFIX stm32l0xx_)
     SET(HAL_PREFIX stm32l0xx_)
+ELSEIF(STM32_FAMILY STREQUAL "L1")
+    SET(HAL_COMPONENTS adc comp cortex crc cryp dac dma flash flash_ramfunc
+					   gpio i2c i2s irda iwdg lcd nor opamp pcd pwr rcc rtc
+					   sd smartcard spi sram tim uart usart wwdg)
+    SET(HAL_REQUIRED_COMPONENTS cortex pwr)
+    
+    # Components that have _ex sources
+    SET(HAL_EX_COMPONENTS adc cryp dac flash opamp pcd pwr rcc rtc spi tim)
+    # Components that have ll_ in names instead of hal_
 
 
+    SET(HAL_PREFIX stm32l1xx_)
 ELSEIF(STM32_FAMILY STREQUAL "L4")
 ELSEIF(STM32_FAMILY STREQUAL "L4")
     SET(HAL_COMPONENTS adc can comp cortex crc cryp dac dcmi dfsdm dma dma2d dsi 
     SET(HAL_COMPONENTS adc can comp cortex crc cryp dac dcmi dfsdm dma dma2d dsi 
                        firewall flash flash_ramfunc gfxmmu gpio hash hcd i2c irda iwdg
                        firewall flash flash_ramfunc gfxmmu gpio hash hcd i2c irda iwdg

+ 8 - 1
cmake/FindSTM32LL.cmake

@@ -57,6 +57,13 @@ ELSEIF(STM32_FAMILY STREQUAL "L0")
 
 
     SET(LL_PREFIX stm32l0xx_)
     SET(LL_PREFIX stm32l0xx_)
 
 
+ELSEIF(STM32_FAMILY STREQUAL "L1")
+    SET(LL_COMPONENTS	adc comp crc dac dma exti fsmc gpio i2c opamp pwr rcc 
+						rtc sdmmc spi tim usart utils)
+    SET(LL_REQUIRED_COMPONENTS pwr rcc utils)
+
+    SET(LL_PREFIX stm32l1xx_)
+
 ELSEIF(STM32_FAMILY STREQUAL "L4")
 ELSEIF(STM32_FAMILY STREQUAL "L4")
     SET(LL_COMPONENTS	adc bus comp cortex crc crs dac dma2d dmamux dma exti 
     SET(LL_COMPONENTS	adc bus comp cortex crc crs dac dma2d dmamux dma exti 
 						gpio i2c iwdg lptim lpuart opamp pwr rcc rng rtc spi 
 						gpio i2c iwdg lptim lpuart opamp pwr rcc rng rtc spi 
@@ -111,7 +118,7 @@ FOREACH(LL_SRC ${LL_SRCS})
 	)
 	)
 	LIST(APPEND STM32LL_SOURCES ${LL_${LL_SRC_CLEAN}_FILE})
 	LIST(APPEND STM32LL_SOURCES ${LL_${LL_SRC_CLEAN}_FILE})
 ENDFOREACH()
 ENDFOREACH()
-
+    
 INCLUDE(FindPackageHandleStandardArgs)
 INCLUDE(FindPackageHandleStandardArgs)
 
 
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(STM32LL DEFAULT_MSG STM32LL_INCLUDE_DIR STM32LL_SOURCES)
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(STM32LL DEFAULT_MSG STM32LL_INCLUDE_DIR STM32LL_SOURCES)

+ 1 - 1
cmake/gcc_stm32.cmake

@@ -1,7 +1,7 @@
 GET_FILENAME_COMPONENT(STM32_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
 GET_FILENAME_COMPONENT(STM32_CMAKE_DIR ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
 SET(CMAKE_MODULE_PATH ${STM32_CMAKE_DIR} ${CMAKE_MODULE_PATH})
 SET(CMAKE_MODULE_PATH ${STM32_CMAKE_DIR} ${CMAKE_MODULE_PATH})
 
 
-SET(STM32_SUPPORTED_FAMILIES L0 L4 F0 F1 F2 F3 F4 F7 CACHE INTERNAL "stm32 supported families")
+SET(STM32_SUPPORTED_FAMILIES L0 L1 L4 F0 F1 F2 F3 F4 F7 CACHE INTERNAL "stm32 supported families")
 IF(STM32_CHIP)
 IF(STM32_CHIP)
 	 SET(STM32_CHIP "${STM32_CHIP}" CACHE STRING "STM32 chip to build for")
 	 SET(STM32_CHIP "${STM32_CHIP}" CACHE STRING "STM32 chip to build for")
 ENDIF()
 ENDIF()

+ 133 - 0
cmake/gcc_stm32l1.cmake

@@ -0,0 +1,133 @@
+SET(CMAKE_C_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -Wall -std=gnu99 -ffunction-sections -fdata-sections -fomit-frame-pointer -mabi=aapcs -fno-unroll-loops -ffast-math -ftree-vectorize" CACHE INTERNAL "c compiler flags")
+SET(CMAKE_CXX_FLAGS "-mthumb -fno-builtin -mcpu=cortex-m3 -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-m3 -x assembler-with-cpp" CACHE INTERNAL "asm compiler flags")
+
+
+SET(CMAKE_EXE_LINKER_FLAGS "-Wl,--gc-sections -mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "executable linker flags")
+SET(CMAKE_MODULE_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "module linker flags")
+SET(CMAKE_SHARED_LINKER_FLAGS "-mthumb -mcpu=cortex-m3 -mabi=aapcs" CACHE INTERNAL "shared linker flags")
+
+SET(STM32_CHIP_TYPES 100xB   100xBA   100xC   151xB   151xBA   151xC   151xCA   151xD   151xDX   151xE   152xB   152xBA   152xC   152xCA   152xD   152xDX   152xE   162xC   162xCA   162xD   162xDX   162xE   CACHE INTERNAL "stm32l1 chip types")
+SET(STM32_CODES     "100.B" "100.BA" "100.C" "151.B" "151.BA" "151.C" "151.CA" "151.D" "151.DX" "151.E" "152.B" "152.BA" "152.C" "152.CA" "152.D" "152.DX" "152.E" "162.C" "162.CA" "162.D" "162.DX" "162.E")
+
+MACRO(STM32_GET_CHIP_TYPE CHIP CHIP_TYPE)
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[lL]((100.[BC])|(100.[BC]A)|(15[12].[BCE])|(15[12].[BC]A)|(15[12].DX)|(162.[EDC])|(162.CA)|(162.DX)).+$" "\\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[lL](1[056][012]).([68BCDE]$|[68BCDE][AX]$)" "\\1" STM32_CODE ${CHIP})
+    STRING(REGEX REPLACE "^[sS][tT][mM]32[lL](1[056][012]).([68BCDE]$|[68BCDE][AX]$)" "\\2" STM32_SIZE_CODE ${CHIP})
+
+    IF(STM32_SIZE_CODE STREQUAL "6" OR STM32_SIZE_CODE STREQUAL "6A")
+        SET(FLASH "32K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "8" OR STM32_SIZE_CODE STREQUAL "8A")
+        SET(FLASH "64K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "B" OR STM32_SIZE_CODE STREQUAL "BA")
+        SET(FLASH "128K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "C" OR STM32_SIZE_CODE STREQUAL "CA")
+        SET(FLASH "256K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "D" OR STM32_SIZE_CODE STREQUAL "DX")
+        SET(FLASH "384K")
+    ELSEIF(STM32_SIZE_CODE STREQUAL "E")
+        SET(FLASH "512K")
+    ENDIF()
+
+    STM32_GET_CHIP_TYPE(${CHIP} TYPE)
+    
+    IF(${TYPE} STREQUAL 100xB)
+        SET(RAM "10K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 100xBA)
+        SET(RAM "16K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 100xC)
+        SET(RAM "16K")
+        SET(FLASH "256K")
+
+    ELSEIF(${TYPE} STREQUAL 151xB)
+        SET(RAM "16K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 151xBA)
+        SET(RAM "32K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 151xC)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 151xCA)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 151xD)
+        SET(RAM "48K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 151xDX)
+        SET(RAM "80K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 151xE)
+        SET(RAM "80K")
+        SET(FLASH "512K")
+
+    ELSEIF(${TYPE} STREQUAL 152xB)
+        SET(RAM "16K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 152xBA)
+        SET(RAM "32K")
+        SET(FLASH "128K")
+    ELSEIF(${TYPE} STREQUAL 152xC)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 152xCA)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 152xD)
+        SET(RAM "48K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 152xDX)
+        SET(RAM "80K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 152xE)
+        SET(RAM "80K")
+        SET(FLASH "512K")
+
+    ELSEIF(${TYPE} STREQUAL 162xC)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 162xCA)
+        SET(RAM "32K")
+        SET(FLASH "256K")
+    ELSEIF(${TYPE} STREQUAL 162xD)
+        SET(RAM "48K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 162xDX)
+        SET(RAM "80K")
+        SET(FLASH "384K")
+    ELSEIF(${TYPE} STREQUAL 162xE)
+        SET(RAM "80K")
+        SET(FLASH "512K")
+    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 STM32L1 chip type: ${CHIP_TYPE}")
+    ENDIF()
+    GET_TARGET_PROPERTY(TARGET_DEFS ${TARGET} COMPILE_DEFINITIONS)
+    IF(TARGET_DEFS)
+        SET(TARGET_DEFS "STM32L${CHIP_TYPE};${TARGET_DEFS}")
+    ELSE()
+        SET(TARGET_DEFS "STM32L${CHIP_TYPE}")
+    ENDIF()
+    SET_TARGET_PROPERTIES(${TARGET} PROPERTIES COMPILE_DEFINITIONS "${TARGET_DEFS}")
+ENDFUNCTION()