- 操作系统
- 嵌入式
- 物联网
- 嵌入式OS
- RTOS
【免费下载链接】rt-thread
RT-Thread is an open source IoT Real-Time Operating System (RTOS). https://rt-thread.github.io/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 驱动,其中定义了三种工具链选择:
| 工具链 | 平台 | 编译器路径变量 | 说明 |
|---|---|---|---|
| gcc | gcc | EXEC_PATH = r'C:\Users\XXYYZZ' | 前缀arm-none-eabi-,CPU 为cortex-m33 |
| keil | armclang | EXEC_PATH = r'C:/Keil_v5' | 使用 ARMCLANG |
| iar | iccarm | EXEC_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 硬件连接
- 使用USB 数据线连接开发板到 PC。注意:需要下载安装串口驱动以支持CH340芯片;使用 MDK5 需要安装 SWM341 相关的 pack。USB 数据线同时承担串口通讯与供电。
- 使用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(),其执行顺序为:
bsp_clock_config():调用SystemInit()完成时钟初始化,再用SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND)配置系统节拍(默认RT_TICK_PER_SECOND 1000,即 1ms 一个 tick),并开启 SysTick 中断;SysTick_Handler中调用rt_tick_increase()驱动内核心跳。- 堆初始化:通过
rt_system_heap_init(HEAP_BEGIN, HEAP_END)建立内存堆,其中HEAP_END为 64KB SRAM 末尾(见 board.h)。 - SDRAM 可选堆:若开启
BSP_USING_SDRAM且使用RT_USING_MEMHEAP_AS_HEAP,则调用swm_sdram_init()并将 SDRAM 初始化为 memheap。 - 引脚驱动初始化
swm_pin_init()(默认开启)。 - 串口驱动初始化
swm_uart_init()(默认开启),并将控制台设备设为RT_CONSOLE_DEVICE_NAME。 - 最后调用
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 秒超时回调打印 tick | BSP_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.txt | RT_USING_DFS_ELMFAT或BSP_USING_SDIO |
dynmem_sample | 线程内循环分配/释放指数增长的内存块,验证 SDRAM memheap | BSP_USING_SDRAM |
crypto_sample | CRC32 计算与 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/
相关推荐
RT-Thread MM32F5265-OB 开发板 BSP 适配指南:Cortex-M33 国产 MCU 从编译到驱动开发
RT Thread MM32F5265 OB 开发板 BSP 适配指南:Cortex M33 国产 MCU 从编译到驱动开发 MM32F5265 OB 是灵动微
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread 在 Microchip SAME70Q21B 上的 BSP 实践:300MHz Cortex-M7 芯片特性、工程结构与构建指南
RT Thread 在 Microchip SAME70Q21B 上的 BSP 实践:300MHz Cortex M7 芯片特性、工程结构与构建指南 SAME7
操作系统嵌入式物联网嵌入式OSRTOSRT-Thread EK-RA4E2 开发板 BSP 实战:在瑞萨 RA4E2(Cortex-M33)上构建、烧录并扩展外设
RT Thread EK RA4E2 开发板 BSP 实战:在瑞萨 RA4E2(Cortex M33)上构建、烧录并扩展外设 本文以 RT Thread 仓库中
操作系统嵌入式物联网嵌入式OSRTOS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考