[MM32硬件] 【灵动微电子MM32F5330测评】2.配置VSCODE+CMAKE开发环境及祖传点灯

[复制链接]
 楼主| sujingliang 发表于 2024-6-22 11:46 | 显示全部楼层 |阅读模式
<
本帖最后由 sujingliang 于 2024-6-22 18:13 编辑

前言
非常荣幸能够获得这次宝贵的测评机会,我衷心感谢灵动微电子以及21IC给予我的这份信任与支持。
昨天收到Mini-F5333评估开发板:

图片1.jpg


配置VSCODE+CMAKE开发环境
简单描述一下步骤吧,这个网上比较多:
1、安装VScode
2、安装编译器MinGW
3、安装cmake
4、VSCODE中安装cmake、c/c++、cmake tools三个插件
5、安装交叉编译工具:arm-gnu-toolchain-13.2.rel1-mingw-w64-i686-arm-none-eabi.exe
6、安装ninja

编写CMakeLists.txt
  1. #THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
  2. set(CMAKE_SYSTEM_NAME Generic)
  3. set(CMAKE_SYSTEM_VERSION 1)
  4. cmake_minimum_required(VERSION 3.20)

  5. # specify cross compilers and tools
  6. set(CMAKE_C_COMPILER arm-none-eabi-gcc)
  7. set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
  8. set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
  9. set(CMAKE_AR arm-none-eabi-ar)
  10. set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
  11. set(CMAKE_OBJDUMP arm-none-eabi-objdump)
  12. set(SIZE arm-none-eabi-size)
  13. set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

  14. # project settings
  15. project(gpio_led_toggle  C CXX ASM)
  16. set(CMAKE_CXX_STANDARD 17)
  17. set(CMAKE_C_STANDARD 11)

  18. #Uncomment for hardware floating point
  19. #add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING)
  20. #add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)
  21. #add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)

  22. #Uncomment for software floating point
  23. #add_compile_options(-mfloat-abi=soft)

  24. add_compile_options(-mcpu=cortex-m33 -mthumb -mthumb-interwork)
  25. add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)

  26. # uncomment to mitigate c++17 absolute addresses warnings
  27. #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register")
  28. if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
  29.     message(VERBOSE "Maximum optimization for speed")
  30.     add_compile_options(-Ofast)
  31. elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo")
  32.     message(VERBOSE "Maximum optimization for speed, debug info included")
  33.     add_compile_options(-Ofast -g)
  34. elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel")
  35.     message(VERBOSE "Maximum optimization for size")
  36.     add_compile_options(-Os)
  37. else ()
  38.     message(VERBOSE "Minimal optimization, debug info included")
  39.     add_compile_options(-Og -g)
  40. endif ()

  41. #添加宏定义
  42. add_definitions(-DUSE_STDPERIPH_DRIVER -DCUSTOM_HSE_VAL)

  43. #添加头文件路径,即.h文件
  44. include_directories(. ./board ./device ./device/CMSIS/Include ./device/drivers)
  45. #添加源文件路径,即.c或者.s文件
  46. file(GLOB SOURCES  ./application/*.c ./board/*.c ./device/armgcc/*.S ./device/drivers/*.c ./device/*.c ./*.c)

  47. #添加你的STM32F103ZETx_FLASH.ld的连接脚本路径
  48. set(LINKER_SCRIPT D:/mini-f5330_blinky_led_armgcc/device/armgcc/linker/mm32f5333d_flash.ld)

  49. add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)
  50. #选择cortex-m3内核
  51. add_link_options(-mcpu=cortex-m33 -mthumb -mthumb-interwork)
  52. add_link_options(-T ${LINKER_SCRIPT})

  53. add_link_options(-specs=nano.specs -specs=nosys.specs -u _printf_float)

  54. add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

  55. set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
  56. set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

  57. add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
  58.         COMMAND ${CMAKE_OBJCOPY} -Oihex [        DISCUZ_CODE_6        ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
  59.         COMMAND ${CMAKE_OBJCOPY} -Obinary [        DISCUZ_CODE_6        ]lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
  60.         COMMENT "Building ${HEX_FILE}
  61. Building ${BIN_FILE}")

编写gcc链接器(Linker)文件:mm32f5333d_flash.ld
  1. /* ROM definition */
  2. __ROM_BASE   = 0x08000000;
  3. __ROM_SIZE   = 0x000020000;

  4. /* RAM definition */
  5. __RAM_BASE   = 0x20000000;
  6. __RAM_SIZE   = 0x00008000;

  7. /* Stack and heap definition */
  8. __STACK_SIZE = 0x00000800;
  9. __HEAP_SIZE  = 0x00000C00;


  10. /* Memory Setting */
  11. MEMORY {
  12.     RAM      (xrw)   : ORIGIN = __RAM_BASE,   LENGTH = __RAM_SIZE
  13.     FLASH    (rx)    : ORIGIN = __ROM_BASE,   LENGTH = __ROM_SIZE
  14. }

  15. /* Entry Point */
  16. ENTRY(Reset_Handler)

  17. /* Sections */
  18. SECTIONS {
  19.     .text :
  20.     {
  21.         KEEP(*(.vectors))
  22.         *(.text*)

  23.         KEEP(*(.init))
  24.         KEEP(*(.fini))

  25.         /* .ctors */
  26.         *crtbegin.o(.ctors)
  27.         *crtbegin?.o(.ctors)
  28.         *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
  29.         *(SORT(.ctors.*))
  30.         *(.ctors)

  31.         /* .dtors */
  32.         *crtbegin.o(.dtors)
  33.         *crtbegin?.o(.dtors)
  34.         *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
  35.         *(SORT(.dtors.*))
  36.         *(.dtors)

  37.         *(.rodata*)

  38.         KEEP(*(.eh_frame*))
  39.     } > FLASH

  40.     .ARM.extab :
  41.     {
  42.         *(.ARM.extab* .gnu.linkonce.armextab.*)
  43.     } > FLASH

  44.     __exidx_start = .;
  45.     .ARM.exidx :
  46.     {
  47.         *(.ARM.exidx* .gnu.linkonce.armexidx.*)
  48.     } > FLASH
  49.     __exidx_end = .;

  50.     .copy.table :
  51.     {
  52.         . = ALIGN(4);
  53.         __copy_table_start__ = .;

  54.         LONG (__etext)
  55.         LONG (__data_start__)
  56.         LONG ((__data_end__ - __data_start__) / 4)

  57.         __copy_table_end__ = .;
  58.     } > FLASH

  59.     .zero.table :
  60.     {
  61.         . = ALIGN(4);
  62.         __zero_table_start__ = .;
  63.         __zero_table_end__ = .;
  64.     } > FLASH

  65.     /**
  66.     * Location counter can end up 2byte aligned with narrow Thumb code but
  67.     * __etext is assumed by startup code to be the LMA of a section in RAM
  68.     * which must be 4byte aligned
  69.     */
  70.     __etext = ALIGN (4);

  71.     .data : AT (__etext)
  72.     {
  73.         __data_start__ = .;
  74.         *(vtable)
  75.         *(.data)
  76.         *(.data.*)

  77.         . = ALIGN(4);
  78.         /* preinit data */
  79.         PROVIDE_HIDDEN (__preinit_array_start = .);
  80.         KEEP(*(.preinit_array))
  81.         PROVIDE_HIDDEN (__preinit_array_end = .);

  82.         . = ALIGN(4);
  83.         /* init data */
  84.         PROVIDE_HIDDEN (__init_array_start = .);
  85.         KEEP(*(SORT(.init_array.*)))
  86.         KEEP(*(.init_array))
  87.         PROVIDE_HIDDEN (__init_array_end = .);

  88.         . = ALIGN(4);
  89.         /* finit data */
  90.         PROVIDE_HIDDEN (__fini_array_start = .);
  91.         KEEP(*(SORT(.fini_array.*)))
  92.         KEEP(*(.fini_array))
  93.         PROVIDE_HIDDEN (__fini_array_end = .);

  94.         KEEP(*(.jcr*))
  95.         . = ALIGN(4);
  96.         /* All data end */
  97.         __data_end__ = .;

  98.     } > RAM

  99.     .bss :
  100.     {
  101.         . = ALIGN(4);
  102.         __bss_start__ = .;
  103.         *(.bss)
  104.         *(.bss.*)
  105.         *(COMMON)
  106.         . = ALIGN(4);
  107.         __bss_end__ = .;
  108.     } > RAM AT > RAM

  109.     .heap (COPY) :
  110.     {
  111.         . = ALIGN(8);
  112.         __end__ = .;
  113.         PROVIDE(end = .);
  114.         . = . + __HEAP_SIZE;
  115.         . = ALIGN(8);
  116.         __HeapLimit = .;
  117.     } > RAM

  118.     .stack (ORIGIN(RAM) + LENGTH(RAM) - __STACK_SIZE) (COPY) :
  119.     {
  120.         . = ALIGN(8);
  121.         __StackLimit = .;
  122.         . = . + __STACK_SIZE;
  123.         . = ALIGN(8);
  124.         __StackTop = .;
  125.     } > RAM
  126.     PROVIDE(__stack = __StackTop);

  127.     /* Check if data + heap + stack exceeds RAM limit */
  128.     ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
  129. }



  130. /* This command is like INPUT, except that the named files should all be
  131. archives, and they are searched repeatedly until no new undefined references
  132. are created. See the description of `-(' in section Command Line Options. */

  133. /*
  134. * if no libs, please comment it.
  135. * else uncomment it.

  136. GROUP (
  137. )

  138. */


点灯程序

  1. int main(void)
  2. {
  3.     PLATFORM_Init();

  4.     GPIO_LED_Toggle_Sample();

  5.     while (1)
  6.     {
  7.     }
  8. }

  1. void GPIO_LED_Toggle_Sample(void)
  2. {
  3.     printf("\r\nTest %s", __FUNCTION__);

  4.     GPIO_Configure();

  5.     while (1)
  6.     {
  7.         GPIO_IO_Toggle(GPIOB, GPIO_Pin_10);
  8.         GPIO_IO_Toggle(GPIOB, GPIO_Pin_11);
  9.         GPIO_IO_Toggle(GPIOC, GPIO_Pin_6);
  10.         GPIO_IO_Toggle(GPIOC, GPIO_Pin_7);

  11.         PLATFORM_DelayMS(100);
  12.     }
  13. }

cmate tools配置
tu12.png

生成:
tu13.png

用POWERWRITE烧录
tu14.png

运行:
微信图片_20240622175725.jpg
Bowclad 发表于 2024-6-27 18:17 | 显示全部楼层
cmake一直搞不懂该怎么写
lulugl 发表于 2024-12-21 23:31 | 显示全部楼层
cfg跟svd可以弄出来吗?
suncat0504 发表于 2024-12-23 12:08 | 显示全部楼层
灵动微的单片机很不错的。开发华景,为啥不选择Keil?VSCode更方便吗?
lvuu 发表于 2025-2-28 23:46 | 显示全部楼层
按照步骤配置好编译器、工具链、插件等后,编写合适的 CMakeLists.txt 文件是关键。
hehhehee 发表于 2025-5-22 23:04 | 显示全部楼层
本帖最后由 hehhehee 于 2025-5-23 00:21 编辑

从消费电子到工业控制,再到物联网和智能家居等领域。
小夏天的大西瓜 发表于 2025-5-27 09:23 | 显示全部楼层
学习一下相关操作
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部