为了让基于ARM架构的Linux开发板具备2.4GHz和433MHz无线通信能力,我们可以设计一款通用的扩展模块。模块通过USB-TTL芯片与上位机(PC或开发板)通信,核心控制器采用STM32单片机,并通过SPI接口外接SI4432和NRF24L01+模块。这种设计巧妙地将无线驱动的复杂性封装在模块内部,上位机仅需处理串口数据,避免了在ARM-Linux系统上移植无线驱动的繁琐工作,显著降低了开发门槛。
该模块的实物如下图所示。

使用此模块非常简单,无论是在Linux开发板还是PC上,通常只需安装或加载CH340G的USB转串口驱动,即可将其识别为一个标准的串口设备进行通信。
模块主要功能特性:
- USB转串口功能:基于CH340G芯片,方便连接电脑和嵌入式Linux开发板。
- 可独立使用的USB-TTL模块:引出了CH340G的TTL电平串口(需移除R2、R4电阻),可作为普通USB转串口工具。
- 主控MCU串口扩展:引出了STM32的UART2(TTL电平),方便用户二次开发(提供源码)。
- 板载433MHz无线通信:集成SI4432模块,通过SPI与MCU通信,支持用户编程控制。
- 2.4GHz无线模块接口:通过排针引出SPI2接口,可连接市面上常见的2.4GHz模块(如NRF24L01),支持用户编程。
- 紧凑尺寸:模块尺寸(不含USB接口)为70mm x 25mm。
硬件设计解析
模块通过USB接口获取5V供电,内部通过LDO稳压电路转换为3.3V,为单片机及外围器件供电,并设有红色电源指示灯。LDO稳压电路原理图如下。

USB转串口功能采用沁恒的CH340G芯片实现,该芯片支持3.3V或5V供电。设计时特意将其TTL引脚引出,移除特定电阻后,该部分电路可作为一个独立的USB转TTL模块使用。电路原理图如下。

主控芯片选用STM32F030C8T6,这是一款基于Cortex-M0内核的MCU,主频48MHz,拥有64KB Flash和8KB RAM,资源足以应对物联网终端设备的控制需求。MCU主控电路原理图如下。

无线通信部分,SPI1接口用于连接板载的SI4432(433MHz)模块,SPI2接口则通过排针引出,用于连接NRF24L01(2.4GHz)等模块。无线模块接口示意图如下。

以上便是核心的硬件电路设计。更详细的原理图与PCB工程文件可在项目开源仓库获取。
软件架构与实现
模块的软件基于一个轻量级的任务与事件调度器(OSAL)进行开发。这种架构非常适合资源有限的单片机系统,能清晰地将不同功能模块化为独立任务。
我们将模块的功能划分为6个任务:串口1、串口2、SI4432无线、NRF24L01无线、独立看门狗(IWDG)和LED指示灯。在 osal.h 头文件中定义各任务的ID,并创建对应的源文件,工程结构示例如下。

在 main.c 中,进行系统初始化并启动各个任务。为了灵活性,串口功能可通过宏定义(USART1_ON/USART2_ON)来开启或关闭。
#include "main.h"
void main(void)
{
systic_init(); //初始化滴答定时器
osal_timer_init(); //初始化OSAL定时器
check_sys_config(); //检测系统参数
#ifdef USART1_ON
usart1_task_init(); //串口1任务初始化
#endif
#ifdef USART2_ON
usart2_task_init(); //串口2任务初始化
#endif
nr_f2401_task_init(); //nr_f2401任务初始化
si4432_task_init(); //si4432任务初始化
led_task_init(); //LED任务初始化
while(1)
{
run_system();
}
}
串口任务实现
模块主要使用串口1(UART1)与上位机通信,并可采用DMA方式提升效率。在 usart1_task.c 中,首先进行任务注册和外设初始化,同时初始化用于数据缓冲的环形队列。

在 usart1_task.h 中定义该任务可能处理的事件类型。

所有串口相关的事件处理逻辑都集中在 usart1_task() 函数中,由OSAL调度器在相应事件发生时调用。

无线通信任务实现
SI4432与NRF24L01的任务处理框架类似,这里以SI4432为例。在 si4432_task_init() 函数中,完成芯片初始化、队列创建及信道设置。

在 si4432_task.h 中定义无线通信相关的事件。

在 si4432_task() 函数中处理各类事件。目前,模块将无线接收到的数据通过串口透传至上位机。

无线模块在收到数据后会通过外部中断引脚通知MCU。因此,需要在STM32的中断服务函数中读取数据并设置相应的事件标志。这部分涉及到MCU与外围芯片的精准协同,是嵌入式C/C++开发中的关键环节。
/*外部中断处理函数*/
void EXTI0_1_IRQHandler(void)
{
if (EXTI_GetITStatus(SI4432_EXTI_LINE) != RESET) //si4432中断
{
si4432_irq_process();
EXTI_ClearPendingBit(SI4432_EXTI_LINE);
}
}
系统监控与指示任务
看门狗(IWDG)任务用于监控系统运行状态。任务初始化看门狗外设,并定时“喂狗”。若系统异常导致喂狗停止,看门狗将触发复位。同时,也可利用此机制实现软件复位功能。

LED指示灯任务用于显示系统状态(如网络连接、数据收发)。通过设置不同的事件,可以控制LED以不同模式(常亮、闪烁、呼吸等)工作。

AT指令集支持
为了便于配置和调试,模块固件支持一套AT指令。用户可以通过串口发送AT指令来查询或设置模块的波特率、无线信道、恢复出厂设置等。开发者也可以根据需求轻松扩展指令集。AT指令处理函数示例如下。

功能测试
将编译后的固件下载到模块中,通过串口调试工具(如XCOM)可以测试AT指令功能是否正常。

使用两个模块分别连接PC,配置到相同信道,即可实现无线数据透传,验证网络/系统层的通信功能。

项目开源
本项目硬件原理图、PCB设计及完整的软件源码均已开源,遵循MIT协议,欢迎开发者下载、使用和共同改进。你可以通过以下链接访问项目仓库,参与到开源实战中来。
这个项目展示了一个典型的嵌入式物联网节点设计,从硬件选型、电路设计到基于OSAL的软件框架实现,为开发者提供了一个可复用的参考方案。如果你对嵌入式开发或物联网通信感兴趣,欢迎在云栈社区与更多开发者交流探讨。