FR3068x-C这块开发板性能很强还带屏,做工很好,官方对MDK开发环境支持得比较友好,但笔者一直喜欢linux下做开发。以往也碰到过有MDK-only的板子,笔者后来都通过种种方法实现了linux下的开发,那么这次能否做到呢?请看笔者步骤吧。

一般来说开发环境主要解决工具链、源码工程组织、编译烧录等三方面的问题。工具链还是比较好解决的,直接用Linux发行版安装的arm-none-eabi-gcc即可;源码工程组织笔者准备用cmake;烧录的问题解决过程挺长的:sdk中有适用于jlink的算法FLM文件,但笔者没有jlink;后续笔者咨询过官方能否给出此MCU的pack包以便支持pyocd下的烧录,但官方综合考虑后没有意向,估计effort还是有点大的;然后串口烧录协议又不开放,所以笔者就想着自己去实现这款mcu在openocd下的flash算法,在这上面花费了好多时间,最后实现了openocd下读flash,擦除也支持了,但openocd的flash写还有些问题,年后因测评快结束,所以笔者不得不回到官方的windows下串口烧录工具,等我做完后再来继续做openocd的flash支持吧。

注:官方有一个补丁可以支持gcc+Makefile,但是Makefile书写还是比较费劲的,用cmake比较方便。

下面以点灯代码examples/peripheral_demo/gpio/为例,讲讲书写CMakeLists.txt的要点。

