找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2911

积分

0

好友

398

主题
发表于 昨天 01:16 | 查看: 1| 回复: 0

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

该模块的实物如下图所示。

ARM中控扩展模块实物图

使用此模块非常简单,无论是在Linux开发板还是PC上,通常只需安装或加载CH340G的USB转串口驱动,即可将其识别为一个标准的串口设备进行通信。

模块主要功能特性:

  1. USB转串口功能:基于CH340G芯片,方便连接电脑和嵌入式Linux开发板。
  2. 可独立使用的USB-TTL模块:引出了CH340G的TTL电平串口(需移除R2、R4电阻),可作为普通USB转串口工具。
  3. 主控MCU串口扩展:引出了STM32的UART2(TTL电平),方便用户二次开发(提供源码)。
  4. 板载433MHz无线通信:集成SI4432模块,通过SPI与MCU通信,支持用户编程控制。
  5. 2.4GHz无线模块接口:通过排针引出SPI2接口,可连接市面上常见的2.4GHz模块(如NRF24L01),支持用户编程。
  6. 紧凑尺寸:模块尺寸(不含USB接口)为70mm x 25mm。

硬件设计解析

模块通过USB接口获取5V供电,内部通过LDO稳压电路转换为3.3V,为单片机及外围器件供电,并设有红色电源指示灯。LDO稳压电路原理图如下。

LDO 3.3V稳压电路原理图

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

USB转串口(CH340G)电路原理图

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

STM32F030C8T6主控电路原理图

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

无线模块(SI4432/NRF24L01)SPI接口原理图

以上便是核心的硬件电路设计。更详细的原理图与PCB工程文件可在项目开源仓库获取。

软件架构与实现

模块的软件基于一个轻量级的任务与事件调度器(OSAL)进行开发。这种架构非常适合资源有限的单片机系统,能清晰地将不同功能模块化为独立任务。

我们将模块的功能划分为6个任务:串口1、串口2、SI4432无线、NRF24L01无线、独立看门狗(IWDG)和LED指示灯。在 osal.h 头文件中定义各任务的ID,并创建对应的源文件,工程结构示例如下。

基于OSAL的软件工程任务文件结构

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 中,首先进行任务注册和外设初始化,同时初始化用于数据缓冲的环形队列。

串口1任务初始化函数代码

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

串口1任务事件宏定义

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

串口1任务事件处理函数(部分代码)

无线通信任务实现

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

SI4432任务初始化函数代码

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

SI4432任务事件宏定义

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

SI4432任务事件处理函数(部分代码)

无线模块在收到数据后会通过外部中断引脚通知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)任务用于监控系统运行状态。任务初始化看门狗外设,并定时“喂狗”。若系统异常导致喂狗停止,看门狗将触发复位。同时,也可利用此机制实现软件复位功能。

独立看门狗(IWDG)任务处理函数

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

LED指示灯任务处理函数

AT指令集支持

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

AT指令解析处理函数代码

功能测试

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

使用串口调试工具测试AT指令

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

两个模块间无线数据透传测试

项目开源

本项目硬件原理图、PCB设计及完整的软件源码均已开源,遵循MIT协议,欢迎开发者下载、使用和共同改进。你可以通过以下链接访问项目仓库,参与到开源实战中来。

这个项目展示了一个典型的嵌入式物联网节点设计,从硬件选型、电路设计到基于OSAL的软件框架实现,为开发者提供了一个可复用的参考方案。如果你对嵌入式开发或物联网通信感兴趣,欢迎在云栈社区与更多开发者交流探讨。




上一篇:嵌入式物联网OSAL调度器实现:基于任务事件的MCU软件框架开源分享
下一篇:告别浏览器收藏失效:使用 baoyu-url-to-markdown 将网页保存为本地 Markdown 文件
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-2-7 08:57 , Processed in 0.294619 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表