☰
RT-Thread 在国产 Cortex-M33 芯片上的落地实践:SYNWIT SWM341 Mini BSP 完整开发指南
2026/9/29 21:47:09 网站建设 项目流程
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

本篇技术指南以 RT-Thread 官方仓库中 bsp/synwit/swm341-mini/README.md 为骨架,系统讲解如何在华芯微特(SYNWIT)SWM341 开发板上将 RT-Thread 运行起来:从芯片资源摸底、MDK5 / env 双工具链编译,到烧写执行与串口验证,再到外设驱动的启用方式与示例代码,并结合仓库内真实源码(板级初始化、驱动层、示例程序、Kconfig 配置)给出源码级佐证。读者读完可独立完成该 BSP 的编译、烧写、运行和常用外设驱动裁剪配置。

一、BSP 概览与芯片资源

该 BSP(板级支持包)位于仓库 bsp/synwit/swm341-mini 目录,面向 SYNWIT 的 SWM341 系列开发板,是 RT-Thread 官方支持国产 MCU 的典型示例之一。其标签为:SYNWIT、Cortex-M33、SWM341、国产MCU。BSP 目录中同时提供了 MDK5 工程(project.uvprojx)、IAR 工程(project.ewp)以及基于 SCons 的编译脚本(SConstruct、SConscript),并配套了完整的板级初始化代码 board.c 与应用示例 main.c。

1.1 内核与存储

  • 内核:32 位 ARM Cortex-M33 内核,带硬件单周期乘法;工作频率最高150MHz;24 位系统定时器;集成 NVIC,最多104 个中断、8 级可配置优先级;通过 SWD 接口烧录。
  • 内置 LDO:供电电压范围 2.0V ~ 3.6V。
  • 片上 SRAM:64KB(SRAM_BASE 0x20000000、SRAM_SIZE 0x10000,见 board.h)。
  • 片上 FLASH:512KB,支持用户定制 ISP(在系统编程)更新用户程序,自带 Cache。

1.2 关键外设资源

  • SDRAMC 模块:支持 16Bit 位宽、兼容 PC133 标准的 SDRAM 颗粒,容量 2MB ~ 32MB。
  • SFC 模块:最大支持外置 16MB SPI NOR FLASH。
  • GPIO:多达 7 组共112 个 GPIO,每个 IO 均支持位带操作,中断触发可配置边沿检测/电平检测、高/低电平、上升/下降/双边沿。
  • 串行接口:4 路 UART(独立 8 字节 FIFO)、2 路 SPI(8 字节独立 FIFO,支持 SPI/SSI 协议与 Master/Slave)、2 路 I2C(7/10 位地址,Master/Slave)、2 路 CAN(协议 2.0A 11Bit 与 2.0B 29Bit 标识符)、1 路 SDIO、1 路 USB OTG。
  • TFT-LCD 驱动模块:支持 SYNC 接口与 MPU 接口外部 LCD,最高分辨率 1024×768(实际可配置),RGB565 / RGB888 格式可选。
  • PWM 控制模块:5 组 16 位 PWM 发生器,每组 4 路输出;支持新周期开始中断、高电平结束中断、刹车中断、中心对称半周期中断、死区控制,并可硬件自动触发 ADC 采样。
  • 定时器模块:5 路 32 位通用定时器、12 路 32 位基本定时器、32 位看门狗定时器(溢出后可配置触发中断或复位)。
  • RTC 模块:可自由设置日期(年、月、周、日)与时间(时、分、秒)及闹钟,自动识别闰年,支持 RTC 中断从 Sleep 模式唤醒芯片。
  • DMA 模块:4 路 DMA,支持特定外设与存储器之间或存储器与存储器之间的数据搬运。
  • 模拟外设:2 路 12 位 SAR ADC、1 路 12 位 DAC、3 路比较器、4 路运算放大器。
  • 欠压检测(BOD):支持欠压检测、欠压中断与复位选择。
  • 时钟源:20MHz/40MHz 精度达 1% 的片内时钟源、32K 片内时钟源、2~32MHz 片外晶振。

二、编译说明:MDK5 与 env 双方案

本 BSP 为开发者提供 MDK5 工程,同时也完整支持 RT-Thread 标准的 env(SCons)构建体系,两者产出的烧写镜像一致。

2.1 方案一:MDK5 图形化编译

双击 project.uvprojx 打开 MDK5 工程,直接编译并下载程序到开发板即可。