MCU的cpu部分应该是基于arm中国的star-mc1,且支持fpu,所以相应cpu部分正确的CFLAGS应该为:
<pre>-mthumb -mcpu=star-mc1 -mfloat-abi=hard -mfpu=fpv5-sp-d16
  • </pre>
  • 复制代码

    sdk中有适用于gcc的link script,位置在components/tools/gcc/ldscript.ld,所以CMakeLists.txt中需要类似下面这一行:
    set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/components/tools/gcc/ldscript.ld)
    复制代码


    另外板子的MCU应该是FR3068E,所以flash高达2MB,sram有512KB,咱们要充分利用资源阿,所以笔者给官方的ldscript.ld打如下补丁:
    <pre>diff --git a/components/tools/gcc/ldscript.ld b/components/tools/gcc/ldscript.ld
  • index cb51cb0..0e8d4a9 100644
  • --- a/components/tools/gcc/ldscript.ld
  • +++ b/components/tools/gcc/ldscript.ld
  • @@ -13,9 +13,9 @@

  • MEMORY
  • {
  • -  FLASH (rx)    : ORIGIN = 0x08002000, LENGTH = 1016K
  • +  FLASH (rx)    : ORIGIN = 0x08002000, LENGTH = 2040K
  •    PRAM (xrw)    : ORIGIN = 0x1FFE0000, LENGTH = 128K
  • -  SRAM (rw)     : ORIGIN = 0x20000000, LENGTH = 256K
  • +  SRAM (rw)     : ORIGIN = 0x20000000, LENGTH = 512K
  • }
  • </pre>
  • 复制代码


    cmake最后一步需要用sdk中的python脚本components/tools/post_process.py处理下,生成最终的可用
    于烧录的burn文件,所以笔者的CMakeLists.txt中有一行:
    COMMAND python3 ${CMAKE_SOURCE_DIR}/components/tools/post_process.py ${PROJECT_NAME} .
  • 复制代码
    注意最后那个"."是当前目录的意思不可缺少

    笔者最终的CMakeLists.txt文件如下:
    set(CMAKE_SYSTEM_NAME Generic)
  • set(CMAKE_SYSTEM_VERSION 1)
  • set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY")
  • cmake_minimum_required(VERSION 3.20)

  • set(CMAKE_C_COMPILER arm-none-eabi-gcc)
  • set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
  • set(CMAKE_ASM_COMPILER arm-none-eabi-gcc)
  • set(CMAKE_AR arm-none-eabi-ar)
  • set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
  • set(CMAKE_OBJDUMP arm-none-eabi-objdump)
  • set(SIZE arm-none-eabi-size)

  • set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
  • set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
  • set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  • set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)

  • add_compile_options(-mthumb -mcpu=star-mc1 -mfloat-abi=hard -mfpu=fpv5-sp-d16)
  • add_compile_options(-fno-builtin -ffreestanding -ffunction-sections -fdata-sections -fno-builtin -fno-common -Wall -Wshadow -Wdouble-promotion -Wno-unused-parameter)

  • add_compile_options(-O3)

  • project(fr30xxc C ASM)
  • set(CMAKE_CXX_STANDARD 11)
  • set(CMAKE_C_STANDARD 99)

  • include_directories(components/btdm/include
  •                     components/drivers/cmsis
  •                     components/drivers/device
  •                     components/drivers/device/fr30xx
  •                     components/drivers/peripheral/Inc
  •                     components/drivers/bsp/spi_flash
  •                     components/modules/common/include
  •                     components/modules/crc
  •                     components/modules/FlashDB/flashdb/inc
  •                     components/modules/FlashDB/port/fal/inc
  •                     components/modules/FreeRTOS/include
  •                     components/modules/FreeRTOS/portable/ARMv8M/non_secure
  •                     components/modules/FreeRTOS/portable/ARMv8M/non_secure/portable
  •                     components/modules/FreeRTOS/portable/ARMv8M/non_secure/portable/GCC/ARM_CM33_NTZ
  •                     components/modules/heap
  •                     examples/common/btdm
  •                     examples/common/flashdb
  •                     examples/common/ota
  •                     examples/application/ble_simple_periphreal/Inc
  •                     )

  • add_definitions(-DUSE_STDPERIPH_DRIVER)

  • file(GLOB_RECURSE SOURCES
  •                 "components/drivers/device/fr30xx/*.c"
  •                 "components/drivers/device/fr30xx/gcc/*.c"
  •                 "components/drivers/device/fr30xx/gcc/startup_fr30xx.S"
  •                 "components/drivers/peripheral/Src/*.c"
  •                 "components/modules/common/src/*.c"
  •                 "components/modules/crc/crc32.c"
  •                 "components/modules/fatfs/source/*.c"
  •                 "components/modules/heap/heap.c"
  •                 "examples/peripheral_demo/gpio/Src/*.c"
  •                 )

  • set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/components/tools/gcc/ldscript.ld)
  • add_link_options(
  •                 -mthumb -mcpu=star-mc1 -mfloat-abi=hard -mfpu=fpv5-sp-d16
  •                 -Wl,--gc-sections,--print-memory-usage,-Map,${PROJECT_NAME}.map
  •                 --specs=nano.specs
  •                 --specs=nosys.specs
  •                 )
  • add_link_options(-T ${LINKER_SCRIPT})

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

  • target_link_libraries(${PROJECT_NAME}.elf ${CMAKE_SOURCE_DIR}/components/btdm/libbtdm_host.a)

  • set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
  • set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)
  • set(LST_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.lst)
  • add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
  •         COMMAND ${CMAKE_OBJCOPY} -Oihex [        DISCUZ_CODE_136        ]amp;lt;TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE}
  •         COMMAND ${CMAKE_OBJCOPY} -Obinary [        DISCUZ_CODE_136        ]amp;lt;TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE}
  •         COMMAND ${CMAKE_OBJDUMP} --all-headers --demangle --disassemble [        DISCUZ_CODE_136        ]amp;lt;TARGET_FILE:${PROJECT_NAME}.elf> > ${LST_FILE}
  •         COMMAND ${SIZE} --format=berkeley [        DISCUZ_CODE_136        ]amp;lt;TARGET_FILE:${PROJECT_NAME}.elf>
  •         COMMAND python3 ${CMAKE_SOURCE_DIR}/components/tools/post_process.py ${PROJECT_NAME} .
  • )
  • 复制代码


    另外官方SDK有些头文件缺乏,所以用cmake的通配符匹配时,有些文件编译会出错,需要把它们先重命
    名或删除:
    2.jpg
    这三个文件的编译错误只有等官方再次更新sdk了,好在它们不影响本次测评活动。

    敲入如下命令编译
    <pre>cmake -B /tmp/build
  • cmake --bulid /tmp/build -j8
  • </pre>
  • 复制代码

    编译最后结果:
    1.jpg
    在/tmp/build目录下会fr30xxc_burn.bin生成,此文件烧录即可,版上官方那个windows下的串口烧录工具使用写得挺多的,笔者这里不再赘述。

    烧录成功后,板子上LED开始有规律的闪烁,表明开发环境搭建成功。