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的通配符匹配时,有些文件编译会出错,需要把它们先重命
名或删除:
这三个文件的编译错误只有等官方再次更新sdk了,好在它们不影响本次测评活动。
敲入如下命令编译
<pre>cmake -B /tmp/build
cmake --bulid /tmp/build -j8
</pre>复制代码
编译最后结果:
在/tmp/build目录下会fr30xxc_burn.bin生成,此文件烧录即可,版上官方那个windows下的串口烧录工具使用写得挺多的,笔者这里不再赘述。
烧录成功后,板子上LED开始有规律的闪烁,表明开发环境搭建成功。