工程默认配置使用Jlink 仿真器下载程序,在通过 Jlink 连接开发板到 PC 的基础上,点击下载按钮即可将程序下载到开发板。

工程中还提供了模板工程 template.uvprojx 与 template.uvoptx,便于开发者基于干净模板二次开发。

2.2 方案二:env 工具 + scons 命令行编译

推荐熟悉 RT-Thread 的开发者使用 env 工具,在 console 下进入 BSP 目录后运行:

scons

编译正确无误后,会生成rtthread.elf与rtthread.bin两个文件,其中rtthread.bin即为可烧写到设备运行的镜像。

从源码层面看,该 BSP 的 SCons 构建配置由 rtconfig.py 驱动,其中定义了三种工具链选择:

工具链平台编译器路径变量说明
gccgccEXEC_PATH = r'C:\Users\XXYYZZ'前缀arm-none-eabi-,CPU 为cortex-m33
keilarmclangEXEC_PATH = r'C:/Keil_v5'使用 ARMCLANG
iariccarmEXEC_PATH = r'C:/Program Files (x86)/IAR Systems/...'使用 IAR EW

rtconfig.py中 GCC 工具的编译参数为:

-mcpu=cortex-m33 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections

链接时使用board/linker_scripts/link.lds链接脚本,并在编译后通过 POST_ACTION 自动调用objcopy生成rtthread.bin并打印镜像尺寸。环境变量约定:RTT_CC覆盖编译器类型、RTT_ROOT指定 RT-Thread 源码根目录、RTT_EXEC_PATH指定编译器实际安装路径。若在无 env 的纯命令行环境,可先设置这三个环境变量再执行scons。

三、烧写与执行

3.1 硬件连接

  1. 使用USB 数据线连接开发板到 PC。注意:需要下载安装串口驱动以支持CH340芯片;使用 MDK5 需要安装 SWM341 相关的 pack。USB 数据线同时承担串口通讯与供电。
  2. 使用Jlink连接开发板到 PC(需要安装 Jlink 驱动)。

将串口 0引脚[PM0/PM1]与板上 USB 转串口模块J8相连,串口配置方式为115200-N-8-1(波特率 115200、无校验、8 数据位、1 停止位)。

从驱动源码看,串口设备名在 drv_uart.c 中注册为uart0、uart1、uart2、uart3,而 BSP 默认将控制台绑定到 uart0(RT_CONSOLE_DEVICE_NAME "uart0",见 rtconfig.h),与上述接线一致。

3.2 烧写方式

  • 推荐方式:使用 Keil 软件直接下载(工程默认配置 Jlink 下载)。
  • 备选方式:使用 env 工具正确编译产生rtthread.bin后,可通过 ISP 方式烧写到设备中。建议使用 Keil 直接下载,ISP 下载较复杂。

3.3 运行结果

如果编译与烧写无误,复位设备后可以看到板载蓝色 LED 闪烁(对应 main.c 中GET_PIN(B,0)引脚以 500ms 周期翻转),串口上打印 RT-Thread 启动 logo:

\ | / - RT - Thread Operating System / | \ 4.1.1 build May 13 2022 10:16:43 2006 - 2022 Copyright by RT-Thread team msh >

出现msh >提示符即代表 RT-Thread 内核已成功运行,可输入 RT-Thread 命令交互。

3.4 板级启动流程源码解析

为什么复位后系统能"跑起来"?关键在 board.c 的rt_hw_board_init(),其执行顺序为:

  1. bsp_clock_config():调用SystemInit()完成时钟初始化,再用SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND)配置系统节拍(默认RT_TICK_PER_SECOND 1000,即 1ms 一个 tick),并开启 SysTick 中断;SysTick_Handler中调用rt_tick_increase()驱动内核心跳。
  2. 堆初始化:通过rt_system_heap_init(HEAP_BEGIN, HEAP_END)建立内存堆,其中HEAP_END为 64KB SRAM 末尾(见 board.h)。
  3. SDRAM 可选堆:若开启BSP_USING_SDRAM且使用RT_USING_MEMHEAP_AS_HEAP,则调用swm_sdram_init()并将 SDRAM 初始化为 memheap。
  4. 引脚驱动初始化swm_pin_init()(默认开启)。
  5. 串口驱动初始化swm_uart_init()(默认开启),并将控制台设备设为RT_CONSOLE_DEVICE_NAME。
  6. 最后调用rt_components_board_init()完成板级组件初始化。

四、外设支持与驱动裁剪

