移植说明
- 基于官网的MSDK, 将工程先分解出来, 之前的工程是BOOT+APP融合在一起了, 对于APP部分来说, BOOT相关的内容和去除, 这样我们在学习过程中结构会更清晰一点。
- 由于目前的MSDK结构比较复杂, 涵盖了很多的模块, 比如cmd、flash、hal、lib、net、os等, 这些模块之间有依赖关系, 需要理清楚这些模块的依赖关系, 然后再进行移植。
- 首先参考官方的编译设置, 构建一个初步能跑了CMakLists.txt, 能打印一些简单的版本信息
- 考虑到使用这款芯片主要就是用ble和wifi模块,所以直接给出完整功能的Cmake工程,后续需要裁剪直接修改即可
- eclipse类型的ide,查找头文件和源文件路径实在太麻烦,搜索又难用的很,最关键的是copilot没法直接aigent了,对于学习来说直接使用对个中细节把握不够清楚,知其然不知其所以然,自己手动移植一遍,也对加深工程中各个模块的相互关系,可以帮助学习
工程结构
- 宏定义
bash
# C的宏定义
target_compile_definitions(stm32cubemx INTERFACE
CFG_RTOS
PLATFORM_OS_FREERTOS
)
- 头文件路径
c
# C的头文件
target_include_directories(stm32cubemx INTERFACE
# MCU specific
platform/riscv/arch
platform/riscv/arch/boot
platform/riscv/arch/lib
platform/riscv/arch/ll
platform/riscv/arch/compiler
platform/src
platform/src/reg
platform/src/raw_flash
platform/src/qspi_flash
platform/src/dma
platform/src/time
platform/src/trng
platform/src/uart
platform/src/spi
platform/src/spi_i2s
platform/src/nvds
platform/src/rf
platform/riscv/gd32vw55x
platform/riscv/NMSIS/Core/Include
platform/riscv/NMSIS/DSP/Include
platform/riscv/NMSIS/DSP/Include/dsp
platform/GD32VW55x_standard_peripheral
platform/GD32VW55x_standard_peripheral/Include
# RTOS specific
rtos/rtos_wrapper
rtos/FreeRTOS/Source/include
rtos/FreeRTOS/Source/portable/riscv32
rtos/FreeRTOS/config
# LWIP specific
lwip/iperf3
lwip/iperf
lwip/lwip-2.2.0/src/include
lwip/lwip-2.2.0/src/include/compat/posix
lwip/lwip-2.2.0/src/include/lwip
lwip/lwip-2.2.0/src/include/lwip/apps
lwip/lwip-2.2.0/port
lwip/libcoap/include
lwip/libcoap/port
# WiFi specific
wifi_manager
wifi_manager/wpas
# FatFS specific
FatFS/port
FatFS/src
# mbedTLS specific
mbedtls/mbedtls-3.6.2/include
mbedtls/mbedtls-3.6.2/library
mbedtls/mbedtls-3.6.2/tests/include/spe
# BLE specific
ble/app
ble/profile
ble/profile/datatrans
ble/profile/dis
ble/profile/sample
ble/profile/throughput
ble/profile/bas
ble/profile/ota
# util specific
util/include
# MAIN APP
app
app/mqtt_app
# Config
config
# ROM exported headers
ROM-EXPORT/bootloader
ROM-EXPORT/halcomm
ROM-EXPORT/symbol
# BLE SDK exported headers
blesw/src/export
# MAC SW exported headers
macsw/export
macsw/import
)
- 不同模块的源文件组合
bash
# MAIN APP
file(GLOB SRC_APP_0
app/main.c
app/cmd_shell.c
app/atcmd.c
app/iperf.c
app/iperf3_main.c
app/ping.c
app/ota_demo.c
app/mqtt_cmd.c
lwip/libcoap/port/client-coap.c
lwip/libcoap/port/server-coap.c
)
# Platform specific
file(GLOB SRC_LIB_0
platform/GD32VW55x_standard_peripheral/Source/*.c
platform/riscv/gd32vw55x/system_gd32vw55x.c
platform/riscv/gd32vw55x/gd32vw55x_it.c
platform/riscv/env/handlers.c
platform/riscv/env/env_init.c
platform/riscv/env/entry.S
platform/riscv/env/start.S
platform/riscv/arch/lib/lib_hook.c
platform/src/uart/ble_uart.c
platform/src/dma/dma.c
platform/src/dsp.c
platform/src/gd32vw55x_platform.c
platform/src/init_rom.c
platform/src/uart/log_uart.c
platform/src/nvds/nvds_flash.c
platform/src/plf_assert.c
platform/src/qspi_flash/qspi_flash_api.c
platform/src/raw_flash/raw_flash_api.c
platform/src/spi_i2s/spi_i2s.c
platform/src/spi/spi.c
platform/src/time/systime.c
platform/src/uart/trace_uart.c
platform/src/trng/trng.c
platform/src/uart/uart.c
platform/src/wakelock.c
)
# util specific
file(GLOB SRC_LIB_1
util/src/*.c
)
# RTOS specific
file(GLOB SRC_LIB_2
rtos/FreeRTOS/Source/portable/Common/tickless_sleep.c
rtos/FreeRTOS/Source/croutine.c
rtos/FreeRTOS/Source/event_groups.c
rtos/FreeRTOS/Source/list.c
rtos/FreeRTOS/Source/queue.c
rtos/FreeRTOS/Source/stream_buffer.c
rtos/FreeRTOS/Source/tasks.c
rtos/FreeRTOS/Source/timers.c
rtos/FreeRTOS/Source/portable/MemMang/heap_4.c
rtos/FreeRTOS/Source/portable/riscv32/port.c
rtos/FreeRTOS/Source/portable/riscv32/portasm.S
rtos/rtos_wrapper/wrapper_freertos.c
)
# BLE specific
file(GLOB SRC_LIB_3
ble/profile/bas/ble_bass.c
ble/profile/datatrans/ble_datatrans_cli.c
ble/profile/datatrans/ble_datatrans_srv.c
ble/profile/dis/ble_diss.c
ble/profile/ota/ble_ota_cli.c
ble/profile/ota/ble_ota_srv.c
ble/profile/ble_profile_utils.c
ble/profile/throughput/ble_throughput_cli.c
ble/profile/throughput/ble_throughput_srv.c
ble/profile/sample/ble_sample_cli.c
ble/profile/sample/ble_sample_srv.c
)
# FatFS specific
file(GLOB SRC_LIB_4
FatFS/port/fatfs.c
FatFS/src/diskio.c
FatFS/src/ff.c
FatFS/src/ffsystem.c
FatFS/src/ffunicode.c
)
# LWIP specific
file(GLOB SRC_LIB_5
lwip/lwip-2.2.0/src/core/altcp_alloc.c
lwip/lwip-2.2.0/src/core/altcp_tcp.c
lwip/lwip-2.2.0/src/core/altcp_tcp.c
lwip/lwip-2.2.0/src/core/dns.c
lwip/lwip-2.2.0/src/core/def.c
lwip/lwip-2.2.0/src/core/inet_chksum.c
lwip/lwip-2.2.0/src/core/init.c
lwip/lwip-2.2.0/src/core/ip.c
lwip/lwip-2.2.0/src/core/mem.c
lwip/lwip-2.2.0/src/core/memp.c
lwip/lwip-2.2.0/src/core/netif.c
lwip/lwip-2.2.0/src/core/pbuf.c
lwip/lwip-2.2.0/src/core/raw.c
lwip/lwip-2.2.0/src/core/stats.c
lwip/lwip-2.2.0/src/core/sys.c
lwip/lwip-2.2.0/src/core/tcp_in.c
lwip/lwip-2.2.0/src/core/tcp_out.c
lwip/lwip-2.2.0/src/core/tcp.c
lwip/lwip-2.2.0/src/core/timeouts.c
lwip/lwip-2.2.0/src/core/udp.c
lwip/lwip-2.2.0/src/apps/altcp_tls/altcp_tls_mbedtls_mem.c
lwip/lwip-2.2.0/src/apps/altcp_tls/altcp_tls_mbedtls.c
lwip/lwip-2.2.0/src/apps/http/fs.c
lwip/lwip-2.2.0/src/apps/http/httpd.c
lwip/lwip-2.2.0/src/apps/lwiperf/lwiperf.c
lwip/lwip-2.2.0/src/apps/mqtt/mqtt.c
lwip/lwip-2.2.0/src/apps/mqtt/mqtt5.c
lwip/lwip-2.2.0/src/api/api_lib.c
lwip/lwip-2.2.0/src/api/api_msg.c
lwip/lwip-2.2.0/src/api/err.c
lwip/lwip-2.2.0/src/api/netbuf.c
lwip/lwip-2.2.0/src/api/netdb.c
lwip/lwip-2.2.0/src/api/netifapi.c
lwip/lwip-2.2.0/src/api/sockets.c
lwip/lwip-2.2.0/src/api/tcpip.c
lwip/lwip-2.2.0/src/core/ipv4/autoip.c
lwip/lwip-2.2.0/src/core/ipv4/dhcp.c
lwip/lwip-2.2.0/src/core/ipv4/etharp.c
lwip/lwip-2.2.0/src/core/ipv4/icmp.c
lwip/lwip-2.2.0/src/core/ipv4/igmp.c
lwip/lwip-2.2.0/src/core/ipv4/ip4_addr.c
lwip/lwip-2.2.0/src/core/ipv4/ip4_frag.c
lwip/lwip-2.2.0/src/core/ipv4/ip4.c
lwip/lwip-2.2.0/src/core/ipv6/*.c
lwip/lwip-2.2.0/port/dhcpd.c
lwip/lwip-2.2.0/port/dnsd.c
lwip/lwip-2.2.0/port/httpd_post.c
lwip/lwip-2.2.0/port/sys_arch.c
lwip/lwip-2.2.0/port/wifi_netif.c
lwip/lwip-2.2.0/src/netif/ethernet.c
lwip/lwip-2.2.0/demo/lwip_sockets_demo.c
)
# WiFi specific
file(GLOB SRC_LIB_6
wifi_manager/*.c
)
# CoAP specific
file(GLOB SRC_LIB_7 lwip/libcoap/src/*.c)
list(FILTER SRC_LIB_7 EXCLUDE REGEX ".*/(coap_io_contiki|coap_io_riot|coap_gnutls|coap_mbedtls|coap_openssl|coap_oscore|coap_proxy|coap_sha1|coap_tinydtls|coap_wolfssl)\\.c$")
# ble specific
file(GLOB SRC_LIB_8 ble/app/*.c)
list(FILTER SRC_LIB_8 EXCLUDE REGEX ".*/(atcmd_ble)\\.c$")
# mbedTLS specific
file(GLOB SRC_LIB_9
mbedtls/demo/*.c
mbedtls/mbedtls-3.6.2/library/*.c
)
target_sources(stm32cubemx INTERFACE
${SRC_APP_0}
${SRC_LIB_0}
${SRC_LIB_1}
${SRC_LIB_2}
${SRC_LIB_3}
${SRC_LIB_4}
${SRC_LIB_5}
${SRC_LIB_6}
${SRC_LIB_7}
${SRC_LIB_8}
${SRC_LIB_9}
)
- 需要静态链接的库和库所在路径,对应-l和-L参数
c
# Link directories setup, -L
target_link_directories(stm32cubemx INTERFACE
lib
platform/riscv/NMSIS/Library/DSP/GCC
)
# Add linked libraries, -l
target_link_libraries(stm32cubemx INTERFACE
ble
# ble_max
# ble_min
rftest
rf
wifi
wpas
m
nmsis_dsp_rv32imafcbp
iperf3
)
实际的文件路径
- 官方是mbl+msdk放在一个工程下面,只做msdk部分的话,有一些是可以去除的,如下图所示,基本都是从官方工程里面直接copy出来的
编译下载
- 和官方的几无区别,完美移植成功
- 后续就可以自己大刀阔斧的增删改查了
- 简单尝试了几个基本的命令,都非常成功
BLE命令尝试
- 在串口助手的终端模式下,输入图示指令,广播之后,通过手机蓝牙即可发现芯片ble,可以直接连接