本 BSP 目前对外设的支持情况如下表:

片上外设支持情况备注
GPIO支持共112个
UART支持UART0/1/2/3
ADC支持ADC0/1
DAC支持DAC
CAN支持CAN0/1
TIM支持TIM0/1/2/3/4,BTIM0/1/2/3/4/5/6/7/8/9/10/11
I2C支持软件 I2C0/1
PWM支持PWM0/1/2/3/4
RTC支持RTC
SPI支持SPI0/1
WDT支持WDT
CRC/RNG支持CRC/RNG
SDIO支持SDIO
SDRAM支持SDRAM

外设驱动的注册与硬件抽象实现位于 bsp/synwit/libraries/SWM341_drivers 目录(drv_gpio.c、drv_uart.c、drv_adc.c、drv_can.c、drv_pwm.c、drv_rtc.c、drv_spi.c、drv_wdt.c、drv_sdio.c、drv_sdram.c、drv_crypto.c、drv_timer.c等),底层依赖华芯微特官方 CSL 外设库 bsp/synwit/libraries/SWM341_CSL。

4.1 外设开关:board/Kconfig 与 menuconfig

各外设的启用与否由 board/Kconfig 控制,可通过 env 工具执行menuconfig勾选。关键配置项及其引脚映射如下:

  • UART(默认开启 UART0):BSP_USING_UART0 (M0/RX, M1/TX);UART1(D4/RX, D3/TX)、UART2(C1/RX, C0/TX)、UART3(C2/RX, C3/TX)默认关闭。
  • GPIO(默认开启,自动选择RT_USING_PIN)。
  • ADC:ADC0 提供 CHN0~CHN11(引脚 C6/C5/C4/C3/C2/C1/C0/A15/A14/A13/A12/A10);ADC1 提供 CHN0~CHN6(引脚 D1/D0/C13/C12/C11/C10/C9)。
  • DAC:BSP_USING_DAC。
  • CAN:CAN0(TX/B4, RX/B5)、CAN1(TX/B2, RX/B3)。
  • TIM:TIM0~TIM4 及 BTIM0~BTIM11。
  • 软件 I2C:BSP_USING_SOFT_I2C0(默认 SCL=1、SDA=0)、BSP_USING_SOFT_I2C1(默认 SCL=37、SDA=36)。
  • PWM:PWM0~PWM4,每组含 A/AN/B/BN 四个通道(如 PWM0A(M1)、PWM0AN(M4)、PWM0B(M2)、PWM0BN(M5))。Kconfig 中特别注释:PWMA、PWMAN、PWMB、PWMBN 均为 channel0,性能相同。注意 PWM4AN(B14) 与 PWM4BN(B12) 分别占用 SWDIO 与 SWDCK,开启后会影响 SWD 调试。
  • SPI:SPI0(CS/M3, MISO/M4, MOSI/M5, CLK/M2)、SPI1(CS/B5, MISO/B3, MOSI/B4, CLK/B2)。
  • RTC:BSP_USING_RTC。
  • WDT:BSP_USING_WDT。
  • CRC/RNG:BSP_USING_CRC、BSP_USING_RNG(均选择RT_USING_HWCRYPTO)。
  • SDIO(SD 卡):BSP_USING_SDIO,自动选择 DFS 与 elmfat 文件系统。
  • SDRAM:BSP_USING_SDRAM,默认容量BSP_SDRAM_SIZE 0x800000(8MB),自动选择RT_USING_MEMHEAP_AS_HEAP,使 SDRAM 作为系统大容量堆。
  • GT9147 电容触摸:BSP_USING_GT9147(复用 swi2c0,默认 RST=39、IRQ=48),自动拉取 gt9147 软件包。
  • RGB LCD:BSP_USING_RGB_LCD,自动选择BSP_USING_SDRAM,可选BSP_USING_LVGL开启 LVGL 图形库。

当前仓库默认 rtconfig.h 仅开启了BSP_USING_UART(UART0)与BSP_USING_GPIO两项片上外设,其余外设需在 menuconfig 中按需勾选后重新编译。

4.2 内核与组件默认配置

rtconfig.h 中值得关注的默认配置包括:

  • 内核:RT_THREAD_PRIORITY_MAX 32、RT_TICK_PER_SECOND 1000、RT_USING_HOOK、软件定时器(RT_USING_TIMER_SOFT,优先级 4、栈 512)、RT_USING_OVERFLOW_CHECK。
  • IPC:信号量、互斥量、事件、邮箱、消息队列全部开启。
  • 内存管理:小内存管理算法RT_USING_SMALL_MEM、RT_USING_MEMHEAP、RT_MEMHEAP_FAST_MODE、RT_USING_MEMHEAP_AS_HEAP(为 SDRAM 堆预留)。
  • 控制台:RT_CONSOLE_DEVICE_NAME "uart0"、RT_CONSOLEBUF_SIZE 128。
  • Shell:MSH + Finsh(FINSH_THREAD_STACK_SIZE 4096、历史记录 5 行、支持命令补全)。
  • 架构:ARCH_ARM_CORTEX_M33,启用硬件原子操作(RT_USING_HW_ATOMIC、8/16 位原子)。

五、示例程序:从 LED 闪烁到外设验证

main.c 内置了大量以MSH_CMD_EXPORT导出的 msh 命令示例,编译对应外设选项后即可在串口 shell 中直接调用验证。

5.1 基础 LED 闪烁

#define LED_PIN GET_PIN(B,0) int main(void) { int count = 1; rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); while (count++) { rt_pin_write(LED_PIN, PIN_HIGH); rt_thread_mdelay(500); rt_pin_write(LED_PIN, PIN_LOW); rt_thread_mdelay(500); } return RT_EOK; }

5.2 常用验证命令一览

msh 命令功能依赖配置
pin_sample配置 KEY1(A8)下降沿中断,按下打印key1 irq!BSP_USING_GPIO
adc_vol_sample读取 adc0 通道 0 原始值与电压(参考电压 3.3V、12 位转换)BSP_USING_ADC
dac_vol_sample <value>向 dac 通道 0 写入值并打印对应电压BSP_USING_DAC
can_sample [dev]创建接收线程并以中断方式收发 CAN 帧(标准帧 ID 0x78,8 字节数据)BSP_USING_CAN
clock_timer_sample周期模式定时器,2 秒超时回调打印 tickBSP_USING_TIM
pwm_sample周期 0.5ms、脉宽 100us 输出BSP_USING_PWM
rtc_sample设置 2000-02-28 23:59:55,3 秒后读取并打印BSP_USING_RTC
wdt_sample设置 5 秒看门狗超时并启动BSP_USING_WDT
spi_w25q_sample通过rt_spi_send_then_recv()与rt_spi_transfer_message()两种方式读取 W25Q 系列 SPI Flash 的 ID(0x90 命令)BSP_USING_SPI+ SFUD
elmfat_sample在 SPI Flash / SD 卡上创建 elmfat 文件系统、挂载、读写/user/test.txtRT_USING_DFS_ELMFAT或BSP_USING_SDIO
dynmem_sample线程内循环分配/释放指数增长的内存块,验证 SDRAM memheapBSP_USING_SDRAM
crypto_sampleCRC32 计算与 20 次随机数输出BSP_USING_CRC/BSP_USING_RNG
gt9147_sample中断方式读取 GT9147 触摸点(最多 5 点)坐标信息BSP_USING_GT9147

以 SPI 示例为例,其 SPI Flash 挂载过程在rt_hw_spi_flash_init()中完成:先通过rt_hw_spi_device_attach("spi0", "spi00", GPIOM, PIN3)将设备挂到 SPI0 总线并指定片选引脚,再调用rt_sfud_flash_probe("norflash0", "spi00")探测 Flash,并通过INIT_COMPONENT_EXPORT自动初始化,体现了 RT-Thread 组件自动初始化机制的典型用法。

六、参考资料

  • 同系列 SWM320 BSP 可参考 bsp/synwit/swm320-mini/README.md,其芯片库(SWM320_CSL)与 SWM341 版本并存于仓库,便于对比移植。
  • 华芯微特驱动实现细节可查阅 bsp/synwit/libraries/SWM341_drivers 下的各drv_*.c文件,以及 bsp/synwit/libraries/注意事项.md。
  • RT-Thread 通用开发文档(内核、MSH、设备驱动框架、文件系统等)位于仓库 documentation 目录;组件源码位于 components,内核源码位于 src 与 include。
  • 芯片数据手册与更多 SWM341 细节,请以华芯微特官方技术资料为准。
  • 操作系统
  • 嵌入式
  • 物联网
  • 嵌入式OS
  • RTOS

【免费下载链接】rt-thread

RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/rt-thread/

项目地址:https://gitcode.com/gh_mirrors/rt/rt-thread
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询